2

Je travaille sur une extension firefox et il utilise quelque chose comme ceci:Comment savoir si l'événement DOMContentLoaded provient d'iframe ou pas?

function myExt() 
{ 
    this.handleEvent = function (event) 
    { 
     switch (event.type) 
     { 
      case "DOMContentLoaded": 
      { 
       alert('fired'); 
      } 
     } 
    } 

    window.addEventListener ("DOMContentLoaded", this, false); 
} 

Mon problème est que l'alerte est exécuté plusieurs fois si la page Contenu iframes, donc ce que je cherche à faire est, en utilisant " event "sur this.handleEvent Je dois savoir si event.target référence la fenêtre supérieure ou la fenêtre iframe.

Comment est-ce que je peux faire ceci?

+2

Whaaa? Feux DOMContentloaded pour le iframe * dans la fenêtre parent *? Bizarre, je n'ai jamais entendu parler de ça –

+0

Je pense que c'est plutôt ça, ça tire sur l'iframe lui-même, puis on fait des bulles jusqu'au document qui le contient. – MatrixFrog

+0

Oui, cela a quelque chose à voir avec "événement bouillonnant" – Peter

Répondre

0

que je fais encore quelques tests mais il semble que cette fonction fait le travail:

this.isTopLevel = function(event){ 
    var doc = event.target; 
    for(var i = 0; i < gBrowser.browsers.length; i++) { 
     if(gBrowser.browsers[i].contentDocument == doc) return true; 
    } 
    return false; 
}; 
+0

Cela fonctionne bien =) – Peter

0

Ouais, iframe est bizarre dans ce feu DOMContentLoaded. Il traite le contenu comme s'il était dans sa propre «fenêtre». Avez-vous essayé d'obtenir le parent event.target ou ownerDocument?

J'ai utilisé Firebug sur un SVG chargé dans un tag <object> et je crois que ownerDocument obtient ce que vous cherchez.

0

Vous pouvez essayer de vérifier pour event.target.frameElement. Si ce n'est pas défini, c'est le document principal, mais s'il est défini, c'est un cadre. Je ne me souviens pas si c'est seulement pour les cadres, ou si c'est aussi pour les iframes.

+0

Merci cela qui ressemble à une bonne solution, je l'ai résolu en comparant le event.target avec les documents gBrowser.browsers. Cela semble fonctionner aussi bien. – Peter

0

J'utilise cet extrait pour filtrer les iframes:

var browser = gBrowser.getBrowserForDocument(event.target); 
var pageIsFrame = (event.target instanceof Ci.nsIDOMHTMLDocument && 
    event.target != browser.contentDocument); 
if (pageIsFrame) { 
    // Not interested in frames. 
    return; 
} 

Vous avez besoin des privilèges Chrome pour cela.

Dans le nouveau module sur les scripts de contenu SDK (où vous ne disposez pas des privilèges Chrome), j'utilise ceci:

if (window.frameElement) { 
    // This is an iframe. 
    //... 
} 

(Voir MDC doc here ou here).