I have a person object and I essentially want it to be able to emit its own events.
However if the trigger event has the same name as the prototype than Chrome prints out a rather large error. In the code sample below person.murder
triggers the murder
event which writes an error to console. (the code makes more sense).
function Person() {
}
Person.prototype.murder = function() {
$(this).trigger("murder");
}
And I invoke the trigger like this
var barry = new Person();
$(barry).on("murder", function(){
alert("I am so angry");
})
barry.murder();
So murdering barry causes an error, however if the event was something like personDied
than there is no error. Am I triggering the event correctly? I just want to murder people without error.
The error is sometimes returned as a collapsed <error>
and sometimes as
Uncaught RangeError: Maximum call stack size exceeded
The problem is that jQuery is calling the method recursively. From 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.
So you should use triggerHandler
instead of trigger
.
The trigger murder
calls the method murder
on Person
since you trigger it on the object Person
. That will again call the murder
method and so on (unending loop).
If you use jQuery's .triggerHandler()
function it will only trigger the trigger, and not call the method.
function Person() {
}
Person.prototype.murder = function() {
$(this).triggerHandler("murder");
}
var barry = new Person();
$(barry).on("murder", function(){
alert("I am so angry");
})
barry.murder();
working example:
http://jsfiddle.net/6neHC/
jQuery .triggerHandler()
doc:
http://api.jquery.com/triggerHandler/
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With