2010-05-25 5 views
1

Existe-t-il un moyen de parcourir la barre de défilement horizontale d'un IFrame avec un contenu super large avec Javascript dans le cadre parent. Aussi j'ai besoin qu'il soit attaché à l'événement de la molette de la souris.Comment faire pour faire défiler la barre de défilement horizontale dans un iFrame à partir du cadre parent?

Réponse (s'il vous plaît consulter la documentation Marcel Korpel ci-dessous pour plus de détails)

var myIframe = document.getElementById("iframeWithWideContent"); 

myIframe.onload = function() { 
    var mouseWheelEvt = function (e) { 
    var event = e || window.event; 
    if(event.wheelDelta) 
     var d = 1; 
    else 
     var d = -1; 
    // the first is for Gecko, the second for Chrome/WebKit 
    var scrEl = this.parentNode || event.target.parentNode; 

    if (document.body.doScroll) 
     document.body.doScroll(event.wheelDelta>0?"left":"right"); 
    else if ((event.wheelDelta || event.detail) > 0) 
     scrEl.scrollLeft -= d*60; 
    else 
     scrEl.scrollLeft += d*60; 
    event.preventDefault(); 

    return false; 
    }; 

    if ("onmousewheel" in this.contentWindow.document) 
    this.contentWindow.document.onmousewheel = mouseWheelEvt; 
    else 
    this.contentWindow.document.body.addEventListener("DOMMouseScroll", mouseWheelEvt, true); 
}; 

Répondre

1

Il y a au moins deux choses mal avec votre exemple:

if ("iframeWithWideContent" in document.body){ 
    document.body.onmousewheel = mouseWheelEvt; 
}else{ 
    document.body.addEventListener("DOMMouseScroll", mouseWheelEvt); 
} 

Ici vous test pour iframeWithWideContent être présent dans document.body et vous comptez sur cette condition pour utiliser soit …onmousewheel ou …addEventListener. Ce sont complètement indépendants. En outre, addEventListener nécessite un argument supplémentaire.

Comme the answer vous un lien vers décrit, Firefox ne supporte pas OnMouseWheel (il est non standard de toute façon), vous devez donc détecter si cette propriété est présente ou non:

if ("onmousewheel" in document.body) 
    document.body.onmousewheel = mouseWheelEvt; 
else 
    document.body.addEventListener("DOMMouseScroll", mouseWheelEvt, true); 

Juste au cas où vous n » Je sais, c'est (plus ou moins) la bonne façon de feature detection (en fait, j'aurais dû tester si DOMMouseScroll était disponible avant de l'appliquer).

Selon this answer, contentWindow est l'objet de fenêtre iframe.

Mise à jour: J'ai fait un autre cas de test et l'ai fait fonctionner dans Firefox et Chrome (cela fonctionne probablement aussi dans d'autres navigateurs basés sur WebKit).

iframescrolling.html:

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset=utf-8> 
    <title>&lt;iframe&gt; horizontal scrolling test</title> 
    <style> 
    *  { padding: 0; margin: 0; border: 0 } 
    #large { background: #aaa; height: 5000px; width: 5000px } 
    </style> 
</head> 
<body> 
    <iframe id="iframeWithWideContent" src="iframecontent.html" width="500" height="300"></iframe> 
    <div id="large"></div> 
    <script> 
    var myIframe = document.getElementById("iframeWithWideContent"); 

    myIframe.onload = function() { 
     var mouseWheelEvt = function (e) { 
     var event = e || window.event; 

     // the first is for Gecko, the second for Chrome/WebKit; 
     var scrEl = this.parentNode || event.target.parentNode; 

     if(event.wheelDelta) 
      var d = 60; 
     else 
      var d = -60; 


     if (document.body.doScroll) 
      document.body.doScroll(event.wheelDelta>0?"left":"right"); 
     else if ((event.wheelDelta || event.detail) > 0) 
      scrEl.scrollLeft -= d; 
     else 
      scrEl.scrollLeft += d; 

     event.preventDefault(); 

     return false; 
     }; 

     if ("onmousewheel" in this.contentWindow.document) 
     this.contentWindow.document.onmousewheel = mouseWheelEvt; 
     else 
     this.contentWindow.document.body.addEventListener("DOMMouseScroll", mouseWheelEvt, true); 
    }; 
    </script> 
</body> 
</html> 

Et iframecontent.html:

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset=utf-8> 
    <title>iframe</title> 
    <style> 
    *  { padding: 0; margin: 0; border: 0 } 
    #long { background: #ccc; height: 500px; width: 5000px } 
    </style> 
</head> 
<body> 
    <div id="long">long 5000px div</div> 
</body> 
</html> 

Je ne testé cela dans Firefox 3.6.3 et Chrome 5.0.342.9, à la fois sur Linux. Pour éviter les erreurs dans Chrome (à propos de l'accès aux iframes à partir d'un domaine différent ou à l'aide d'un protocole différent), vous devez télécharger ces fichiers ou utiliser un serveur de test local (localhost).

Une note de plus: je doute fortement que cela fonctionne dans tous les (principaux) navigateurs. Au moins, il n'est pas (conforme aux normes) Opera.

Mise à jour 2: Lors d'autres tests, les directions de défilement dans Firefox et Chrome étaient opposées. J'ai ajusté mon code en conséquence, en utilisant les suggestions de Mohammad.

J'ai également testé cela dans IE 7, mais, bien que IE supporte onmousewheel événements, il ne fonctionnait pas correctement. À ce stade, je m'ennuie un peu, alors peut-être que je vais essayer d'adapter l'exemple à IE une autre fois.

+0

Marcel Korpel, vous êtes un génie! Cela fonctionne parfaitement et nous pouvons excuser Opera pour le moment:) J'ai ajouté une petite mise à jour à votre code qui corrige les directions entre les navigateurs firefox et chrome (parce que le scroll se déplace dans des directions opposées avec le même mouvement de la molette). J'ai ajouté le code mis à jour à la question. Veuillez mettre à jour votre réponse et je la marquerai comme correcte! :) – Mohammad