我有一个人物对象,我基本上希望它能够发出自己的事件。
但是,如果触发事件与原型具有相同的名称,则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:超出最大调用堆栈大小
答案 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)
触发器murder
在murder
上调用方法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();
工作示例:
jQuery .triggerHandler()
doc: