4

因为它无法访问跨域 iframe 上的 contentWindow 属性,但在纯 Firefox 中它可以工作。以下是隔离此问题的一堆代码:

  1. 在本地服务器上创建 3 个文件:

测试.html

<SCRIPT language="JavaScript" SRC="http://localhost/postmsg.js"></SCRIPT>
<iframe src="http://127.0.0.1/iframe.htm" id="iframe"></iframe>
<div>Click anywhere on this page to see message from embedded iframe,
which do not need to be on the same domain</div>

iframe.html

<SCRIPT language="JavaScript" SRC="http://127.0.0.1/postmsg.js"></SCRIPT>
<div id="message"></div>

postmsg.js

// ==UserScript==
// @include       *
// ==/UserScript==

alert('script loaded')
window.addEventListener('click', 
    function() {
        frame = document.getElementsByTagName("iframe")[0]
        cwindow = frame.contentWindow //here comes the error anything after this line won't execute in greasemonkey
        alert("this won't show in greasemonkey");
        cwindow.postMessage("hello, iframe!","*")
    },
true);

window.addEventListener("message", function(e){
        alert("message from iframe: main window was clicked!  " +e.data);
        document.getElementById('message').textContent += "message from iframe: main window was clicked!\n"
}, true);

这个 js 文件可以作为标准包含文件 html 工作,然后忽略第一个注释,但是在重命名扩展名到 user.js 后可以安装在greasemonkey 中,然后在调用 contentWindow 时停止工作

请注意,即使 js 解释器的 main 和 framed html 位于同一服务器上,这些文件也位于不同的域中,因为 js 解释器不知道 localhost 和 127.0.0.1 是相同的

我已经放了“@include *”,所以你可以在不同的网站上检查它,看起来这个错误只存在于跨域 iframe 上。如果你去 translate.google.com,它有几个 iframe,但都在同一个域上,这个脚本按预期工作

问题是,该死的跨域安全检查对greasemonkey 做了什么?这与此工具的用法相矛盾。恶意网站不能安装脚本,用户必须同意。我被困了很长时间,因为萤火虫没有表明它在跨域 iframe 上显示的属性实际上在浏览器的 js 引擎上不可用。

4

0 回答 0