在PHP中包含JavaScript json_encode()

 2020-08-01 

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;

这将检查字符串是否以function(开头,如果是,则删除双引号。

结果是JSON(但仍可以用作JavaScript对象):

1
{"o1":123,"o2":{"o3":456,"o4":function() {return $("#myID" ).val();},"o5":function(param) {return $("#myID" ).val();}}}

将此对象设置为变量后,您可以看到该函数已正确注册。

>
</p>
<p>
这样,您仍然可以使用以前使用的相同技术:
</p>
<div class=

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">