我有很多关于编写面向对象的javascript代码和开发jQuery插件的文章,到目前为止一切都很好,我理解它们是如何工作的,我可以创建自己的插件。
但是,所有文章都存在一个问题(即使使用官方插件编写指南 - http://docs.jquery.com/Plugins/Authoring) - 这些模式都不支持“实时”。
让我们举例说明这种模式 - http://www.virgentech.com/blog/2009/10/building-object-oriented-jquery-plugin.html
$.fn.myplugin = function(options)
{
return this.each(function()
{
var element = $(this);
// Return early if this element already has a plugin instance
if (element.data('myplugin')) return;
// pass options to plugin constructor
var myplugin = new MyPlugin(this, options);
// Store plugin object in this element's data
element.data('myplugin', myplugin);
});
};
每个jQuery匹配对象都会创建一个新的“MyPlugin”实例。
如何更改它(如果它是可行的)所以它将适用于将来添加的元素?
由于
答案 0 :(得分:2)
我一直在使用我的插件成功实时作为自定义选项。这是一个简单的示例,它为单击的元素添加警报:
$.fn.clickAlert = function(settings) {
settings = $.extend({live: false}, settings);
function clickAlertFn() {
alert('Clicked!');
}
if (settings.live) {
return this.live('click', clickAlertFn);
} else {
return this.click(clickAlertFn);
}
};
// this will only work on existing `a` elements with class foo
$('a.foo').clickAlert();
// this will work on existing and future `a` elements with class bar
$('a.bar').clickAlert({live: true});
在这个例子中,任何可以正常使用$('...')的东西.live('click',...')将使用$('...')。clickAlert({live:true });
另外一件事,大多数插件设计让你做这样的事情:
$.fn.foo = function() {
return $(this).each(function() {
// code in here...
});
}
不幸的是,在each
循环中使用live不起作用。
答案 1 :(得分:1)
我觉得这很有用(jQuery 1.5.2):
(function($) {
$.fn.clickTest = function () {
return this.each(function() {
$('.clicker').die('click').live('click', function() {
console.log('clicked');
});
$(this).click(function() {
$('body').append('<a href="#" class="clicker">click here '+$(this).attr('id')+'</a><br> ');
});
});
}; }) (jQuery);