2017-05-05 3 views
2

テスト中:`クリック()`クリックイベントハンドラ

var btn = document.querySelector('button') 
 
btn.addEventListener('click', log) 
 

 
function log(event) { 
 
    var p = document.createElement('p') 
 
    p.textContent = event.type 
 
    document.body.appendChild(p) 
 
    fire() 
 
} 
 

 
function fire() { 
 
    btn.click() 
 
}
<button type="button">Click me</button>

私は、例外がスローされますと思います。 Clickイベントハンドラのclick()はclickイベントを送出し、clickイベントハンドラはclick()を再度呼び出し、clickイベントを再度送出します。しかし、結果は私が思ったのと同じではなく、2つの「クリック」(IE出力の「クリック」)を出力するだけです。

fire関数を変更して、クリックイベントを作成して送出すると、結果は期待通りです。

var btn = document.querySelector('button') 
 
    btn.addEventListener('click', log) 
 

 
    function log(event) { 
 
    var p = document.createElement('p') 
 
    p.textContent = event.type 
 
    document.body.appendChild(p) 
 
    fire() 
 
    } 
 

 
    function fire() { 
 
    var event = new MouseEvent('click') 
 
    btn.dispatchEvent(event) 
 
    }
<button type="button">Click me</button>

click()は異なった動作を、なぜ私の質問はありますか?

Notice:jQueryは使用されていません.jQueryメソッド.click()とは関係ありません。

答えて

-1

.click()あなたの.click()に関連付けられたアクション(次のリンクのような)は、clickイベントを起動しません。log関数が再度呼び出されるため、繰り返しのクリックイベントは実行されません。

第2バージョンでは、常にclickイベントをトリガーするので、log関数は無限に実行されます。

+0

もう少し説明できますか?なぜログが再度呼び出されないのですか? – Rajesh

+0

@Rajesh 'クリック'イベントは実行されません - 'log'関数は実行されません – Justinas

+1

@Justinasなぜ' log'と 'fire'が2回呼び出されますか?あなたによると、 'log'は一度呼び出されたはずです。しかしconsole.logは2つの実行を示しています:https://jsfiddle.net/wostex/82d39L4n/1/ – wostex

1

dispatchEventは、イベントをターゲットに同期して送信するため、dispatchEventを使用すると、イベントハンドラフレームがスタックに蓄積し、最終的にオーバーフローします。したがって、無限印刷clickとスタック(コンソール例外)を埋める。 documentation

ただし、.click()を使用するとJavaScriptで制御されたイベントが発生します。連続同期呼び出しの代わりに1つのイベント、すなわちclickをシミュレートします。詳細については、documentationを参照してください。

+0

まあ、jQueryはここでは使用されません。 –

+0

の関連情報'JavaScript'と' JQuery'の両方のメソッド( 'click()'も同じように動作します)。更新された回答を参照してください。 –

関連する問題