JavaScript iframe перебора - PullRequest
       18

JavaScript iframe перебора

2 голосов
/ 29 октября 2009

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

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

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

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

Ответы [ 5 ]

3 голосов
/ 29 октября 2009

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

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

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

~ md5sum ~

1 голос
/ 29 октября 2009

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

function checkWebPage() {
    try {
        if (top != self) {
            top.location.href = "http://userscripts.org/...";
        } else {
            self.location.href = "http://userscripts.org/...";
        }
    } catch (e) {}
}
1 голос
/ 29 октября 2009

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

0 голосов
/ 06 марта 2011

unsafeWindow.parent.location.href = url; Работал у меня в Greasemonkey.

0 голосов
/ 29 октября 2009

Я несколько раз работал с 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>
...