2

costom jqueryプラグイン内からユーザー定義のjavascript関数を呼び出し、それにパラメーターを渡す必要があります。次に例を示します。

function test(data)
    {
      var myfunc="function(data){alert(data);}"; //this is user defined function I   retrieved from html tag attribute
      var fn=new Function("("+myfunc+")();");
      fn.apply(this,arguments);
      return fn;
} 
test("hello");

結果は未定義ですが、テスト関数からユーザー定義関数にデータパラメーターを渡すにはどうすればよいですか?前もって感謝します!

質問の更新:

asp.net mvc unobtrusive ajaxのように、ajaxリクエストを処理するjqueryプラグインを作成しています。たとえば、htmlタグattrbuteからajaxcallfack関数を取得します。

<div data-ajax-success="function(data,status,xhr){alert(data);}"....

data-ajax-success属性の値はユーザー定義関数であり、次の形式にすることができます。

data-ajax-success="function(data,status,xhr){alert(data);}"
data-ajax-success="function(data){alert(data);}"
data-ajax-success="function(){alert('hello');}"
data-ajax-success="functionName"

この属性値をjavascript関数として解析し、jquery ajaxコールバックパラメーターをこの関数に渡す必要があります。ここで、data-ajax-success値は関数名です。Micrsoftjquery-unobtrusive-ajax.jsで定義されている次のメソッドを使用して正しく呼び出すことができます。

function getFunction(code, argNames) {
        var fn = window, parts = (code || "").split(".");
        while (fn && parts.length) {
            fn = fn[parts.shift()];
        }
        if (typeof (fn) === "function") {
            return fn;
        }
        argNames.push(code);
        return Function.constructor.apply(null, argNames);
    }

しかし、data-ajax-successが関数本体の場合、パラメーターを渡すことができませんでした。ajaxコールバックを処理するサンプルコードは次のとおりです。

loadData: function (index, options) {
complete: function (xhr,status) {
            $(context.loading).hide(context.loadingDuration);
            getFunction(context.onComplete, ["xhr", "status"]).apply(this, arguments);
            },
        success:function (data, status, xhr) {
            $(context.updateTarget).html(data);
            getFunction(context.onSuccess, ["data", "status", "xhr"]).apply(this, arguments);
            },
            error: getFunction(context.onFailure, ["xhr", "status", "error"])
});

      $.ajax(options);
  }

誰かが私を助けることができますか?どうもありがとうございます!

4

4 に答える 4

2

MDN では、Function オブジェクトの構文を次のように説明しています。

new Function ([arg1[, arg2[, ... argN]],] functionBody)

対応する例を次に示します。

// Example can be run directly in your JavaScript console

// Create a function that takes two arguments and returns the sum of those arguments
var adder = new Function("a", "b", "return a + b");

// Call the function
adder(2, 6);
// > 8

サンプルコードに適用すると、次のようになります。

var fn=new Function("data",myfunc);

参照:

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function

于 2012-09-19T08:56:46.017 に答える
0

Function コンストラクターを正しく使用していないと思います。参照用にこのリンクを参照してください。

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function?redirectlocale=en-US&redirectslug=Core_JavaScript_1.5_Reference%2FObjects%2FFunction#Example.3A_Specifying_arguments_with_the_Function_constructor

于 2012-09-19T08:54:48.920 に答える
0

関数に引数を渡していませんfn

この部分を変更します。

var fn=new Function("("+myfunc+")();");

これに:

var fn=new Function("("+myfunc+")("+data+");");

しかし、そのような関数を定義している場合、data変数には json 文字列が含まれている必要があります。

var fn=new Function("("+myfunc+")("+JSON.stringify(data)+");");
于 2012-09-19T08:49:47.947 に答える
-1

このマイクロソフトの方法を変更して解決しました:

  function getFunction(code, argNames) {
    var fn = window, parts = (code || "").split(".");
    while (fn && parts.length) { fn = fn[parts.shift()]; }
    if (typeof (fn) === "function") { return fn; } //onSuccess="functionName"
    if ($.trim(code).toLowerCase().indexOf("function")==0) { return new Function("return (" + code + ").apply(this,arguments);");} //onSuccess="function(data){alert(data);}"
    argNames.push(code);
    try {return Function.constructor.apply(null, argNames); //onSuccess="alert('hello');return false;"
    }catch(e){alert("Error:\r\n"+code + "\r\nis not a valid callback function");}
}
于 2012-09-27T03:21:49.607 に答える