JQuery, запускающий пользовательское событие, вызывает ошибку

У меня есть объект person, и я, по сути, хочу, чтобы он мог генерировать свои собственные события. Однако, если событие триггера имеет то же имя, что и прототип, 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>, а иногда в виде

Uncaught RangeError: превышен максимальный размер стека вызовов


person Jon Wells    schedule 19.10.2012    source источник
comment
+1, потому что я просто хочу убивать людей без ошибок.   -  person st3inn    schedule 19.10.2012


Ответы (2)


Проблема в том, что 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.

person Chango    schedule 19.10.2012
comment
Это интересно! Я догадался о рекурсии по ошибке, но понятия не имел, что это было задумано! triggerHandler отлично работает. Хороший - person Jon Wells; 19.10.2012

Триггер 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();

рабочий пример:

http://jsfiddle.net/6neHC/

jQuery .triggerHandler() документ:

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

person gitaarik    schedule 19.10.2012