我试图使用的Chrome userscript或Tampermonkey脚本来修改一个页面,这样的结构:
<body>
content up here
<iframe id="main" src="foo.dat"></iframe>
</body>
该iframe是同源。
我需要访问一个功能,就是在iframe#main
。 我以为我可以使用unsafeWindow
得到它,但我不断收到没有或undefined
返回。
我试过的东西摆:
我已经尝试了很多其他的事情,我不能在此刻回想,但我已经用尽了我所有的想法,觉得我打字的垃圾比什么才是最重要了。
我无法弄清楚如何使用打unsafeWindow
iframe的。
-
unsafeWindow
不玩在Chrome,Tampermonkey或Firefox帧/ I帧不错。 - 试图访问全球(到帧)JS与jQuery,这样,将无法正常工作。
- userscripts将在满足I帧运行
@include
, @exclude
,和/或@match
要求。
所以,你需要考虑的多个脚本运行,然后你有两种基本的方法,这取决于你正在努力完成的任务。 您可以:
(A)定制脚本特定(多个)帧,如在此答案 。
或(B)注入你的JS和使用特殊frames
反对抓住你想要的特定功能。
下面的脚本演示两种。 在Tampermonkey 1(或Firefox的Greasemonkey)安装它,然后访问在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
1它也将作为一个直线上升的Chrome userscript如果去掉unsafeWindow
线(S)。