0

如何更改这样的功能以支持新的 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 => on()

4

1 回答 1

1

一般从.live()to转换.on()比较简单;这样做的确切过程记录.live().

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

考虑到这一点,很容易看出它是如何转换为.on()of:的一般形式的$(document).on(event, selector, handler)

但是,这种转换取决于知道是什么selector。如果像问题中的示例一样,您使用任意 jQuery 对象并调用.live()它,您将如何转换为 using .on()

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

因此,使用我们的任意 jQuery 对象$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()不会,而是完全删除它(为什么不给#foo > a...?)。

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

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

$(document).on(event, function(event) {
    if($obj.filter($(event.target).parents().andSelf()).length) {
        // do your actions here
    }
});

这实质上检查事件的初始目标或其任何祖先是否在您的$objjQuery 对象的匹配元素集中,并且仅在这种情况下执行任何操作。

注意:该selector属性的存在可能记录在 API 中的某处,但我不记得曾经见过它。

于 2013-04-23T15:06:13.250 回答