jquery 1.9 live()到on()对象

时间:2013-04-23 13:25:00

标签: jquery

如何更改此功能以支持新的jquery 1.9?

$.fn.message = function (options) {
    var $obj = this;
    var customErrorMsg = 'Error occurred. Please try again or contact administrator';
    var opts = $.extend({ customErrorMsg: customErrorMsg }, options);
    handleAjaxMessages(this,opts);
    $obj.live('click',function () {
        $obj.fadeOut(500, function () {
            $obj.empty();
        });
    });
};

具体为 $ obj.live()line =>上()

1 个答案:

答案 0 :(得分:1)

通常从.live()转换为.on()相对简单;这样做的确切过程记录在API for .live()

使用.live()的语法具有一般形式$(selector).live(event, handler),这有点误导,因为它给人的印象是发生了一些模糊的奇妙事件,并且恰好知道何时将匹配元素添加到DOM中。实际上,正如大多数人所知,它实际上是将事件处理程序委托给文档。

考虑到这一点,很容易看出它如何转换为.on()的{​​{1}}的一般形式。

但是,这种转换取决于知道$(document).on(event, selector, handler)是什么。如果,如问题中的示例所示,您正在使用任意jQuery对象并在其上调用selector,那么您将如何转换为使用.live()

答案是你需要一些方法来确定.on()应该是什么。幸运的是,jQuery已经为您完成了这项工作,并将其存储在结果对象的selector属性中。

所以,采用我们的任意jQuery对象selector,而不是:

$obj

我们会改为:

$obj.live(event, handler);

$(document).on(event, $obj.selector, handler); 属性存在一些限制,主要是在链接函数以修改匹配元素集时。例如,以下代码:

selector

使用var $obj = $('#foo'); console.log($obj.selector); // #foo console.log($obj.find('a').selector); // #foo a console.log($obj.children('a').selector); // (an empty string) 正确更新选择器。但是,使用.find()不会,而是完全删除它(为什么这不会给.children() ...?)。

因此,对于“简单”的jQuery对象(即仅使用选择器构建的对象),上述方法可行。

如果您不知道选择器,那么您可能会尝试自己模拟事件委托:

#foo > a

基本上检查事件的初始目标或其任何祖先是否在$(document).on(event, function(event) { if($obj.filter($(event.target).parents().andSelf()).length) { // do your actions here } }); jQuery对象的匹配元素集合中,并且只执行任何操作(如果是这种情况)。

注意:$obj属性的存在可能在API中的某处记录,但我记不起它。