Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
访问文档';来自firefox扩展的javascript变量_Javascript_Firefox Addon - Fatal编程技术网

访问文档';来自firefox扩展的javascript变量

访问文档';来自firefox扩展的javascript变量,javascript,firefox-addon,Javascript,Firefox Addon,Firefox扩展(工具栏)是否可以访问文档的变量?详细解释如下 加载的文档: <script type="text/javascript"> var variableForExtension = 'something'; </script> 这是第一件要尝试的事情,而且由于安全机制(XPCNativeWrapper)的原因,它无法以这种方式访问。我读过关于通过wrappedJSObject访问它并使用事件的文章(将侦听器添加到文档中并从扩展发送事件),但运气不好。不过

Firefox扩展(工具栏)是否可以访问文档的变量?详细解释如下

加载的文档:

<script type="text/javascript">
var variableForExtension = 'something';
</script>
这是第一件要尝试的事情,而且由于安全机制(XPCNativeWrapper)的原因,它无法以这种方式访问。我读过关于通过wrappedJSObject访问它并使用事件的文章(将侦听器添加到文档中并从扩展发送事件),但运气不好。不过,我没有太努力。所以,在我深入挖掘(“事件方法”听起来像是一种方法)之前,我想知道这有可能吗


谢谢

是的,访问内容中的JS变量是而且始终是可能的。在较旧的Firefox版本中,这种天真的方式是不安全的(因为恶意网页可能获得chrome权限)

1) 如果您控制web页面并希望将信息传递给扩展,那么确实应该使用。这在所有Firefox版本中都有效且安全

2) 如果要从内容文档中读取值,可以绕过XPCNativeWrapper:

var win = window.top.getBrowser().selectedBrowser.contentWindow;
// By the way, this could just be
//   var win = content;
// or 
//   var win = gBrowser.contentWindow;
alert(win.variableForExtension); // undefined
win.wrappedJSObject.variableForExtension // voila!
这在Firefox3之前是不安全的。在Firefox3和更高版本中,可以使用另一种包装器(),它看起来与代码内容页中的对象相同,但可以确保内容页不会进行任何恶意操作

3) 如果您需要在内容网页中调用函数,或者在网页的上下文中运行自己的代码,那么就更复杂了。它在别处被多次询问和回答,但不幸的是从来没有完整的记录。因为这与你的问题无关,所以我不想谈细节。

不太难:)

进一步说:

var win = window.top.getBrowser().selectedBrowser.contentWindow;
alert(win.variableForExtension); // undefined
var jso=window.content.document.defaultView.wrappedJSObject;
alert(jso.pagevar);

jso.pagefunction("hey");
现在,您可以通过扩展访问网页中的任何函数或全局变量:

var win = window.top.getBrowser().selectedBrowser.contentWindow;
alert(win.variableForExtension); // undefined
var jso=window.content.document.defaultView.wrappedJSObject;
alert(jso.pagevar);

jso.pagefunction("hey");

如果您正在使用新的高级SDK,则会有一点不同。您不能直接从加载项代码访问JavaScript对象,但可以从通过unsafeWindow对象附加到打开页面的内容脚本访问它们。例如:

require("sdk/tabs").open({
  url: 'http://www.example.com/some/page/',
  onOpen: function(tab) {
    var worker = tab.attach({
      contentScript: 'unsafeWindow.variableForExtension = 1000;'
    });
  }
});
要读取变量,您需要使用worker变量上的port方法,如中所述


请注意,在处理对象和函数时存在一些安全限制。有关详细信息,请参阅文章。

谢谢您的回答,nickolay.)我做这项工作的方式有点脏,但我会(再次)尝试1和2(我还不需要3),现在我知道这是可能的。@Nickolay。我需要处理#3;我可以向你请教一下指针(这对这里的社区也有帮助)。我需要在内容页(用户可以访问的任何网页)上阅读和执行操作。你说“没有完整的记录,但回答了这么多次”,你能告诉我一个好的指针吗?翻了几天的文档,仍然无法使其正常工作。如果你好奇: