Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在jquery ajax中将函数名作为字符串传递_Javascript_Ajax_Jquery_Asp.net Ajax - Fatal编程技术网

Javascript 在jquery ajax中将函数名作为字符串传递

Javascript 在jquery ajax中将函数名作为字符串传递,javascript,ajax,jquery,asp.net-ajax,Javascript,Ajax,Jquery,Asp.net Ajax,我不知道这个问题的标题是否正确,所以如果有人有更好的描述,请编辑它 我已将具有自定义属性的锚元素如下(更新:根据@Rune solution和@Shauna comment) 现在,我在浏览器控制台中遇到以下错误 SyntaxError {popStackFrame: function} arguments: Array[1] get message: function () { [native code] } get stack: function () { [native code] } s

我不知道这个问题的标题是否正确,所以如果有人有更好的描述,请编辑它

我已将具有自定义属性的锚元素如下(更新:根据@Rune solution和@Shauna comment)

现在,我在浏览器控制台中遇到以下错误

SyntaxError {popStackFrame: function}
arguments: Array[1]
get message: function () { [native code] }
get stack: function () { [native code] }
set message: function () { [native code] }
set stack: function () { [native code] }
type: "unexpected_token"
__proto__: Error
arguments: undefined
constructor: function SyntaxError() { [native code] }
name: "SyntaxError"
stack: undefined
type: undefined
__proto__: d

您向ajax选项传递的是一个字符串而不是函数,这就是它不起作用的原因

在您的示例中,您不妨编写

callServerGetMethod(url, data, function(msg) {
      alert("error " + msg);
    },
      function() {
        alert('comepleted');
      }
    , "handleSuccess");
请注意,最后一个参数是一个普通字符串

相反,您必须传递函数。最常见的方法是使用JavaScript而不是自定义属性附加函数

根据处理数据属性的方式,您可能可以使用该属性

<a href="#" 
   class="call-method" 
   options="{url: "/Pages/mustafa/test_dialoge.aspx/GetDate",data:{param1: 1, param2: 2}, success:handleResult,error:doOnError}"
>call me</a>

var callServerGetMethod = function (options) {
    var self = this;
    if(typeof options === 'string'){
      options = JSON.parse(options,function (key, value) {
         if (typeof self[value] === 'function') {
            return self[value];
         }
         return value;
      });
    }
    $.ajax($.extend({type: "POST"},options);
};
或者,您可以定义一个函数,将字符串转换为已定义的函数

var string2function = function string2function(functionName){
     if (typeof functionName === 'function') return functionName;

     if(typeof functionName === 'string'){
         if (typeof self[functionName] === 'function') {
            return self[functionName];
         }
     }
     return null;
}
然后像这样使用它

options.success=string2function(obj.attr('data-success')


理论上,您可以在属性值上使用
eval
,但是通常建议您避免使用
eval
,因为与该函数相关的许多潜在RISC

只是一个旁注-“data”是该函数的前缀。虽然不使用它可能不会有什么坏处(除了可读性,因为有“onError”和“onSuccess”HTML钩子,可能会与自定义的“on error”和“on success”属性混淆),但保持代码标准兼容并重命名自定义属性以包含“data-”前缀可能是一个好主意,但是我需要使用与事件处理程序相同的语法为函数指定处理程序,比如$('.call method').live('click',function(){var obj=$(this);var url=obj.attr('url');var data=obj.attr('data');var onSuccess=obj.attr('on-success');var onError=obj.attr('on-error');var onComplete=obj.attr('on-error')('on-complete');//callServerGetMethod(url,数据,onError,onComplete,onSuccess);var options='{data:'+data+',success:'+onSuccess+',error:'+onError+',complete:'+onComplete+'}';alert(选项);var callServerGetMethod=函数(url,选项){$.ajax($.extend)({url:url,键入:“POST”},选项));}@MustafaMagdy在您的示例中,您并没有真正结合我们的方法。我的方法的关键点是,我要传递一个函数以获得成功。在两个版本中,您传递的字符串都不会work@MustafaMagdy当然,真正的问题是为什么需要像事件处理程序那样指定它?
<a href="#" 
   class="call-method" 
   options="{url: "/Pages/mustafa/test_dialoge.aspx/GetDate",data:{param1: 1, param2: 2}, success:handleResult,error:doOnError}"
>call me</a>

var callServerGetMethod = function (options) {
    var self = this;
    if(typeof options === 'string'){
      options = JSON.parse(options,function (key, value) {
         if (typeof self[value] === 'function') {
            return self[value];
         }
         return value;
      });
    }
    $.ajax($.extend({type: "POST"},options);
};
var call = function (url, data, onError, onComplete, onSuccess) {
    return callServerGetMethod('{"url":"' + url +'","data":' + data + ',"error":"' + onError + '","success":"' + onSuccess'"}');
}
var string2function = function string2function(functionName){
     if (typeof functionName === 'function') return functionName;

     if(typeof functionName === 'string'){
         if (typeof self[functionName] === 'function') {
            return self[functionName];
         }
     }
     return null;
}