如何从一个userscript访问一个iframe的JavaScript?(How do I acc

2019-06-26 12:45发布

我试图使用的Chrome userscript或Tampermonkey脚本来修改一个页面,这样的结构:

<body>
content up here

<iframe id="main" src="foo.dat"></iframe>
</body>

该iframe是同源。

我需要访问一个功能,就是在iframe#main 。 我以为我可以使用unsafeWindow得到它,但我不断收到没有或undefined返回。

我试过的东西摆:

  • 尝试创建在新脚本元件iframe ,但它附加到母体即使$('frame#main').contents().append(script)$('frame#main').contents()[0].createElement('script')

  • window.frames["#main"].contentWindow返回未定义。

我已经尝试了很多其他的事情,我不能在此刻回想,但我已经用尽了我所有的想法,觉得我打字的垃圾比什么才是最重要了。
我无法弄清楚如何使用打unsafeWindow iframe的。

Answer 1:

  1. unsafeWindow不玩在Chrome,Tampermonkey或Firefox帧/ I帧不错。
  2. 试图访问全球(到帧)JS与jQuery,这样,将无法正常工作。
  3. 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)。



文章来源: How do I access an iframe's javascript from a userscript?