[英]re: jQuery; binding global ajax events to non-DOM objects
这里的基本模块问题:如果我放弃我的模块模式,我可以让全局处理程序正常工作,但是这个测试代码不起作用,我很难弄清楚原因:
var MyModule = (function($, my) {
$(my).ajaxStart(function() { window.alert("ajax start"); });
$(document).ready(function() {
$.ajax(SOME_AJAX_SETTINGS_HERE);
});
return my;
}(jQuery, MyModule || {}));
附加到MyModule
实例的处理程序在执行ajax调用时永远不会运行。 如果我将处理程序附加到$(document)
它工作得很好,但我很好奇为什么全局事件似乎没有正确绑定到模块对象。
编辑:这是一个更简单的例子:
var x = {};
$(x).ajaxStart(function() { window.alert("foo"); } );
$.ajax(SOME_AJAX_SETTINGS);
如果我用$(document)
替换$(x)
,它可以工作......我似乎无法将ajaxStart
(或其他全局ajax事件)绑定到非DOM对象?
@Nucleon,这对我来说似乎不完全正确,这是一个原因的例子:
var item = {foo: function() { window.alert("shorthand"); } };
$(item).bind("foo", function () { window.alert("longhand"); } );
window.alert("about to trigger (locally)");
$(item).trigger("foo");
window.alert("now we triggerHandler (locally)");
$(item).triggerHandler("foo");
在这里,(自定义)事件“foo”通过两种模式绑定,不同的触发方法显示模式特异性...您将获得两次“手动”警报和“速记”警报一次。
现在,您还可以使用$.event.trigger("foo")
触发全局事件(但是,不存在等效的全局triggerHandler
)。 问题是如果您将此代码添加到最后:
window.alert("now we trigger (globally)");
$.event.trigger("foo");
这个全局事件触发都没有运行处理程序。
但是,如果您使用某些DOM类型元素替换item
- 如上所述 - 那么本地AND全局事件都会被处理,但需要注意“速记”处理程序现在不起作用*。 所以看起来虽然本地处理适用于非DOM对象,但它特别是全局处理不起作用。
-m
*速记处理程序停止工作,因为速记模式仅适用于非DOM对象。 我个人认为应该从jQuery中删除非DOM对象的这种“速记”行为。 很少有人知道它,它只记录在全局jQuery对象页面上的一个晦涩的句子中...它的行为可以驱使那些不知道它疯狂的人,因为它隐含地做了一个人们可能不知道的绑定步骤的。
啊,好吧...... $.event.trigger
功能不公开,虽然底层的事件触发机制使用它。 我想我不应该使用它。 事实证明,这种行为对于jQuery开发人员正确实现一直存在挑战,而且看起来他们完全放弃了它(或者我从这个错误报告中收集的内容被标记为“已修复”: 弃用AJAX“全局”事件行为 )。
但我仍然有点困惑.trigger
被记录为对DOM或非DOM对象的行为方式相同,因为只运行以下警报之一:
var plain = {foo: function() { window.alert("plain"); } };
var dom = $("<div></div>");
dom.foo = function() { window.alert("dom"); };
console.log(plain.foo); // make sure we see function foo on the plain object.
console.log(dom.foo); // now make sure we see function foo on the DOM object.
$(plain).trigger("foo"); // raises the "plain" window alert.
$(dom).trigger("foo"); // raises no alert.
我想这意味着在dom
上设置的foo
属性实际上并不是传统意义上的“正确”JS属性(尽管在检查控制台上的对象时它显示正确)?
注意:现在这都是为了知识 - 因为我只是在上面的bug链接中接受“修复”的建议,并将我的所有AJAX(和其他全局)事件附加到document
,因为它看起来像将成为jQuery 1.9中的强制行为。 但是我已经服用了蓝色药丸,觉得我在兔子洞的距离太远,无法爬回来。
只需更换
var x = {};
同
var x = $("<div></div>");
Javascript事件需要绑定到有效的DOM对象(而不仅仅是javascript对象)。 现在,不需要将DOM对象实际附加到任何地方。 Javascript的事件系统基于可用和相关DOM对象的层次链上下的冒泡事件。 一个简单的{}
不符合条件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.