NLF
NLF
小狐狸
小狐狸
  • UID32981
  • 注册日期2010-06-03
  • 最后登录2016-03-14
  • 发帖数64
  • 经验46枚
  • 威望1点
  • 贡献值60点
  • 好评度19点
  • 社区居民
阅读:2888回复:1

求助:关于unsafeWindow 关于 wrappedJSObject

楼主#
更多 发布于:2010-12-07 00:49
最近写JS遇到一个问题,就是两个用户脚本之间的变量交流.
我开始想到的是
其中一个脚本用unsafeWindow或window.wrappedJSObject抛到真实的window下.
另外一个脚本同样的方法取得.
比如:

脚本A:unsafeWindow.variableA={a:0,b:1};
脚本B:alert(unsafeWindow.variableA.a);//会弹出1,也就是说,取到的值.

但是
unsafeWindow.variableA instanceof Object
 和
unsafeWindow.variableA.constructor===Object
都返回false

问题1:
为什么 constructor 和 instanceof不能正常工作???


后面,我想用postMessage来发送变量
例如:window.postMessage({a:0},'*')
...但是firefox不可以postmessage对象.-_-!!.失败告终..
opera 10.63+ chrome5+可以postmessage对象.
firefox4.0都还不行..................

问题2:
还有没有其他的方法呢?


PS:最近几天因为以上问题,稍微研究了下相关内容,知道了对USERJS来说.所有的对象都是被 XPCNativeWrapped封装过的对象,原因是安全问题,因为原页面的方法,有可能被重写过,如果被恶意重写过,那么就会有安全问题.
而XPCNativeWrapped封装过的对象 封装后的对象的方法都是原生的.所以被修改过的都会被还原或者移除.
这样也就导致了,某些页面上JS添加的方法访问不到.
而gm提供了unsafewindow访问真实窗口.相当于 window.wrappedJSObject
还可以通过 封装过的对象的 wrappedJSObject 属性访问真实对象..
比如:比如原页面上有个id叫 ele 的对象,原页面的JS给这个对象添加了一个叫 method 的方法.
在userjs中document.getElementById('ele').method是访问不到的..
(在chrome中是可以访问到,看来chrome和firefox封装的方式有点不一样啊)

但是可以这样做 document.getElementById('ele').wrappedJSObject.method

这样看来..unsafeWindow 有神马存在的价值??
wrappedJSObject是每个封装过的对象属性,随时访问,不是比unsafeWindow方便千万倍.
当然,这只是我的见解..
ithinc
狐狸大王
狐狸大王
  • UID22844
  • 注册日期2008-02-04
  • 最后登录2014-09-28
  • 发帖数371
  • 经验10枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 社区居民
1楼#
发布于:2010-12-07 00:49
问题1很容易就能搜索到答案的,就因为在两个窗口,所以constructor 和 instanceof不能正常工作。替代方法:

Object.prototype.toString.call({}) === "[object Object]"
Tab Utilities的功能要求,请提交到http://tabutils.uservoice.com
游客

返回顶部