2017-07-08 3 views
0

これは私が直面している単純な問題です。他の要素はCustomEventを聞いていません

ボタンがあります。このボタンをクリックすると、カスタムイベントcustomClickが送出されます。ですから、他のDOM要素(inputなど)がこのカスタムイベントをリッスンするようにします。

しかし、入力は聞きません。イベントを送出するボタンだけがcustomClickを聞いていました。

私は間違っていますか?入力要素をcustomClickイベントに聞くにはどうしたらいいですか?あなたが持っている設定で


 
var button = document.getElementById('customClick'); 
 
button.addEventListener('click', function(e){ 
 
    var clickedButton = e.currentTarget; 
 
    var newEvent = new CustomEvent("customClick"); 
 
    
 
    //console.log(newEvent); 
 
    clickedButton.dispatchEvent(newEvent); 
 
}) 
 

 

 
button.addEventListener('customClick', function(e){ 
 

 
    alert('button listening customClick'); 
 
}) 
 

 

 
var input = document.getElementById('input'); 
 
    input.addEventListener('customClick', function(e){ 
 

 
    alert('input listening customClick'); 
 
}) 
 
<button id="customClick">custom click</button> 
 
<input id="input" type="text" />

+1

あなたは、入力がボタンの上に発射イベントに応答したいですか?その場合は、イベントを「取得」するために共通の親が必要です。バブリングとキャプチャを参照してください。https://stackoverflow.com/questions/4616694/what-is-event-bubbling-and-capturing –

+0

ボタンと入力は隣接する兄弟であり、利用できるオプションは多数あります。彼らはすべて、カスタムイベント(魔女は過労、BTW)を聞いている入力を伴わない。 customClickが実行されたら、入力は正確に何を行いますか?このcustomClick **は、ユーザーが要素をクリックすることを伴わない限り、何を呼び出したいかにかかわらず、それはまだクリックです...? – zer00ne

答えて

0

、あなたが、inputdispatchEventに必要になります。しかし、心に留めておくページ上の任意の要素を選択することができ

input.dispatchEvent(newEvent); 

ボタン内の元のclickイベントリスナー内。つまり、すべてのinput要素を `document.querySelectorAll( 'input')のようなもので選択できます。これにより、セカンダリイベントのディスパッチが不要になります。

var button = document.getElementById('customClick'); 
 
var input = document.getElementById('input'); 
 
var newEvent = new CustomEvent("customClick"); 
 

 
button.addEventListener('click', function(e) { 
 
    var clickedButton = e.currentTarget; 
 

 
    clickedButton.dispatchEvent(newEvent); 
 
    input.dispatchEvent(newEvent); 
 
}) 
 

 
button.addEventListener('customClick', function(e) { 
 
    alert('button listening customClick'); 
 
}) 
 

 
input.addEventListener('customClick', function(e) { 
 
    alert('input listening customClick'); 
 
})
<button id="customClick">custom click</button> 
 
<input id="input" type="text" />

これを処理するためのより良い方法、おそらく、代わりに特定の inputwindow対象に customClickリスナーイベントを添付することです。このように:

var button = document.getElementById('customClick'); 
 
var input = document.getElementById('input'); 
 
var newEvent = new CustomEvent("customButtonClick"); 
 

 
button.addEventListener('click', function(e) { 
 
    var clickedButton = e.currentTarget; 
 

 
    window.dispatchEvent(newEvent); 
 

 
    // Any element on the page can be accessed in here. For example, 
 
    // document.querySelectorAll('input') would select all `input` 
 
    // elements. 
 
}) 
 

 

 
window.addEventListener('customButtonClick', function(e) { 
 
    alert('button listening customClick'); 
 
    
 
    // and access the input using `document.getElementById('input') 
 
    // in here. However, you could just access the `input` within 
 
    // the original button `click` event. 
 
})
<button id="customClick">custom click</button> 
 
<input id="input" type="text" />

+0

でも、私はこれらの入力要素はありません。それらは動的に作成されます。それはラベルタグでもあります。配列内のどこかでそれらを追跡して、この配列をループして配列内のすべてのアイテムを持つ** customButtonClick **をディスパッチする必要がありますか? –

+0

私はイベントが 'window'オブジェクトにどのようにアタッチできるかを示すスニペットを追加しました。 –

+0

他の要素からダイパーしている場合、カスタムイベントを直接聞くことができません。 –

関連する問題