我正在尝试将项目插入到自动完成功能的javascript数组中。我从数据库中获取数组所需的值,因此我使用PHP获取它们。然后我只是将每个项目推入javascript数组。但是,它一直告诉我,我有一个“意外的令牌ILLEGAL”,看起来它指向插入的单个“引号”字符,然后有一个换行符,然后继续到实际值。
我的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...
答案 0 :(得分:1)
这是个坏主意:
echo "availableTags.push('$model');" . "\n";
如果$model
包含任何javascript元字符,尤其是'
,则会引入语法错误并终止整个<script>
块。永远不要直接将任意文本输出到Javascript上下文中 - 你基本上容易受到SQL injection attack的JS等价物的攻击。</ p>
至少,您应该使用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); ?>;
答案 1 :(得分: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)); ?>
...