我正在尝试在JSON响应中发送一个函数,并尝试在js中提醒该函数。以下是代码。
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 :(得分:5)
JSON没有任何函数表示。这是一种数据符号。即使您欺骗PHP发送函数(正如您似乎试图这样做),客户端上的正确的 JSON反序列化器也会抛出异常(理想情况下)。一些非常天真的依赖eval
的人可能会通过该函数,但此时,你没有使用JSON,而是使用了JavaScript。
如果您要发回代码,则需要发回JavaScript。
另外,在这一行:
alert(json.function());
...你有语法错误。 function
是JavaScript中的保留字。您不能将其用作属性名称文字。如果您创建一个名为“function”的属性(您可以,但可能不应该),要访问它,您必须使用字符串表示法来访问属性:
alert(json["function"]());
另请参阅Gaby's answer,您似乎已将某些原型代码(evalJSON
)混合在一起。
答案 1 :(得分:4)
函数不是JSON中的有效数据类型。你可以做的是将函数表达式发送为字符串:
{
"string": "bar",
"function":"function(){return \"foo bar\";}"
}
然后使用eval
:
var f = eval(response['function']);
但我不建议这样做。这是可怕的,复杂的,不易理解或维护。这基本上是你能做的最糟糕的事情。
你试图解决什么问题?
如果您必须从服务器发送JavaScript,请执行此操作(不要返回JSON),并将script
用作dataType
。
答案 2 :(得分:1)
您显然正在使用http://solutoire.com/2008/06/12/sending-javascript-functions-over-json/
中的代码行transport.responseText.evalJSON();
在jQuery中没有任何意义..
另请查看http://json.org/,您将看到函数不应该使用JSON。有关更多说明,请阅读Is it valid to define functions in JSON results?