阅读:3064回复:1
求助:关于unsafeWindow 关于 wrappedJSObject
最近写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方便千万倍. 当然,这只是我的见解.. |
|
1楼#
发布于:2010-12-07 00:49
问题1很容易就能搜索到答案的,就因为在两个窗口,所以constructor 和 instanceof不能正常工作。替代方法:
Object.prototype.toString.call({}) === "[object Object]" |
|
|