如何在PHP中编码javascript函数?我想用数组
编码回调函数$options = array(
'title' => 'Title',
'fnCallback' => someCallback);
相当于ini javascript
var options = {
'title': 'Title',
'fnCallback': someCallback };
我知道我的PHP代码错了,我该如何修复它?谢谢你的进步。
答案 0 :(得分:7)
Viola我用Zend_JSON编码器解决了我的问题
$options = array(
'title' => 'Title',
'fnCallback' => new Zend_Json_Expr('someCallback')
);
Zend_Json::encode(
$options,
false,
array('enableJsonExprFinder' => true));
答案 1 :(得分:5)
JSON用于传递值,它们不适合传递代码片段。
您可以传递函数名称或其他有意义的值,并在JavaScript端检索正确的函数来调用它。
答案 2 :(得分:1)
要使通知在PHP中消失,只需在引号中编写回调函数:
$options = array(
'title' => 'Title',
'fnCallback' => "someCallback");
然后当您在Javascript中收到JSON时,您可以将回调函数名重新映射到实际的JS函数,例如:
json = $.getJSON(..);
json.fnCallback = window[json.fnCallback]; // for global callbacks
答案 3 :(得分:1)
如果不考虑惯例并自己实施,那是不可能的。
说,你有这个JSON
'{"title": "Title", "fnCallback": "someCallback" }'
然后你可以在客户端
function wireupCallbacks(jsonObject) {
if (typeof jsonObject === "object") {
for (var prop in jsonObject) {
var callbackName = jsonObject[prop];
if (/Callback$/.test(prop) && typeof callbackName === "string") {
if (typeof this[callbackName] === "function") {
jsonObject[prop] = this[callbackName];
}
}
}
}
return jsonObject;
}
并在提供回调函数的对象的上下文中调用它
var someObject = {
someCallback: function() { alert("It works!"); }
}
var jsonObject = {"title": "Title", "fnCallback": "someCallback" };
wireupCallbacks.call(someObject, jsonObject);
jsonObject.fnCallback(); // alerts "It works!"
缺少什么:
"*Callback"
的属性。window
对象的属性)自己添加这些功能,这些功能都不难实现。
答案 4 :(得分:0)
你忘记了'title'和'fnCallback'之间的逗号。
答案 5 :(得分:0)
不要将JSON混淆为实际的原生Javascript对象表示法语法(无论名称如何)。 Javascript对象可以包含函数引用; JSON不能。
答案 6 :(得分:0)
Voici le code que j'utilise pour faire cela:
//~ [FUNCTION]
function __json_encode($mVar,$fnCallback="stripcslashes") {
return preg_replace_callback('#"[ ]{0,}function[ ]{0,}\([^)$]{0,}\)[ ]{0,}\{[ ]{0,}(?(?![ ]{0,}}[ ]{0,}").){0,}[ ]{0,}\}[ ]{0,}"([(?,")|(?\}{0,}$)]{0,})#si',
function ($aRes) use ($fnCallback) {
for($aRes[0]=substr($aRes[0],1),$sOut="",$i=0,$iOpen=0,$iClose=0;$i<= strlen($aRes[0]) && $sOut.= substr($aRes[0],$i,1);$i++)
if (substr($aRes[0],$i,1) == "{") $iOpen++;
else if (substr($aRes[0],$i,1) == "}" AND $iOpen == ++$iClose) break;
return is_callable($fnCallback) ? $fnCallback($sOut).$aRes[1] : $sOut.$aRes[1];
},json_encode($mVar)
);
}
//~ [TEST]
print "<script>\n";
print sprintf(
"\tvar oTest = %s;",
__json_encode(
array(
"Numeric"=>1,
"string"=>"hello world !",
"myFunction"=>"function(test) { if (test==1) { alert('myFunction(1)'); return true; } else return false; }",
"myObject"=>array(
"Numeric"=>1,
"string"=>"hello world !",
"myFunction"=>"function(test) { alert('myFunction(1)'); return true; }")
)
)
);
print "\n\tif (oTest.myFunction(1) == false) alert('myFunction(0)');";
print "\n\tif (oTest.myObject.myFunction(0) == false) alert('myFunction(0)');";
print "\n</script>";
Voicilerésultat:
<script>
var oTest = {
"Numeric":1,
"string":"hello world !",
"myFunction":function(test) { if (test==1) { alert('myFunction(1)'); return true; } else return false; },
"myObject":{
"Numeric":1,
"string":"hello world !",
"myFunction":function(test) { alert('myFunction(1)'); return true; }
}
};
if (oTest.myFunction(0) == false) alert('myFunction(0)');
if (oTest.myObject.myFunction(1) == false) alert('myFunction(0)');
</script>
CDT
答案 7 :(得分:0)
我喜欢this comment中的想法,因此我对此进行了扩展。
这使用唯一的ID进行替换,因此不太可能出现任何字符冲突或意外替换。您也可以使用GUID。
$callback_uuid = uniqid();
$config = [
'foo' => 'bar',
'callback' => $callback_uuid,
];
$json = json_encode($config, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT);
// Replace UUID with JS function, and remove the surrounding quotations.
// Note: This avoids putting '$0' in the string, because regexes replace that.
$callback_js = "function(value){return'$'+value+(value?'K':'');}";
$json = preg_replace("/\"$callback_uuid\"/", $callback_js, $json);
或者,如果您需要将JSON放入URL中,并且只需要在编码之前定义JS的好方法,则可以使用Heredoc string:
$config = <<<EOF
{
foo: "bar",
callback: function(value){return'$'+value+(value?'K':'');}
}
EOF;