9

我有一个人对象,我本质上希望它能够发出自己的事件。但是,如果触发事件与原型同名,则 Chrome 会打印出相当大的错误。在下面的代码示例中, person.murder触发了murder将错误写入控制台的事件。(代码更有意义)。

function Person() {

}

Person.prototype.murder = function() {
   $(this).trigger("murder");
}

我像这样调用触发器

var barry = new Person();
$(barry).on("murder", function(){
   alert("I am so angry");
})

barry.murder();

所以谋杀巴里会导致错误,但是如果事件是这样personDied的,则没有错误。我是否正确触发了事件?我只想毫无错误地杀人。

错误有时作为折叠返回<error>,有时作为

未捕获的 RangeError:超出最大调用堆栈大小

4

2 回答 2

9

问题是 jQuery 递归调用该方法。来自http://api.jquery.com/trigger/

Note: For both plain objects and DOM objects, if a triggered event name matches the name
of a property on the object, jQuery will attempt to invoke the property as a method if no
event handler calls event.preventDefault(). If this behavior is not desired, use
.triggerHandler() instead.

所以你应该使用triggerHandler而不是trigger.

于 2012-10-19T10:53:21.423 回答
1

触发器murder调用murderon方法,Person因为您在 object 上触发它Person。这将再次调用该murder方法等等(无休止的循环)。

如果你使用 jQuery 的.triggerHandler()函数,它只会触发触发器,不会调用方法。

function Person() {

}

Person.prototype.murder = function() {
   $(this).triggerHandler("murder");
}

var barry = new Person();
$(barry).on("murder", function(){
   alert("I am so angry");
})

barry.murder();

工作示例:

http://jsfiddle.net/6neHC/

jQuery.triggerHandler()文档:

http://api.jquery.com/triggerHandler/

于 2012-10-19T11:16:04.623 回答