首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UserScript init故障

UserScript init故障
EN

Stack Overflow用户
提问于 2012-09-29 12:29:06
回答 2查看 160关注 0票数 1

现在,我正在为浏览器游戏使用userscript。我对initialization.和沙箱有一些问题。

作为解决方案,我找到了一种方法:创建一个新的元素(脚本),将对象插入到元素中。

代码语言:javascript
复制
var script = document.createElement("script");
script.type = "text/javascript";
script.innerHTML = "var Class = { ... }";
document.body.appendChild(script);

但是我有一个非常大的对象,并将它转换成一个字符串,这很麻烦,而且很费时。

我有一个像这样的物体:

代码语言:javascript
复制
{
addToStorage : Function,
getFromStorage : Function,
getID : Function
settings : Object,
langs : Object,
init : Function,
version : Number,
author: String
}

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

对不起我的英语不好。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-29 15:31:25

在火狐中,您可以对对象使用.toSource()函数。因此,答案是放弃Chrome,转而使用Firefox。(^_^)

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

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

或者,您可以在下面创建或使用像objToString这样的对象字符串。警告,objToString只是一个快速和肮脏的第一次尝试,您可能会更聪明地抓取类似导出之类的东西。

代码语言:javascript
复制
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);
票数 1
EN

Stack Overflow用户

发布于 2012-09-29 13:05:56

使用对象来打破greasemonkey沙箱。

为了突破Chrome的孤立环境,根据Chrome用户脚本是否与全局命名空间分离,如Greasemonkey脚本?的说法,您需要在DOM中插入一个<script>元素。

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

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12652705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档