2010-11-06 73 views
1

我有一个$ .POST调用,它返回需要运行但不会执行该函数的函数的名称,我不知道为什么。如何从ajax调用JavaScript函数返回

下面是一个例子:

JS文件:

$(function(){ 
    $.post('test.php',{event: 'add'}, 
      function(data){ 
       data.func(data.msg); 
      },'json'); 

    function test(msg){ 
      alert(msg); 
    } 
}); 

PHP的Ajax:

<?php 
    switch($_POST['event']){ 
      case 'add': 
       $output['func'] = 'test'; 
       $output['msg'] = 'This is add message'; 
       break; 
      case 'delete': 
       $output['func'] = 'test'; 
       $output['msg'] = 'This is delete message'; 
       break; 
    } 
    echo json_encode($output); 
?> 

我有在Ajax是返回函数的名称问题(测试)但它不会运行该功能,我该如何解决这个问题?

+0

也许需要'eval' .... – 2010-11-06 12:26:50

回答

6

请勿使用EVAL。

相反,用你想要执行的功能创建一个对象。例如:

var functionTable = { 
    test: function (msg) { 
     alert(msg); 
    } 
}; 

$.post('test.php', { event: 'add' }, function (data) { 
    if (functionTable.hasOwnProperty(data.func)) { 
     functionTable[data.func](data.msg); 
    } 
}, 'json'); 
+0

大,这和我的完全一样;)+1 – Harmen 2010-11-06 12:34:48

+0

@哈门,是的,我发布了我的答案后不久就看到了。然而,我更喜欢使用'hasOwnProperty'。 (谁知道;有人可能会添加一个危险的函数来'Object.prototype',它被远程调用... – strager 2010-11-06 12:36:53

+0

Eval()只是作为你的使用它的“邪恶”如果他生成的JSON的方式是孤立的用户生成的数据(看起来他是这样),避免eval()的实用原因并不多,在这种情况下避免它是特别不必要的,因为$ .post已经使用eval()派生来反序列化JSON响应但在最新的浏览器中,无论如何, – 2010-11-06 13:04:07

2

我认为这是最好的功能移动到一个对象在这里,所以你可以看到,如果它的存在与否:

var possibleFunctions = { 
    test: function(val){ 
    alert(val); 
    } 
}; 

$(function(){ 
    $.post('test.php',{event: 'add'}, 
      function(data){ 
       if(possibleFunctions[data.func]){ 
        possibleFunctions[data.func](data.msg); 
       } 
      },'json'); 
     }); 
});