2016-04-01 17 views
0

JavaScriptで、イベントがトリガーされ、対応するコールバックがJavaScriptエンジンイベントループのメッセージキューに追加された場合。それは、JavaScriptコードを介してキューから削除することは可能ですか?イベントループ内のキューに入れられたJavaScriptメッセージの削除

イベントは頻繁に呼び出されるため、JavaScriptコードが実行される前にイベントキューに追加される可能性があります。 removeEventListenerが実際にメッセージキューを通過し、対応するイベントを削除するという記述はありませんでした。 removeEventListenerが実際にそれを行い、そのような関数がすべてのjavascriptエンジンで同じ方法で実装されているかどうかを再確認したい。

+0

?_確かに、[にremoveEventListener](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener) – hindmost

+0

これをやりたいユースケースを教えてもらえますか? –

+0

コールバックが2回呼び出されるのを防ぐには、コールバックにフラグを追加してコールがすでに呼び出されているかどうかをチェックできますが、それを正しく実行する方法が他にあるかどうかを知りたい場合があります。 – Gooly

答えて

0

標準のJavascriptではイベントキューに直接アクセスできません。イベントを聴くことができます(多くの場合、.addEventListener()またはコールバックを登録して、そのターンにイベントが発生し、コールバックが呼び出される)か、または一部のリスナーを.removeEventListener()で削除するか、特定の操作を取り消すことができます(clearTimeout() )、しかし、イベントキューの管理に直接アクセスすることはできません。

これを行うためには、どうやらネイティブコードをVM内部に持たなければならないでしょうし、それを行う方法は非標準で、特定のJavascript VM

コールバックが2回以上呼び出されないようにしたい場合は、少しスタブを作成してください。

function callOnce(fn) { 
    var called = false; 
    return function() { 
     if (!called) { 
      called = true; 
      return fn.apply(this, arguments); 
     } 
    } 
} 


// create a callOnce function stub for myFunction 
var cb = callOnce(myFunction); 

obj1.addEventListener("click", cb); 
obj2.addEventListener("click", cb); 
obj3.addEventListener("click", cb); 

myFunctionは、最初のイベントが呼び出すたびに1度だけ呼び出されます。その後、cbが定義されたときに作成されたcallOnceスタブによってブロックされます。

+0

removeEventListenerを実行すると、対応するメッセージがキューに入れられますか?それとも、それは将来のイベントトリガーを防ぐだけですか? – Gooly

+0

@Gooly - それは個々のJVMの実装までであり、率直に言っても、それは何も変わっていないので重要ではないので、外部から伝える方法はありません。理論的な質問をするのではなく、あなたが本当に解決しようとしている問題を教えてください。 – jfriend00

+0

@Gooly - 別のコメントで、コールバックが2回呼び出されないように言及しました。コールバックが2回呼び出されるのを防ぐコールバック・スタブを非常に簡単に作成することができます。そして、単一のコールバックを登録するときは、 'obj.addEventListener(" eventname "、callOnce(myFunc))'とcallOnceラッパーがそれを処理します。 – jfriend00

0

はい。オブジェクトからイベントをバインド解除することが可能です。

  • あなたはそれを削除するremoveEventListenerを使用し、イベントを添付するaddEventListenerを使用している場合。

  • jQuery .bind()を使用している場合は、.unbind()を使用して削除してください。

  • jQuery .on()を使用している場合は、.off()を使用して削除してください。

  • attachEventを使用する場合は、detachEvent()を使用できます。

  • onclickなどの機能を使用する場合は、nullに設定するだけで削除できます。

    ex。 obj.onclick = null。それは可能キューから削除する_Is

+0

もう少し説明を追加しました。イベントが既に発生しているケースを検討しています。あなたが与えた例がまだ機能しているのかなと思います。 – Gooly

+0

問題はオブジェクトからのイベントをアンバインドする方法(jQueryが私たちに与えた不幸な表現)ではなく、**すでにトリガされたイベント**を管理する方法であり、実行を待っています。 –

関連する問題