Javascript 关于「;这";在jQuery对象中
在这样的代码中:Javascript 关于「;这";在jQuery对象中,javascript,jquery,this,jquery-events,Javascript,Jquery,This,Jquery Events,在这样的代码中: var test = function (e,name) { this.e = e; this.name = name; this.init(); }; test.prototype.init = function () { var $e = $(this.e); var _this = this; $e.click(function () {
var test = function (e,name) {
this.e = e;
this.name = name;
this.init();
};
test.prototype.init = function () {
var $e = $(this.e);
var _this = this;
$e.click(function () {
alert(_this.name);
//show the current name
});
$('#AA').click(function () {
alert(_this.name);
//show all the name
})
};
new test($("#A"),"A");
new test($("#B"),"B");
为什么单击“$e”只显示当前名称,
而单击“$('#AA')”
将显示所有名称
因为
#AA
的点击处理程序被附加了两次
new test($("#A"),"A");
new test($("#B"),"B");
调用test
构造函数两次,一次用于\A
,一次用于\B
init
被调用两次,所以
$('#AA').click(function () {
alert(_this.name);
//show all the name
})
也将运行两次
在高级事件处理模型中(
addEventListener
,jQuery当然也使用它),事件处理程序不会相互替换(就像旧的onclick
和friends),而是相加。因此,如果将同一事件处理程序添加到一个元素5次,那么当事件触发时,它将运行5次。因为#AA
的单击处理程序被附加了两次
new test($("#A"),"A");
new test($("#B"),"B");
调用test
构造函数两次,一次用于\A
,一次用于\B
init
被调用两次,所以
$('#AA').click(function () {
alert(_this.name);
//show all the name
})
也将运行两次
在高级事件处理模型中(
addEventListener
,jQuery当然也使用它),事件处理程序不会相互替换(就像旧的onclick
和friends),而是相加。因此,如果将同一事件处理程序添加到元素5次,则当事件触发时,它将运行5次。发生这种情况是因为您调用:
$('#AA').click(function () {
alert(_this.name);
//show all the name
})
用于#A
和#B
调用时:newtest($(“#A”),“A”)
调用方法init
,该方法将导致click回调的附件,因此当您单击#AA
时,将发出警报
然后调用:newtest($(“#B”),“B”)代码>。这导致使用不同的值调用init
。另一个单击处理程序附加到#AA
,因此当您单击元素时,会收到两个警报。这是因为您调用:
$('#AA').click(function () {
alert(_this.name);
//show all the name
})
用于#A
和#B
调用时:newtest($(“#A”),“A”)
调用方法init
,该方法将导致click回调的附件,因此当您单击#AA
时,将发出警报
然后调用:newtest($(“#B”),“B”)代码>。这导致使用不同的值调用init
。另一个单击处理程序附加到#AA
,因此当您单击元素时,您会收到两个警报。@kapa和@Minko是正确的
一种快速解决方法是使用unbind()
,以避免添加两次处理程序:
$('#AA').unbind("click").click(function () {
alert(_this.name);
//show all the name
})
将删除以前添加的单击处理程序。因此,我们正在确保添加一次
编辑:在严重的应用程序中,使用off()
而不是unbind()
。请参见文档中的关闭
@kapa和@Minko是正确的
一种快速解决方法是使用unbind()
,以避免添加两次处理程序:
$('#AA').unbind("click").click(function () {
alert(_this.name);
//show all the name
})
将删除以前添加的单击处理程序。因此,我们正在确保添加一次
编辑:在严重的应用程序中,使用off()
而不是unbind()
。请参见文档中的off
看起来像Jquery对我来说就像Jquery对我一样小心,因为调用unbind()
会从所有事件类型的元素中删除每个事件处理程序。在大多数情况下,这不是一个好主意,因为插件或代码的其他部分可以将事件处理程序附加到同一元素,这样它们就会被销毁。正确的解决办法是使用。顺便说一句,从1.7开始,首选off()
,而不是unbind()
。我已经编辑并配置了它,以删除单击处理程序。关于off()
,您是对的。我仍然建议使用名称空间,因为问题仍然存在,即使现在只适用于单击
处理程序。如果您只需从元素中删除每个单击
处理程序,就会出现神秘的、难以追踪的bug。当然不是在20行JSFIDLE中,而是在一个包含多个组件的项目中,所有组件都附加了自己的处理程序。我同意。我在回答中添加了建议,重点是名称空间unbind()
支持名称空间,基本上unbind()
与off()
相同(如果不考虑事件委派)。无论如何,现在可以在注释中找到所有重要的细节:)。但是要小心,因为调用unbind()
会从所有事件类型的元素中删除每个事件处理程序。在大多数情况下,这不是一个好主意,因为插件或代码的其他部分可以将事件处理程序附加到同一元素,这样它们就会被销毁。正确的解决办法是使用。顺便说一句,从1.7开始,首选off()
,而不是unbind()
。我已经编辑并配置了它,以删除单击处理程序。关于off()
,您是对的。我仍然建议使用名称空间,因为问题仍然存在,即使现在只适用于单击
处理程序。如果您只需从元素中删除每个单击
处理程序,就会出现神秘的、难以追踪的bug。当然不是在20行JSFIDLE中,而是在一个包含多个组件的项目中,所有组件都附加了自己的处理程序。我同意。我在回答中添加了建议,重点是名称空间unbind()
支持名称空间,基本上unbind()
与off()
相同(如果不考虑事件委派)。不管怎样,现在你可以在评论中找到所有重要的细节:)。