使用“jQuery”的jQuery插件模式;“生活”;

使用“jQuery”的jQuery插件模式;“生活”;,jquery,jquery-plugins,live,plugin-pattern,Jquery,Jquery Plugins,Live,Plugin Pattern,我写了很多关于编写面向对象的javascript代码和开发jQuery插件的文章,到目前为止都很好,我了解它们是如何工作的,我可以创建自己的插件 但是,所有的文章(即使是官方的插件创作指南)都有一个问题——这些模式都不支持“live” 让我们以这种模式为例- 将在每个jQuery匹配对象上创建新的“MyPlugin”实例 如何改变它(如果可能的话),使它在将来添加的元素上工作 谢谢我在我的插件中经常使用live with success作为自定义选项。下面是一个简单的示例,它向单击的元素添加了警

我写了很多关于编写面向对象的javascript代码和开发jQuery插件的文章,到目前为止都很好,我了解它们是如何工作的,我可以创建自己的插件

但是,所有的文章(即使是官方的插件创作指南)都有一个问题——这些模式都不支持“live”

让我们以这种模式为例-

将在每个jQuery匹配对象上创建新的“MyPlugin”实例

如何改变它(如果可能的话),使它在将来添加的元素上工作


谢谢

我在我的插件中经常使用live with success作为自定义选项。下面是一个简单的示例,它向单击的元素添加了警报:

$.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...
    });
}
不幸的是,在
每个
循环中使用live将不起作用。

我发现这是可行的(jQuery 1.5.2):

(函数($){
$.fn.clickTest=函数(){
返回此值。每个(函数(){
$('.clicker').die('click').live('click',function(){
console.log('clicked');
});
$(此)。单击(函数(){
$('body')。追加('br>');
});
});
};}(jQuery);

这些元素是如何添加的?它们可能是使用ajax添加的,我知道可以使用回调重新应用插件,但这似乎是浪费,因为将创建新对象1。您不需要包装这个
,因为它已经是jQuery了。2.您可以执行
返回此[settings.live?'live':'bind']('click',clickAlertFn)更简单的代码伟大的点@Darcy!我更改了
这个
,但是为了示例的可读性保留了冗长的if语句,但是我喜欢这样的简化,希望人们能看到你的评论。
$.fn.foo = function() {
    return $(this).each(function() {
        // code in here...
    });
}
(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);