2017-07-08 7 views
0

Ce problème est simplifié.Autres éléments n'écoutant pas CustomEvent

J'ai un bouton. Lorsque ce bouton est cliqué, il va envoyer l'événement personnalisé customClick. Donc, je veux d'autres éléments DOM, comme l'entrée, pour écouter ces événements personnalisés.

Mais l'entrée n'écoute pas. Seul bouton sur lequel l'événement d'envoi écouterait customClick.

Qu'est-ce que je fais mal? Comment est-ce que je peux faire l'élément d'entrée écoutent l'événement 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

Vous voulez une entrée pour répondre à un événement tiré sur un bouton? Si c'est le cas, vous avez besoin d'un parent commun pour «capturer» l'événement. Voir bouillonnement vs capture: https://stackoverflow.com/questions/4616694/what-is-event-bubbling-and-capturing –

+0

Le bouton et l'entrée sont frères et sœurs adjacents, vous avez beaucoup d'options à votre disposition. Ils n'impliquent pas tous l'entrée à l'écoute d'un événement personnalisé (c'est trop, BTW). Que fera exactement l'entrée une fois qu'un customClick est déclenché? Peu importe ce que vous voulez appeler, c'est toujours un clic, à moins bien sûr que ce CustomClick ** n'implique pas ** que l'utilisateur clique sur un élément ...? – zer00ne

Répondre

0

Avec la configuration que vous avez, vous devez dispatchEvent au input, avec:

input.dispatchEvent(newEvent); 

Cependant, gardez à l'esprit tout élément sur la page peut être sélectionnée dans l'écouteur d'événement click d'origine sur le bouton. Cela signifie que vous pouvez sélectionner tous les éléments input avec quelque chose comme `document.querySelectorAll ('input'). Cela éliminerait la nécessité d'envoyer un événement secondaire.

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" />

Une meilleure façon de gérer cela, peut-être, serait de joindre l'événement auditeur customClick à l'objet window au lieu du input spécifique. Comme ceci:

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

mais la chose est, que je ne fais pas ces éléments d'entrée. Ils sont créés dynamiquement. Cela peut aussi être une étiquette. alors devrais-je les suivre quelque part dans un tableau, puis boucler juste ce tableau et envoyer ** customButtonClick ** avec tous les éléments dans le tableau? –

+0

J'ai ajouté un autre extrait montrant comment l'événement peut être attaché à l'objet 'window', ce qui semble être mieux pour votre situation. –

+0

Donc, comme je l'ai compris, je ne peux pas écouter directement les événements personnalisés, s'ils sont séparés d'un autre élément? –