JavaScript iframe rebentando
-
22-07-2019 - |
Pergunta
Em certas condições, eu tenho uma página web que se abriu em um iframe. Quando ele é carregado para que iframe, eu preciso dele para definir o local janela para um recurso para baixar um arquivo (tudo isso em uma tentativa de fazer uma atualização para um script GreaseMonkey ... tudo legítimo, btw). Infelizmente, quando eu faço:
top.location.href = "http://userscripts.org/...";
Eu recebo um erro dizendo que topo é nulo. quando se usa "janela" no lugar de "top", firefox carrega meu texto script no iframe, mas GreaseMonkey é incapaz de detectá-lo como uma atualização por algum motivo. Existe um outro método para definição da localização da janela que eu perdi de alguma forma?
Edit: Os usuários do meu script de visitar a página de um negócio específico (primeiro). Meu script é carregado para essa página usando um firefox plugin chamado GreaseMonkey. Meu script cria um iframe na página visitada, e carrega minha página (segundo) em que iframe. GreaseMonkey então carrega o meu script em minha página, que verifica um valor na minha página para ver se o script foi atualizado. Se o script foi atualizado, eu preciso navegar meus usuários para longe do local que originalmente visitou (anotado como "primeiro"), e para outro (terceiro) local (userscripts.org). Esperemos que este apura-se alguma confusão.
Solução
Eu finalmente encontrei que GreaseMonkey oferece uma função de "GM_OpenInTab (url)", que abre uma nova guia no firefox com a URL especificada. Isso permite que o meu iframe para abrir uma nova guia com a localização do script atualizado para GreaseMonkey a atualização. Enquanto isso não é exatamente a solução que eu estava procurando, ele funciona perfeitamente sem erros.
GM_openInTab("http://userscripts.org/...") ;
Obrigado a todos por sua entrada. É possível que GreaseMonkey alguma forma scripts de caixas de areia para evitar esse tipo de comportamento que poderiam ser usados ??para fins maliciosos.
~ md5sum ~
Outras dicas
Os dois locais devem ter o mesmo nome de host (domínio). Você pode querer estar usando parent
vez de top
.
Você pode tentar o seguinte (adaptado do uso algo I):
function checkWebPage() {
try {
if (top != self) {
top.location.href = "http://userscripts.org/...";
} else {
self.location.href = "http://userscripts.org/...";
}
} catch (e) {}
}
Eu trabalhei várias vezes com iframe, e eu achei que era mais seguro para o trabalho com o estado do documento. I vai passar um código com um exemplo.
Neste exemplo eu estou usando jQuery, mas não é necessário para a funcionalidade.
<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; Trabalhou para o meu em Greasemonkey.