如何更改此功能以支持新的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 =>上()
答案 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中的某处记录,但我记不起它。