2010-11-06 78 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'); 
     }); 
});