2017-04-18 4 views
1

Je suis en train d'écrire une extension de chrome pour un site Web qui est structuré comme suit:Comment ajouter des écouteurs d'événement à la fenêtre frame en utilisant JavaScript?

<html> 
<head> 
    .... 
</head> 
<frameset> 
    <frame> 
     .... 
    </frame> 
    <frameset> 
     <frame> 
      <html> 
       <head> 
       </head> 
       <body> 
        <select id="theThingIWant"></select> 
       </body> 
      </html> 
     </frame> 
     <frame> 
      .... 
     </frame> 
    </frameset> 
</frameset> 
</html> 

Je sais que l'air complètement fou, mais il a été fait depuis longtemps, et il est quelque chose que je dois utiliser à travail. J'essaie d'accéder à cet élément select, mais la seule façon dont j'ai pu le faire est d'ajouter un écouteur click à l'objet window qui vérifie le event.target pour m'assurer que le id est bien ce que je recherche.

Idéalement, je veux déclencher une fonction après un événement keydown où la clé Tab a été enfoncé, puis faites essentiellement la même chose, mais je ne semble pas être en mesure de déclencher l'auditeur, peu importe où je tente et attachez-le.

Mon événement click, qui fait ce que je veux:

window.addEventListener('click', function(e) { 
    if (e.target.id === 'selAxisViaAEHybridContent') 
     remove_content_IDs(e.target); 
}); 

Mon événement keydown, qui ne fonctionne pas (les journaux de la console ne se produisent jamais):

window.addEventListener('keydown', function(e) { 
    console.log(e); 
}); 

je peux accéder au frame que l'élément select est en utilisant document.getElementsByTagName('frameset')[1].children[0], mais la propriété .children sur cela est un tableau vide. Lorsque j'attache l'événement keydown à ce nœud, cela ne fonctionne toujours pas. Est-ce que quelqu'un a une idée de ce que je peux faire pour résoudre ce problème? En fin de compte, je veux exécuter remove_content_IDs() lorsque l'élément select est mis en évidence via la touche Tab.

Répondre

3

Pour lier keydown au sein du iframe, utilisez la propriété contentWindow de iframe.

Cela pourrait être utile.

var ifr = document.getElementsByTagName("iframe")[0]; 
var ifr_window = ifr.contentWindow; 
ifr_window.addEventListener("keydown", function(e){ 
    console.log("clicked ", e.keyCode); 
}); 
+1

C'était exactement ce que je cherchais. Tu es un vrai gentleman. –

+0

Ohh! Merci pour le compliment. :) –

+0

J'ai effectivement une question de suivi, comme cela seulement résolu mon problème: Chaque fois que je clique sur un lien dans le cadre, le DOM pour ce cadre se recharge, et il semble que peu importe les écouteurs d'événements que j'ai créés sur ce cadre lorsque la fenêtre principale chargée est perdue. Comment puis-je prévenir ou contourner cela? –