2011-06-02 49 views
2

我想發送一個JSON響應函數,並試圖在js中提醒該函數。以下是代碼。JSON響應函數名稱 - 不工作

JS:

$('input').keyup(function(){ 
    $.ajax({ 
     type: "POST", 
     url: "sample.php", 
     dataType : 'json', 
     data: 'val='+$('input').val(), 
     success: function(response){ 

     var json = transport.responseText.evalJSON(); 
     alert(json.function()); // => **should alert 'foo bar' - but not** 
     } 
    }); 
}); 

PHP:

<?php 
// Our sample array 
$foo = array(
    'string' => 'bar', 
    'function'=> 'function(){return "foo bar";}' 
); 
$value_arr = array(); 
$replace_keys = array(); 
foreach($foo as $key => &$value){ 
    // Look for values starting with 'function(' 
    if(strpos($value, 'function(')===0){ 
    // Store function string. 
    $value_arr[] = $value; 
    // Replace function string in $foo with a 'unique' special key. 
    $value = '%' . $key . '%'; 
    // Later on, we'll look for the value, and replace it. 
    $replace_keys[] = '"' . $value . '"'; 
    } 
} 

// Now encode the array to json format 
$json = json_encode($foo); 

/* $json looks like: 
{ 
    "number":1, 
    "float":1.5, 
    "array":[1,2], 
    "string":"bar", 
    "function":"%function%" 
} 
*/ 
// Replace the special keys with the original string. 
$json = str_replace($replace_keys, $value_arr, $json); 

// Send to to the client 
echo $json; 

/* This echoes the following string: 
{ 
    "string":"bar", 
    "function":function(){return "foo bar";} 
} 
*/ 
?> 

什麼我在上面做錯了什麼?任何幫助表示讚賞。

+0

永遠記住,JSON就是這樣被結構化文本。 – JohnP 2011-06-02 10:13:18

回答

4

函數在JSON中不是有效的數據類型。你可以做的就是將某個函數表達式作爲字符串:

{ 
    "string": "bar", 
    "function":"function(){return \"foo bar\";}" 
} 

然後用eval

var f = eval(response['function']); 

但我不建議這樣做。這是可怕的,複雜的,不容易理解或維護。這基本上是你能做的最糟糕的事情。

你試圖解決什麼問題呢?


如果必須從服務器發送的JavaScript,那麼這樣做(不返回JSON),並使用script作爲dataType

+1

'eval'和函數編碼爲json中的一串代碼。這太可怕了: – Raynos 2011-06-02 10:13:01

+0

+1 *值可以是雙引號或數字,或者真或假或空值,或者是對象或數組,這些結構可以是嵌套的* http://json.org/ – karim79 2011-06-02 10:13:22

+0

@Raynos:我知道...... – 2011-06-02 10:14:31

5

JSON沒有任何函數表示。這是一個數據符號。即使你欺騙PHP發送函數(正如你似乎正在嘗試的那樣),客戶端上的JSON解串器也會拋出異常(理想情況下)。一些非常天真的依賴於eval的人可能會傳遞該函數,但是在那個時候,你不使用JSON,而是使用JavaScript。

如果你想發回密碼,你需要發回JavaScript。

另外,在這條線:

alert(json.function()); 

...你有一個語法錯誤。 function是JavaScript中的保留字。您不能將其用作屬性名稱文字。如果您創建一個名爲「功能」(你可以,但可能不應該),訪問它,你必須使用訪問屬性字符串表示法的屬性:

alert(json["function"]()); 

又見Gaby's answer,你似乎把一些原型代碼(evalJSON)混合成東西。