Including JavaScript in PHP's json_encode()
我需要使用PHP和json_encode()生成以下脚本。
1 2 3 4 5 6 7 | var obj= { o1:123, o2: { o3: 456, o4: function() {return $("#myID" ).val();} } } |
我这样做的尝试如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php $a=array( 'o1'=>123, 'o2'=>array( 'o3'=>456, 'o4'=>'function() {return $("#myID" ).val();}' ) ); $json=json_encode($a); ?> <script type="text/javascript"> <?php echo("var obj={$json};");?> console.log(obj); |
结果输出如下。 属性周围的引号没有问题,但是,JavaScript周围的引号将其呈现为字符串而不是JavaScript。 我显然不能在数组中引用JavaScript,因为它会导致JSON格式错误。
如何在PHP的json_encode()中包含JavaScript?
1 2 3 4 5 6 7 | var obj={ "o1":123, "o2":{ "o3":456, "o4":"function() {return $( \"#username\" ).val();}" } }; |
如何删除函数周围的引号?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <?php $obj = array( 'o1' => 123, 'o2' => array( 'o3' => 456, 'o4' => 'function() {return $("#myID" ).val();}', 'o5' => 'function(param) {return $("#myID" ).val();}' ) ); $json = json_encode($obj); while ($func = strpos($json, '":"function(')) { $json = substr($json, 0, $func + 2) . substr($json, $func + 3); while ($quote = strpos($json, '"', $func + 2)) { $func = $quote + 1; if (substr($json, $quote - 1, 1) =="\\\") { $json = substr($json, 0, $quote - 1) . substr($json, $quote); continue; } $json = substr($json, 0, $quote) . substr($json, $quote + 1); break; } } echo $json; |
这将检查字符串是否以
结果是JSON(但仍可以用作JavaScript对象):
1 | {"o1":123,"o2":{"o3":456,"o4":function() {return $("#myID" ).val();},"o5":function(param) {return $("#myID" ).val();}}} |
将此对象设置为变量后,您可以看到该函数已正确注册。
1 2 3 | <script type="text/javascript"> <?php echo("var obj={$json};");?> console.log(obj); |
JSON不支持功能。 它是一种数据交换格式。 也许您应该向下发送一些配置数据,并通过一个函数更改其行为。 或者由于此时您还没有将其作为AJAX调用进行处理,因此只需将其回显即可:
1 2 3 4 | <script type="text/javascript"> <?php echo("var obj={$json};");?> <?php echo("obj.myFunc = function..."); ?> console.log(obj); |
这就是我最终要做的。 有点骇人听闻,我希望Dave是更好的解决方案,但尚未对其进行测试。 我会这样做的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | <?php class fubar { public function json_encode_JS($array) { $array=$this->_json_encode_JS($array); $json=json_encode($array); $json=str_replace(array('"%','%"'), '', $json); $json=str_replace('\"', '"', $json); return $json; } private function _json_encode_JS($array) { foreach($array as $key => $value){ if(is_array($value)){$array[$key]=$this->_json_encode_JS($value);} else { if(strpos($value, 'function(')===0){ $array[$key]='%'.$value.'%'; } } } return $array; } } $array=array( 'o1'=>123, 'o2'=>'function() {return $("#myID").val();}', 'o3'=>array( 'o4'=>456, 'o5'=>'function() {alert("Hello why don\'t you answer"+$("#myID").val());}' ) ); ?> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.js" type="text/javascript"> <script type="text/javascript"> <?php $obj=new fubar(); echo('var obj='.$obj->json_encode_JS($array).';'); ?> console.log(obj); obj.o3.o5(); <input id="myID" name="myID" type="text" value="hello"> |