UserScript初始化麻烦

时间:2012-09-29 12:29:06

标签: javascript initialization tostring userscripts

现在,我正在使用用户脚本进行浏览器游戏。我在沙箱初始化方面遇到了一些问题 作为一种解决方案,我找到了一种方法,创建一个新元素(脚本)和在元素中插入对象

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
}

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

抱歉我的英语不好。

2 个答案:

答案 0 :(得分:1)

使用unsafeWindow object打开greasemonkey沙箱。

要打破Chrome的孤立环境,根据Are Chrome user-scripts separated from the global namespace like Greasemonkey scripts?,您需要在DOM中插入<script>元素。

您不应该将该脚本的源存储在转义字符串中,最好采用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);

答案 1 :(得分:1)

在Firefox中,您可以在对象上使用.toSource()功能。所以答案是沟渠Chrome并切换到Firefox。 (^ _ ^)

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

因此,您可以使用a multiline string注入对象源(请参阅各种技术的链接)。

或者您可以制作或使用下面的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);