unsafeWindow
Chrome、Tampermonkey、またはFirefoxのフレーム/ iframeでうまく再生されません。
- jQueryを使用してグローバルな(フレームへの)JSへのアクセスを試みても機能しません。
- userscriptsは、
@include
,@exclude
、および/または@match
の要件を満たすiframeで実行されます。
したがって、複数のスクリプトの実行を考慮する必要があります。次に、達成しようとしていることに応じて2つの基本的な方法があります。あなたは
(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
あなたはunsafeWindow
行(複数可)を削除する場合それはまたまっすぐアップクロームuserscriptとして動作します。
これはすべて同じ起源です。 – Skinner927