0

我正在尝试将项目插入到自动完成功能的 javascript 数组中。我从数据库中获取数组所需的值,因此我使用 PHP 获取它们。然后我只是将每个项目推入 javascript 数组。但是,它一直告诉我我有一个“意外的令牌非法”,看起来它指向插入的单个“引号”字符,然后有一个换行符,然后继续到实际值。

我的 javascript/PHP

<script type="text/javascript">
        $(function() {
           var availableTags = [];
           <?php

              foreach ($modelList as &$model)
                 echo "availableTags.push('$model');" . "\n";
           ?>
           $("#devicemod").autocomplete({
                 source: availableTags
           });
        });


        </script>

然后错误信息...

$(function() {
               var availableTags = [];
               availableTags.push('
***Uncaught SyntaxError: Unexpected token ILLEGAL***
ODEL: T]422P');availableTags.push('');availableTags.push('!');availableTags.push('!6.1/120{ MODEL: TM402P');availableTags.push('!A`$');availableTags.push('!DP1110   CREATED ON: JAN 29 2002');availableTags.push('!MODEL: TM402P');

结果应该是...

availableTags.push('ODEL:T]422P');
availableTags.push('');
etc...
4

2 回答 2

1

使用json_encode()您可以在一个(且安全的)步骤中执行此操作:

<script type="text/javascript">
$(function() {
   $("#devicemod").autocomplete({
       source: <?php echo json_encode($modelList); ?>
   });
});
</script>

json_encode()函数确保根据 JavaScript 符号规则正确转义值。在这种情况下,当值包含单引号时,这可以防止令人讨厌的意外。

如果$modelList不是真正的列表(即键没有按顺序编号),则应array_values()首先申请:

...
       source: <?php echo json_encode(array_values($modelList)); ?>
...
于 2013-07-23T15:56:10.117 回答
1

这是一个坏主意:

   echo "availableTags.push('$model');" . "\n";

如果$model包含任何 javascript 元字符,特别是',您将引入语法错误并杀死整个<script>块。永远不要直接将任意文本输出到 Javascript 上下文中——你基本上容易受到相当于SQL 注入攻击的 JS 攻击

至少,您应该使用它json_encode()来保证您的文本在语法上对于您使用它的上下文是有效的:

echo 'availableTags.push(' . json_encode($model) . ");\n";

或者更好……当你可以自动生成一个数组时,为什么还要推动所有这些?

<?php
$data = array();
foreach ($modelList as $model) {
   $data[] = $model;
}
?>
var availableTags = <?php echo json_encode($data); ?>;
于 2013-07-23T15:53:22.740 回答