Ошибка пользовательского скрипта Chrome: "Небезопасная попытка JavaScript получить доступ к фрейму"
// the iframe of the div I need to access
var iframe = document.getElementsByTagName("iframe")[2];
var innerDoc = iframe.contentDocument || iframe.contentWindow.document;
// resize 'player' in the iframe
innerDoc.getElementById('player').width = "1000px";
innerDoc.getElementById('player').height = "650px";
Запущен пользовательский скрипт для этого URL: http://www.free-tv-video-online.me/player/sockshare.php?id=24DA6EAA2561FD60
Почему Chrome выходит с этой ошибкой и завершает работу сценария?:
Unsafe JavaScript attempt to access frame with URL http://www.sockshare.com/embed/24DA6EAA2561FD60
from frame with URL http://www.free-tv-video-online.me/player/sockshare.php?id=24DA6EAA2561FD60.
Domains, protocols and ports must match.
(Я только основной пользователь Javascript)
Итоговый код, большое спасибо ответчику:
// ==UserScript==
// @name Resize
// @include http://www.free-tv-video-online.me/player/sockshare.php*
// @include http://www.sockshare.com/*
// ==/UserScript==
if (!(window.top === window.self)) {
var player = document.getElementById('player');
setSize(player);
}
function setSize(player) {
player.style.setProperty("width", "1000px");
player.style.setProperty("height", "650px");
}
2 ответа
Это правда, что обычный javascript не может получить доступ к контенту iframe, который находится в другом домене, из соображений безопасности. Однако это никоим образом не останавливает пользовательские скрипты в Chrome, Tampermonkey или Greasemonkey.
Вы можете обрабатывать содержимое iframed в скрипте пользователя, потому что Chrome (и Firefox) обрабатывают страницы iframe так же, как если бы они были главной страницей. Учитывая это, создание сценариев для таких страниц совсем несложно.
Например, предположим, что у вас есть эта страница на domain_A.com:
<html>
<body>
<iframe src="http://domain_B.com/SomePage.htm"></iframe>
</body>
</html>
Если вы установите свой @match
директивы как это:
// @match http://domain_A.com/*
// @match http://domain_B.com/*
Затем ваш сценарий будет выполняться дважды - один раз на главной странице и один раз на iframe, как если бы это была отдельная страница.
Так что, если ваш сценарий был такой:
// ==UserScript==
// @name _Test iFrame processing in Chrome and Tampermonkey
// @match http://domain_A.com/*
// @match http://domain_B.com/*
// ==/UserScript==
if (/domain_A\.com/i.test (document.location.href) ) {
//Main page
document.body.style.setProperty ("background", "lime", "important");
}
else {
//iFrame
document.body.style.setProperty ("background", "pink", "important");
}
Вы увидите главную страницу светло-зеленого цвета, а страницу в рамке - розовым.
Кроме того, вы можете проверить, как это:
if (window.top === window.self) {
//--- Code to run when page is the main site...
}
else {
//--- Code to run when page is in an iframe...
}
Как вы обнаружили (за комментарий к другому ответу), вы можете отключить ту же политику происхождения в Chrome. Не делай этого! Вы оставите себя открытым для всех видов махинаций, созданных плохими людьми. В дополнение к злым сайтам, многие номинально "хорошие" сайты, которые позволяют пользователям публиковать контент, могут потенциально отследить, взломать или подделать вас.
По соображениям безопасности ваш браузер не позволяет вам получить доступ к JavaScript в iframe из другого домена.
Смотрите верхний ответ здесь: