gpt4 book ai didi

javascript - 如何在 Firefox 扩展中使用 "targetObj"参数到 loadSubScript()?

转载 作者:行者123 更新时间:2023-11-30 10:33:48 24 4
gpt4 key购买 nike

从阅读示例来看,这似乎应该很容易。这是我的代码:

rhkTest = {
onPageLoad: function(event) {
var doc = event.originalTarget;
var wnd = doc.defaultView;
var loader = Components.classes["@mozilla.org/moz/jssubscript-loader;1"]
.getService(Components.interfaces.mozIJSSubScriptLoader);
loader.loadSubScript("chrome://rhkoshi-extension/content/testfoo.js", wnd);
alert('typeof(wnd) = ' + typeof(wnd));
alert('typeof(wnd.window.rhk_test1) = ' + typeof(wnd.window.rhk_test1));
alert('typeof(wnd.window.rhk_test2) = ' + typeof(wnd.window.rhk_test2));
alert('typeof(wnd.window.rhk_test3) = ' + typeof(wnd.window.rhk_test3));
alert('typeof(wnd.rhk_test1) = ' + typeof(wnd.rhk_test1));
alert('typeof(wnd.rhk_test2) = ' + typeof(wnd.rhk_test2));
alert('typeof(wnd.rhk_test3) = ' + typeof(wnd.rhk_test3));
alert('typeof(rhk_test1) = ' + typeof(rhk_test1));
alert('typeof(rhk_test2) = ' + typeof(rhk_test2));
alert('typeof(rhk_test3) = ' + typeof(rhk_test3));
alert('typeof(this.rhk_test1) = ' + typeof(this.rhk_test1));
alert('typeof(this.rhk_test2) = ' + typeof(this.rhk_test2));
alert('typeof(this.rhk_test3) = ' + typeof(this.rhk_test3));
alert('typeof(window.rhk_test1) = ' + typeof(window.rhk_test1));
alert('typeof(window.rhk_test2) = ' + typeof(window.rhk_test2));
alert('typeof(window.rhk_test3) = ' + typeof(window.rhk_test3));
},
onLoad: function(event) {
var appcontent = document.getElementById("appcontent");
if (appcontent) {
appcontent.addEventListener("DOMContentLoaded", rhkTest.onPageLoad, true);
}
},
};

window.addEventListener("load", function(e) { rhkTest.onLoad(e); }, false);

testfoo.js 包含:

window.rhk_test1 = 'testval1';
rhk_test2 = 'testval2';
var rhk_test3 = 'testval3';

window.alert('Running testfoo.js');

我收到“正在运行 testfoo.js”的警报,因此文件已找到并执行。我还收到一条警告,指出 wnd 是一个“对象”(如预期的那样——它在别处初始化)。但是,对于各种 typeof() 调用,所有其他警报都显示“未定义”。当然,我不希望所有这些都具有值(value),但我希望至少其中一个可以显示一些东西。

我的值(value)观发生了什么变化?它们不应该在 wnd 的属性中吗?

我在 Windows 7 上运行 Firefox 19.0(如果重要的话)。

最佳答案

它实际上有点复杂,取决于wnd 是什么。您可以使用常规对象作为下标的范围:

var myScope = this;
var subscriptScope = {};
loader.loadSubScript("testfoo.js", subscriptScope);

然而,范围并没有完全隔离。以下是 testfoo.js 中代码的一些示例:

var foo = "bar;      // Creates subscriptScope.foo
xyz = 1; // Creates myScope.xyz
function dummy() {} // Creates subscriptScope.dummy
var outer = myScope; // Assigns a value from outer scope

因此,虽然下标的变量和函数是在其作用域中定义的,但它仍然可以访问加载它的脚本的作用域——未声明的变量仍将在外部作用域中创建,并且将在外部作用域中搜索变量无法在下标范围内解析。

如果你真的想隔离下标,那么你应该使用一个“合适的”全局对象,比如窗口对象或沙箱:

var myScope = this;
var subscriptScope = new Components.utils.Sandbox("about:blank");
loader.loadSubScript("testfoo.js", subscriptScope);

现在 testfoo.js 将无法再访问外部范围:

var foo = "bar;      // Creates subscriptScope.foo
xyz = 1; // Creates subscriptScope.xyz
function dummy() {} // Creates subscriptScope.dummy
var outer = myScope; // Exception: myScope is not defined

请注意,window 变量没有什么特别之处 - 如果您希望下标具有该变量,则必须在范围对象中定义它,例如:

subscriptScope.window = subscriptScope;

作用域对象本身可以作为下标顶层的 this 访问。

关于javascript - 如何在 Firefox 扩展中使用 "targetObj"参数到 loadSubScript()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15179265/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com