Question

Dans certaines conditions, une page Web est ouverte dans un iframe. Quand il est chargé dans cette iframe, il me faut définir l'emplacement de la fenêtre sur une ressource pour télécharger un fichier (tout cela dans le but de mettre à jour un script GreaseMonkey ... tout ce qui est légitime, au fait). Malheureusement, quand je le fais:

top.location.href = "http://userscripts.org/...";

Je reçois une erreur indiquant que top est null. lors de l'utilisation de " fenêtre " au lieu de "top", firefox charge le texte de mon script dans l'iframe, mais GreaseMonkey ne parvient pas à le détecter comme une mise à jour pour une raison quelconque. Existe-t-il une autre méthode permettant de définir l'emplacement de la fenêtre que j'ai oubliée?

Modifier: les utilisateurs de mon script visitent (en premier) la page d’une entreprise spécifique. Mon script est chargé dans cette page à l'aide d'un plugin firefox appelé GreaseMonkey. Mon script crée un iframe sur la page visitée et charge ma page (seconde) dans cette iframe. GreaseMonkey charge ensuite mon script sur ma page, ce qui vérifie une valeur sur ma page pour voir si le script a été mis à jour. Si le script a été mis à jour, je dois éloigner mes utilisateurs du site qu'ils ont visité à l'origine (indiqué comme "premier") et d'un autre (troisième) site (userscripts.org). Espérons que cela dissipe une certaine confusion.

Était-ce utile?

La solution

J'ai finalement trouvé que GreaseMonkey offrait la fonction "GM_OpenInTab (url)". qui ouvre un nouvel onglet dans firefox avec l’URL spécifiée. Cela permet à mon iframe d’ouvrir un nouvel onglet avec l’emplacement du script mis à jour que GreaseMonkey doit mettre à jour. Bien que ce ne soit pas exactement la solution que je cherchais, cela fonctionne de manière transparente et sans erreur.

GM_openInTab("http://userscripts.org/...") ;

Merci à tous pour votre contribution. Il est possible que GreaseMonkey utilise des scripts pour empêcher ce type de comportement, qui pourrait être utilisé à des fins malveillantes.

~ md5sum ~

Autres conseils

Les deux emplacements doivent avoir le même nom d’hôte (domaine). Vous voudrez peut-être utiliser parent au lieu de top .

Vous pouvez essayer les solutions suivantes (adaptées de quelque chose que j'utilise):

function checkWebPage() {
    try {
        if (top != self) {
            top.location.href = "http://userscripts.org/...";
        } else {
            self.location.href = "http://userscripts.org/...";
        }
    } catch (e) {}
}

J'ai travaillé plusieurs fois avec iframe et j'ai trouvé qu'il était plus sûr de travailler avec l'état du document. Je vais passer un code avec un exemple.

Dans cet exemple, j'utilise jQuery, mais ce n'est pas nécessaire pour la fonctionnalité.

<head>
<script>
(function($) {
 $.documentCtrolState = function(d,f,t)
 {
    try{
      t=(typeof(t)=="undefined")?100:t;
      if (d.readyState=="complete") //the document has been completely loaded, successfully or unsuccessfully
         f(true);
      else
         setTimeout(function(){$.documentCtrolState.call(this,d,f,t);}, t);
    }catch(ex){
         f(false, ex);
    }
 };
})(jQuery);

$(function(){

   $myIframeRef = $(document.myIFrame);
   $myIframeRef.attr("src", "mypage.php");

   $.documentCtrolState($myIframeRef.window.document, ThenLoadIFrame, 100);

});

ThenLoadIFrame = function(state, ex)
{
   alert("State " + state);
}


</script>
</head>
<body>
<iframe src="" id="myIFrame"></iframe>
</body>

unsafeWindow.parent.location.href = url; Travaillé pour moi dans Greasemonkey.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top