我创建了一个 Greasemonkey 脚本,其中包含一个我想从页面的内部脚本访问的对象。
为此,本页描述了几种安全的方法。
其中之一是使用 Components.utils.cloneInto 函数。
这是一个脚本示例。
// ==UserScript==
// @name Test CloneInto
// @namespace Test CloneInto
// @description Test CloneInto
// @include http://stackoverflow.com*
// @version 1
// @grant GM_xmlhttpRequest
// ==/UserScript==
var myObj = {}
myObj.test = function() {
alert("works");
}
myObj.num = 152;
unsafeWindow.myObj = cloneInto(myObj, unsafeWindow, {cloneFunctions: true});
var scriptDOM = document.createElement("script");
scriptDOM.type = "text/javascript";
scriptDOM.innerHTML = "alert(window.myObj.num);\
alert(window.myObj.test);"
document.getElementsByTagName("head")[0].appendChild(scriptDOM);
“152”显示正确,但随后出现“未定义”而不是我的函数。
但我按照文档的建议使用了
{cloneFunctions: true}
。
我使用 Firefox 34,请问有人可以解决这个问题吗?
编辑: 使用 Google Chrome 和 Tampermonkey 效果很好。
编辑2:在Greasemonkey存储库上打开问题2070。
迟到总比不到好:)
您可能已经发现了这一点。您可能只是因为缺少分号而出现语法错误。
// ==UserScript==
// @name Test CloneInto
// @namespace Test CloneInto
// @description Test CloneInto
// @include http://stackoverflow.com*
// @version 1
// ==/UserScript==
var myObj = {};
myObj.test = function() {
alert("works");
};
myObj.num = 152;
unsafeWindow.myObj = cloneInto(myObj, unsafeWindow, {cloneFunctions: true});
作为用户脚本在 FireMonkey 中工作得很好。 当我打开开发者工具 (F12) 并写入
myObj
显示
Object { test: (), num: 152 }
继续努力!