unsafeWindow
在Chrome,Tampermonkey或Firefox上不能很好地处理frame/iframe。
- 试图使用jQuery访问全局(到框架)JS,就像那样,将不起作用。
- 用户脚本将在满足
@include
,@exclude
和/或@match
要求的iframe上运行。
所以,你需要考虑多个脚本运行,然后你有两个基本的方法,这取决于你想要完成什么。您可以:
(A)根据this answer为特定框架定制脚本。 (B)注入你的JS并使用特殊的frames
对象来抓取你想要的特定函数。
以下脚本演示了两者。安装在Tampermonkey (或Firefox Greasemonkey)中,然后访问this test page at jsBin。
// ==UserScript==
// @name _Calling iframe functions
// @namespace _pc
// @include http://jsbin.com/ugoruz/*
// @include http://jsbin.com/okequw/*
// ==/UserScript==
console.log ("Script start...");
/*--- This next function call will work in Firefox or Tampermonkey ONLY,
not pure Chrome userscript.
*/
console.log ("calling functionOfInterest()...");
unsafeWindow.functionOfInterest();
if (window.top === window.self) {
//--- Code to run when page is the main site...
console.log ("Userscript is in the MAIN page.");
//--- The frames object does not play nice with unsafeWindow.
/*--- These next three work in Firefox, but not Tampermonkey, nor pure Chrome.
console.log ("1", frames[1].variableOfInterest); // undefined
console.log ("2", unsafeWindow.frames[1].variableOfInterest); // undefined
console.log ("3", frames[1].unsafeWindow); // undefined
*/
/*--- This next would cause a silent crash, all browsers...
console.log ("4", unsafeWindow.frames[1].unsafeWindow.variableOfInterest);
*/
//--- To get at iFramed JS, we must inject our JS.
withPages_jQuery (demoAccessToFramedJS);
}
else {
//--- Code to run when page is in an iframe...
console.log ("Userscript is in the FRAMED page.");
console.log ("The frame's ID is:", window.self.frameElement.id);
}
function demoAccessToFramedJS ($) {
$("body").prepend (
'<button id="gmMain">Run JS on main window</button>'
+ '<button id="gmFrame">Run JS on iframe</button>'
);
$("#gmMain, #gmFrame").click (function() {
if (this.id === "gmMain") {
functionOfInterest();
}
else {
frames[1].functionOfInterest();
}
console.log (this.id + "was clicked.");
});
}
function withPages_jQuery (NAMED_FunctionToRun) {
//--- Use named functions for clarity and debugging...
var funcText = NAMED_FunctionToRun.toString();
var funcName = funcText.replace (/^function\s+(\w+)\s*\((.|\n|\r)+$/, "$1");
var script = document.createElement ("script");
script.textContent = funcText + "\n\n";
script.textContent += 'jQuery(document).ready(function() {'+funcName+'(jQuery);});';
document.body.appendChild (script);
};
console.log ("Script end");
您将看到脚本从两个主要页面,并从IFRAME运行的功能。控制台输出(Tampermonkey)将是:
Tampermonkey started
Script start...
calling functionOfInterest()...
Userscript is in the MAIN page.
Script end
Tampermonkey started
Script start...
calling functionOfInterest()...
Userscript is in the FRAMED page.
The frame's ID is: iframe2
Script end
它也将作为一个直线上升的Chrome userscript如果去掉unsafeWindow
线(S)。
这是所有相同的起源 – Skinner927 2012-07-24 20:16:07