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オブジェクトを使用して、グリースモンキー サンドボックスから抜け出します。

Chrome の隔離された環境から抜け出すには、Are Chrome user-scripts separate from the global namespace like Greasemonkey scripts?に従ってください。<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ます。警告は、最初の簡単で汚い試みです。代わりに、 JavaScript var_exportobjToStringのようなものを取得する方が賢明かもしれません。

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 に答える