Ошибка пользовательского скрипта 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 из другого домена.

Смотрите верхний ответ здесь:

JQuery междоменный сценарий iframe

Другие вопросы по тегам