2011-03-31 63 views
2

如果我做一個AJAX後用jQuery,看起來像如何從JSON字符串調用JavaScript函數?

$.post('MyApp/GetPostResult.json', function(data) { 
    // what goes here? 
}); 

,結果看起來像

{ 
    "HasCallback": true, 
    "Callback": "function(){ alert('I came from the server'); }" 
}; 

那麼我該如何調用回調函數?我可以只寫if(data.HasCallback){data.Callback();}嗎?

回答

2

這應該工作:

function(data) { 
    if(data.HasCallback) { 
    eval(data.Callback); 
    } 
} 

編輯:看起來不怎麼夠細心。如果您確實獲得了function() { ... }文本,那麼您需要eval(data.Callback + "()")

+0

究竟做'eval'做的,哪裏會我發現,文檔? – smartcaveman 2011-03-31 00:43:18

+2

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Eval – SLaks 2011-03-31 00:44:42

+0

@SLaks,謝謝。 「不要使用eval!」部分說eval是一種安全風險。你偶然知道關於什麼時候該關注適用的任何好的文檔/資源? – smartcaveman 2011-03-31 00:48:27

1
eval("(" + functionDeclarationAsString + ")()"); 

functionDeclaractionAsString而將某物在 function(){ alert('I came from the server'); }

EDIT

記號(functionReference)()的形式;用於調用對函數的引用。以下是有效的:

(function() { alert('it works'); })(); 

下也將是有效的:

var my_function = function(param) { alert(param); }; 
(my_function)('this is a parameter'); 
+0

爲什麼需要額外的圓括號,他們扮演什麼角色? – smartcaveman 2011-03-31 00:45:38

+0

附加圓括號表示您要調用在圓括號內聲明的函數 – 2011-03-31 01:14:07

0

可以使用邪惡eval執行給定的字符串代碼:

if (data.HasCallback) { 
    eval("("+data.Callback+"());"); 
} 

附加最後的圓括號立即執行你的功能。

Documented at the evil w3schools

1

這是一個更好的主意,以保持代碼和數據分開。要使用你的榜樣,爲什麼不能有JSON是這樣的:

{ 
    "Message": "I came from the server" 
} 

而且在你的JavaScript:

$.post('MyApp/GetPostResult.json', function(data) { 
    if (data.Message) { 
     alert(data.Message); 
    } 
}); 
+0

因爲我可以通過生成客戶端代碼服務器端來最大化代碼可重用性並縮短用戶界面實現時間。 – smartcaveman 2011-03-31 01:43:04