2009-06-10 4 views
0

J'ai un iframe dans mon HTML, et je veux être averti quand il est complètement chargé. J'ai ce testcase:Le gestionnaire d'événements pour iframe n'est pas chargé

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" > 
<head> 
<title>Test</title> 

<script language="javascript" type="text/javascript"> 
function addListener(el, type, func, capture) { 
    if (el.addEventListener){ 
     el.addEventListener(type, func, capture); 
    } else if (el.attachEvent){ 
     el.attachEvent('on'+type, func); 
    } 
} 
function addhandlers(frame) { 
    addListener(frame, "load", function(e) { onDomLoaded(e); }, true); 
} 
function onDomLoaded(e) { 
    alert("loaded"); 
} 
</script> 

</head> 
<body> 
<form action="#"> 
<input type="button" value="Add handlers" onclick="addhandlers(window.frames[0]);" /> 
</form> 

<iframe id="frm" height="300" src="test.htm" width="700"></iframe> 

</body> 
</html> 

Le fichier test.htm est juste un fichier HTML standard avec quelques liens réguliers vers des lieux. D'abord, je clique sur le bouton Ajouter des gestionnaires pour ajouter les écouteurs, puis je clique sur n'importe quel lien dans test.htm à l'intérieur de l'iFrame. Mon attente est que je reçois une alerte, mais rien ne se passe. Pourquoi, et comment le résoudre? Je suis actuellement à la recherche d'une solution qui fonctionne dans firefox et IE (mais rien ne se passe dans les deux navigateurs).

+0

** Vous ne pouvez pas accéder à un IFrame qui n'est pas dans votre domaine, période **. C'est un trou de sécurité de la taille du Texas. La plupart, sinon tous les navigateurs modernes l'empêchent en interne. Je vous suggère de lire sur XSS (cross site scripting) pour mieux le comprendre. –

Répondre

0

Une solution serait d'inclure le javascript dans les test.htm

test.htm:

function addListener(el, type, func, capture) { 
    if (el.addEventListener){ 
      el.addEventListener(type, func, capture); 
    } else if (el.attachEvent){ 
      el.attachEvent('on'+type, func); 
    } 
} 
function addhandlers(frame) { 
     addListener(frame, "load", function(e) { onDomLoaded(e); }, true); 
} 

function onDomLoaded(e) { 
    window.parent.iframeLoaded() 
} 

ParentPage.htm:

function iframeLoaded() { 
    alert('loaded'); 
} 

Notez que cela ne fonctionne que si les deux fichiers sont sur le même domaine

+0

Malheureusement, je ne peux pas changer la page test.htm dans le cadre réel, car il peut être sur un autre domaine. – Tominator

Questions connexes