Вопрос

В определенных условиях у меня есть веб-страница, которая открывается в iframe.Когда он загружается в этот iframe, мне нужно, чтобы он установил местоположение окна на ресурс для загрузки файла (все это в попытке сделать обновление для сценария GreaseMonkey...все законно, кстати).К сожалению, когда я это делаю:

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

Я получаю сообщение об ошибке, в котором указано, что значение top равно нулю.при использовании «окна» вместо «верха» Firefox загружает текст моего сценария в iframe, но GreaseMonkey по какой-то причине не может обнаружить его как обновление.Есть ли другой способ установки местоположения окна, который я как-то пропустил?

Редактировать:Пользователи моего скрипта посещают страницу конкретной компании (сначала).Мой скрипт загружается на эту страницу с помощью плагина Firefox под названием GreaseMonkey.Мой скрипт создает iframe на посещенной странице и загружает мою страницу (вторую) в этот iframe.Затем GreaseMonkey загружает мой скрипт на мою страницу, которая проверяет значение на моей странице, чтобы узнать, был ли обновлен скрипт.Если сценарий был обновлен, мне нужно перевести пользователей с сайта, который они первоначально посетили (отмеченного как «первый»), на другой (третий) сайт (userscripts.org).Надеюсь, это прояснит некоторую путаницу.

Это было полезно?

Решение

Наконец я обнаружил, что GreaseMonkey предлагает функцию «GM_OpenInTab(url)», которая открывает новую вкладку в Firefox с указанным URL-адресом.Это позволяет моему iframe открыть новую вкладку с расположением обновленного скрипта для обновления GreaseMonkey.Хотя это не совсем то решение, которое я искал, оно работает без ошибок.

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

Спасибо всем за ваш вклад.Вполне возможно, что GreaseMonkey каким-то образом помещает сценарии в песочницу, чтобы предотвратить такое поведение, которое может быть использовано в злонамеренных целях.

~md5sum~

Другие советы

Два местоположения должны иметь одинаковое имя хоста (домен). Возможно, вы захотите использовать parent вместо top .

Вы можете попробовать следующее (адаптировано из того, что я использую):

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

Я несколько раз работал с iframe и обнаружил, что безопаснее работать с состоянием документа. Я передам код с примером.

В этом примере я использую jQuery, но это необязательно для функциональности.

<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; Работал для меня в Greasemonkey.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top