Перебор iframe в JavaScript
-
22-07-2019 - |
Вопрос
В определенных условиях у меня есть веб-страница, которая открывается в 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.