JQuery触发自定义事件会导致错误

时间:2012-10-19 10:40:12

标签: javascript javascript-events jquery eventemitter

我有一个人物对象,我基本上希望它能够发出自己的事件。 但是,如果触发事件与原型具有相同的名称,则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();

因此谋杀barry导致错误,但是如果事件类似于personDied而不是没有错误。我是否正确地触发了事件?我只是想毫无错误地杀人。

错误有时会以折叠<error>的形式返回,有时会以

的形式返回
  

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

触发器murdermurder上调用方法Person,因为您在对象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() doc:

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