2

jquery の json 呼び出しから「本文」コンテンツを受け取っています。次のようにして、一意の JavaScript 要素を取得できます。

script_element = $(data.body)[1]

これは次のようになります。

<script type=​"text/​javascript">​
    updater('foo', 'bar', {}, '0', constant='');
</script>​

だから、typeof script_elementリターン"object"

そして、 を実行するscript_element.innerTextと、次のものが得られます。

updater('foo', 'bar', {}, '0', constant='');

このスクリプトを受け取った後、私が今行っているのは実行することですが、関数呼び出しパラメーターを変更evalして実行する方法が見つかりませんでした。eval

私がやろうとしているのは、呼び出しのパラメーターを変更することですthird。この場合は{}、json 呼び出しの戻り値に応じて変更される可能性があるため、単に検索することはできません{}

たとえば、このテキストをその場で変更することもできscript_element.text.split(',')[2]ますが、これを行うためのより良い方法があるはずだと考えていました。

JavaScriptが「将来のメソッド呼び出し」を認識して処理できるかどうかはわかりませんが、もっと良い方法があるはずだと思います.

何か案が?

4

4 に答える 4

5

できることは、関数をシャドウして、3 番目の引数を変更できるようにすることです。JSON を取得する前に、そのシャドウ関数を定義する必要があります。

var originalUpdater = updater; // keep old function to call

// overwrite (shadowing)
updater = function(a, b, c, d, e) {
    // change c appropriately here
    originalUpdater(a, b, c, d, e);
}

その後、まだそれを行うことができますeval(これはあまり安全ではありませんが、私が間違っていなければ、それはあなたのポイントではありません)、それはシャドウ関数を呼び出します.


より一般的なシャドウイング方法は、次のようになります。

var originalUpdater = updater; // keep old function to call

// overwrite (shadowing)
updater = function() {
    // change arguments[2] appropriately here
    originalUpdater.apply(this, arguments);
}

フィドル: http://jsfiddle.net/n7dLX/

于 2011-07-18T17:08:22.333 に答える
3

サーバーを変更します。戻るのではなく

<script type=​"text/​javascript">​
    updater('foo', 'bar', {}, '0', constant='');
</script>​

戻る

{
  "method": "updater",
  "params": [
    "foo", "bar", {}, "0", ''
  ]
}
于 2011-07-18T17:11:40.163 に答える
2

サーバーから送信される内容を変更できないと仮定するinnerTextと、正規表現を使用してを実行し、挿入する前にHTMLをパス更新するだけで済みます。

var replacer = /\w+\(([^()]+)\)/gi;
script_element.innerText.replace(replacer, function(matched_text, func_params){
    var orig_func_params = func_params;
    // Make changes to func_params here.
    return matched_text.replace(orig_func_params, func_params);
});

これは、次のようにして機能化できます。

var replacer = /\w+\(([^()]+)\)/gi;
function replace_arg(script_element, arg_index, replacement_value) {
    script_element.innerHTML = script_element.innerHTML.replace(replacer, 
    function(matched_text, func_params){
        var orig_func_params = func_params;
        func_params = func_params.split(",");
        if (arg_index >= func_params.length) {
             throw new RangeError(arg_index + " is out of range. Total args in function:" + func_params.length);
        }
        func_params[arg_index] = JSON.stringify(replacement_value);
        return matched_text.replace(orig_func_params, func_params.join(","));
    });
return script_element;
}

これは次のように呼び出すことができます。

script_element = replace_arg(script_element, 3, {"new":"arg"});
于 2011-07-18T17:11:43.063 に答える
0

あなたが何をしているのかわかりませんが、一般に、パラメーターの順序に依存したくない場合は、関数がパラメーターであるプロパティを持つオブジェクトであるパラメーターを 1 つ取るようにします。

function add(params) {
    var a = params.hasOwnProperty("paramA") ? params.paramA : 0;
    var b = params.hasOwnProperty("paramB") ? params.paramB : 0;
    return a + b;
}

add({paramA: 1, paramB: 2});

この場合、 hasOwnProperty を使用して、関数にアクセスする前に、探しているパラメーターが関数に渡されたかどうかを確認する必要があります。

于 2011-07-18T17:11:23.657 に答える