1

现在,我正在为浏览器游戏使用用户脚本。而且我在沙盒初始化方面有一些问题。
作为解决方案,我找到了一种创建新元素(脚本)并将对象插入元素的方法。

var script = document.createElement("script");
script.type = "text/javascript";
script.innerHTML = "var Class = { ... }";
document.body.appendChild(script);

但是我有一个非常大的对象并将其转换为一个相当有问题且耗时的字符串。
我有一个看起来像这样的对象:

{
addToStorage : Function,
getFromStorage : Function,
getID : Function
settings : Object,
langs : Object,
init : Function,
version : Number,
author: String
}

任何想法,如何将其转换为字符串或插入全局窗口

对不起,我的英语不好。

4

2 回答 2

1

使用该unsafeWindow对象突破greasemonkey 沙箱。

要突破 Chrome 的孤立环境,根据Are Chrome user-scripts 与 Greasemonkey 脚本之类的全局命名空间分离吗?您需要<script>在 DOM 中插入一个元素。

您不应该将该脚本的源代码存储在转义字符串中,最好获取一个 JS 对象并将其字符串化。对于普通的,您可以使用JSON, 对于更复杂的事情,将所有内容放入一个函数并调用.toString()它:

function moduleClosure(global) {
    // do something
    return some object
}
var script = document.createElement("script");
script.type = "text/javascript";
script.innerText = "var Class = "+moduleClosure+"(window);";
document.body.appendChild(script);
于 2012-09-29T13:05:56.273 回答
1

在 Firefox 中,您可以.toSource()对对象使用该函数。所以答案是放弃 Chrome 并切换到 Firefox。(^_^)

但是假设你不想这样做,答案会变得混乱,因为JSON.stringify()如果对象作为函数属性,甚至不会工作,就像你的那样。

因此,您可以使用多行字符串注入对象源(有关各种技术,请参见链接)。

或者,您可以制作或使用objToString如下的对象字符串化符。警告,objToString这只是一个快速而肮脏的第一次尝试,你可能更聪明地抓住JavaScript var_export 之类的东西。

var myObjX =  {
    someFunction:   function () {console.log ("foo");},
    settings:       {init: 2},
    langs:          {a: "En", b: "Jp"},
    version:        99,
    author:         "Anon"
}

function objToString (obj) {
    var str = '{ ';
    for (var p in obj) {
        if (obj.hasOwnProperty (p) ) {
            str += p + ': ';
            switch (typeof obj[p]) {
                case "object":
                    str += objToString (obj[p]);
                    break;
                case "string":
                    str += '"' + obj[p] + '"';
                    break;
                default:
                    str += obj[p];
                    break;
            }
            str += ',\n';
        }
    }
    return str.slice (0, str.length-2) + ' }';
}

var script          = document.createElement("script");
script.type         = "text/javascript";
script.textContent  = "var injectedX = " + objToString (myObjX);
document.body.appendChild (script);
于 2012-09-29T15:31:25.297 回答