Chrome用户脚本错误:"不安全的JavaScript尝试访问框架"

时间:2012-05-19 14:58:50

标签: javascript google-chrome iframe greasemonkey userscripts

// 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";

在此网址的用户脚本中运行: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 个答案:

答案 0 :(得分:13)

出于安全原因,普通的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");
}

您会看到绿色的主页面和粉红色的iframed页面。


或者,你可以这样测试:

if (window.top === window.self) {
    //--- Code to run when page is the main site...
}
else {
    //--- Code to run when page is in an iframe...
}




正如您所发现的(根据另一个答案的评论),您可以disable the same origin policy on Chrome不要这样做!你会让自己对坏人设置的各种诡计开放。除了邪恶的网站,许多名义上“好”的网站 - 允许用户发布内容 - 可能会跟踪,破解或欺骗你。

答案 1 :(得分:1)

出于安全考虑,您的浏览器不允许您从其他域访问iframe中的javascript。

请参阅此处的最佳答案:

jQuery cross domain iframe scripting