Pregunta

En ciertas condiciones, tengo una página web que se abre en un iframe. Cuando se carga en ese iframe, necesito que establezca la ubicación de la ventana en un recurso para descargar un archivo (todo esto en un intento de actualizar el script GreaseMonkey ... todo legítimo, por cierto). Lamentablemente, cuando lo hago:

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

Me sale un error que indica que la parte superior es nula. cuando se utiliza " ventana " en lugar de '' top '', firefox carga el texto de mi script en el iframe, pero GreaseMonkey no puede detectarlo como una actualización por alguna razón. ¿Hay algún otro método para configurar la ubicación de la ventana que me haya perdido de alguna manera?

Editar: los usuarios de mi script visitan la página de una empresa específica (primero). Mi script se carga en esa página usando un complemento de Firefox llamado GreaseMonkey. Mi script crea un iframe en la página visitada y carga mi página (segundo) en ese iframe. GreaseMonkey luego carga mi script en mi página, que verifica un valor en mi página para ver si el script ha sido actualizado. Si el script ha sido actualizado, necesito desplazar a mis usuarios fuera del sitio que visitaron originalmente (señalado como "primero"), y a otro (tercer) sitio (userscripts.org). Esperemos que esto aclare algo de confusión.

¿Fue útil?

Solución

Finalmente descubrí que GreaseMonkey ofrece una función "GM_OpenInTab (url)" que abre una nueva pestaña en Firefox con la URL especificada. Esto permite que mi iframe abra una nueva pestaña con la ubicación del script actualizado para que GreaseMonkey se actualice. Si bien esta no es exactamente la solución que estaba buscando, funciona a la perfección sin errores.

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

Gracias a todos por su aporte. Es posible que GreaseMonkey de alguna manera proteja los scripts para evitar ese tipo de comportamiento que podría usarse con fines maliciosos.

~ md5sum ~

Otros consejos

Las dos ubicaciones deben tener el mismo nombre de host (dominio). Es posible que desee utilizar parent en lugar de top .

Puede intentar lo siguiente (adaptado de algo que uso):

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

Trabajé varias veces con iframe y descubrí que era más seguro trabajar con el estado del documento. Pasaré un código con un ejemplo.

En este ejemplo estoy usando jQuery, pero no es necesario para la funcionalidad.

<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; Trabajó para mi en Greasemonkey.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top