从PHP调用javascript函数 - 引用问题

时间:2015-06-27 18:20:20

标签: javascript php quotes

我正在尝试从PHP调用javascript函数。我们的想法是从文件中创建每个参数作为链接,点击时将其输入文本框。

$lines = file('http://localhost/repositories.txt');
foreach ($lines as $line_num => $line) {
    echo  "<a onclick='javascript:(document.folderForm.folderLocation.value=".htmlspecialchars($line) .");' href='#'>".htmlspecialchars($line) . "</a><br />";
}

点击我正在创建的链接时(例如):

ReferenceError: test2 is not defined

我认为参数周围应该有引号,但我无法添加它们。我尝试使用'\''但没有成功。 任何想法?

1 个答案:

答案 0 :(得分:2)

您需要引用并正确转义您分配给输入value属性的JavaScript字符串。您可以使用json_encode

echo "<a onclick='document.folderForm.folderLocation.value=".htmlspecialchars(json_encode($line)) .";' href='#'>".htmlspecialchars($line) . "</a><br />";

Demo

问题的主要原因是您的代码缺少字符串值周围的引号,因此JavaScript将其解释为标识符(变量名称)。

json_encode在值周围添加引号,更重要的是,转义值以确保它是有效的JSON字符串(它会转义换行符,回车符和引号,否则很容易导致语法错误)

JSON是JavaScript语法的子集,因此任何有效的JSON都是有效的JavaScript。 (只要在合适的背景下使用)

最后,由于值在HTML属性中,因此仍然应用htmlspecialchars来转义值。它会转义引号以确保变量值不会超出属性值,并且还会将&之类的字符转义为不被解释为HTML实体序列的开头。

最后,我建议在这种情况下反对echo,以减少引号数量并使插值更容易阅读:

$lines = file('http://localhost/repositories.txt');
foreach ($lines as $line_num => $line) { ?>
    <a onclick='document.folderForm.folderLocation.value=<?= htmlspecialchars(json_encode($line)) ?>;' href='#'><?= htmlspecialchars($line) ?></a><br />
<?php } ?>

Demo

注意:从PHP 5.4开始,PHP的短回声标记随处可用,与配置无关。如果您需要支持PHP,请将<?=切换为<?php echo。 5.4。