因为它无法访问跨域iframe上的contentWindow属性,但在纯Firefox中它将起作用。以下是一堆隔离此问题的代码:
的test.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时停止工作
请注意,即使主要和框架的html在js解释器的同一服务器上,这些文件也在不同的域上,因为js解释器不知道localhost和127.0.0.1是相同的
我已经添加了“@include *”,因此您可以在不同的网站上查看它,看起来此错误仅存在于跨域iframe中。如果你转到translate.google.com,它有几个iframe,但都在同一个域上,则此脚本按预期工作
问题是,对于greasemonkey,跨域安全检查到底是怎么回事?这与此工具用法相矛盾。恶意网站无法安装脚本,用户必须同意。我被困了很长时间,因为firebug没有表明它在跨域iframe上显示的属性实际上是浏览器的js引擎无法使用。