Я не уверен на 100% относительно контекста каждой из ссылок «this» и того, ссылаются ли они на «this», неявное при вызове локальной функции, или на «this» во вмещающей функции, но это, вероятно, связано с объяснением.
В любом случае, в вашем коде есть небольшой недостаток, который проявится только в том случае, если один из вас назначит linkClass элементу, который не является «a». Чтобы это исправить, выполните проверку на наличие «a» внутри цикла, поскольку метод «is» вернет true, если какой-либо из элементов в коллекции jquery соответствует критериям, и, когда это будет сделано вне цикла, вызовет все элементы, к которым привязан обработчик кликов, независимо от того, являются они «а» или нет ...
$.fn.jquery_plugin = function(options) {
this.each(function() {
if ($(this).is('a' ) ) {
$(this).bind('click', function(){
options.content = options.content || $(this).attr('href');
return javascript_plugin (options), false;
})
})
}
return this;
};
javascript_plugin = function (options) {
return alert(options.content);
};
В качестве альтернативы, просто включите 'a' в селектор, используемый при вызове вашего плагина ...
$(function() {
$('a.link_class').jquery_plugin()
})
... и удалите необходимость проверки 'a' в плагине ...
$.fn.jquery_plugin = function(options) {
this.each(function() {
$(this).bind('click', function(){
options.content = options.content || $(this).attr('href');
return javascript_plugin (options), false;
})
}
return this;
};
Большой вопрос для меня: относится ли последнее «this» к элементу DOM, по которому щелкают, или к элементу текущей итерации цикла «each». Это должно быть первое.
EDIT:
Теперь я вижу проблему - тот факт, что 'options' устанавливается на значение href элемента, только если он в данный момент пуст. После этого он остается один и сохраняет ранее установленное значение. Попробуйте вместо этого создать локальную переменную ...
$.fn.jquery_plugin = function(defaultOptions) {
this.each(function() {
$(this).bind('click', function(){
var options = createAnOptionsInstance(); //do what it says
options.content = defaultOptions.content || $(this).attr('href');
return javascript_plugin (options), false;
})
}
return this;
};
Ваш исходный код не показывает какую-либо опцию, передаваемую плагину, поэтому вам, вероятно, понадобятся некоторые дополнительные проверки для этого.