2012-10-19 12 views
9

私は人物オブジェクトを持っています。私は基本的にそれ自身のイベントを出すことができます。 しかし、トリガーイベントの名前がプロトタイプと同じ場合、Chromeよりもかなり大きなエラーが表示されます。以下のコードサンプルでは、​​コンソールにエラーを書き込むmurderイベントがトリガーされます(person.murder)。 (コードはより意味があります)。JQueryがカスタムイベントをトリガーするとエラーが発生する

function Person() { 

} 

Person.prototype.murder = function() { 
    $(this).trigger("murder"); 
} 

そして、私はそうバリーは誤りがないよりも、イベントがpersonDiedのようなものだったがあれば、エラーが発生し殺害し、この

var barry = new Person(); 
$(barry).on("murder", function(){ 
    alert("I am so angry"); 
}) 

barry.murder(); 

のようにトリガーを起動します。イベントを正しくトリガーしていますか?私はちょうど間違いなく人々を殺したい。

エラーが時々崩壊<error>として返され、時には

Uncaught RangeError: Maximum call stack size exceeded

+4

+1 – st3inn

答えて

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. 

だから、triggerの代わりにtriggerHandlerを使用する必要があります。

+0

これは面白い!私はエラーから再帰的なものを推測しましたが、それは設計上のものであるという考えはありませんでした! triggerHandlerは処理を行います。良いですね – JonWells

1

あなたがオブジェクトPersonにそれをトリガーするのでPerson上のメソッドを呼び出しますmurdermurderトリガー。これは再び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/

関連する問題