我需要在我的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");
结果未定义,如何将数据参数从测试功能传递给用户定义的功能?提前谢谢!
问题更新:
我正在编写一个jquery插件来处理ajax请求,就像asp.net mvc unobtrusive ajax,我从html标签attrbute获取ajax callfack函数,例如:
<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值为函数名称,我可以使用Micrsoft中定义的以下方法正确调用它jquery-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);
}
谁能帮帮我?非常感谢你!
答案 0 :(得分: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
答案 1 :(得分:0)
您没有将参数传递给fn
函数。
更改此部分:
var fn=new Function("("+myfunc+")();");
到此:
var fn=new Function("("+myfunc+")("+data+");");
但是如果要定义函数,那么data
变量必须包含一个json字符串:
var fn=new Function("("+myfunc+")("+JSON.stringify(data)+");");
答案 2 :(得分:0)
我认为你没有正确使用Function构造函数。请参阅此链接以供参考:
答案 3 :(得分:-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");}
}