Поскольку он не может получить доступ к свойству contentWindow в междоменном iframe, но в чистом Firefox он будет работать.Вот несколько кодов, изолирующих эту проблему:
- создайте 3 файла на локальном сервере:
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 *", чтобы вы могли проверить его на разных сайтах, и похоже, что эта ошибка существует только для междоменных фреймов.Если вы перейдете на translate.google.com, на котором есть несколько iframe, но все они находятся в одном домене, этот сценарий работает, как и ожидалось
Вопрос в том, что делает адская междоменная проверка безопасности на greasemonkey?Это противоречит использованию этого инструмента.Вредоносный сайт не может установить скрипт, пользователь должен согласиться с этим.Я надолго застрял в этом, потому что firebug не указывал, что свойства, которые он показывает в междоменном iframe, фактически недоступны движком js браузера.