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呼び出します。これにより、メソッドなどが再び呼び出されます(ループが終了しません)。murderPersonPersonmurder

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 に答える