javascript - PHP生成带有引号错误的Javascript代码

标签 javascript php html

我有这个 PHP 页面:

<?php

$lines = array();
$lines[] = "I am happy";
$lines[] = "I'm happy";

foreach ($lines as $line){
    $message = htmlspecialchars($line);
    ?>
    <div onclick="alert('<?=$message?>');"><div>
    <?php
}

它生成这个 HTML 结果:

<div onclick="alert('I am happy');"><div>
<div onclick="alert('I&#039;m happy');"><div>

此代码似乎是正确的,但是,单击第二个“div”元素时会发生错误。

' 字符等同于 ' 并且 javascript 生成错误:

alert('I'm happy');"

我通过添加 addslashes() PHP 函数解决了这个问题:

$lines = array();
$lines[] = "I am happy";
$lines[] = "I'm happy";

foreach ($lines as $line){
    $message = htmlspecialchars(addslashes($line));
    ?>
    <div onclick="alert('<?=$message?>');"><div>
    <?php
}

正确结果:

<div onclick="alert('I am happy');"><div>
<div onclick="alert('I\&#039;m happy');"><div>

我的问题:

这是正确/最佳的解决方案吗? 管理此类问题的最佳做法是什么?

最佳答案

不要尝试通过将字符串混合在一起来生成 JavaScript 字符串文字。 json_encode 将为您完成所有转义('"、换行等),这是您需要的 JS。它是优于 addslashes 因为它是为目标数据格式设计的并且不是通用的(通用的转义解决方案往往会遗漏一些东西)。

编码 HTML 属性值的数据是在将数据放入值之前对数据所做的最后一件事。在将数据放入 JavaScript 之前不要对 HTML 进行编码。

foreach ($lines as $line){
    $message = json_encode($line);
    $javascript = "alert($message)";
    $html = htmlspecialchars($javascript);
    ?>
    <div onclick="<?= $html ?>"><div>
    <?php
}

也就是说,现代方法通常会将 JavaScript 分开并将数据存储在数据属性中。

您还应该避免将点击事件放在 div 元素上,它们并非设计为用户控件,因此它们不能(无需更多考虑)通过(例如)聚焦元素并按 enter 来创建可访问性问题。

foreach ($lines as $line){
    $html = htmlspecialchars($line);
    ?>
    <button type="button" data-message="<?= $html ?>">...</button>
    <?php
}

<script>
function buttonAlert(event) {
    var message = event.target.dataset.message;
    if (message) {
        alert(message);
    }
}
addEventListener("click", buttonAlert);
</script>

关于javascript - PHP生成带有引号错误的Javascript代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32224545/

相关文章:

php - 如何处理 while 循环内的 foreach 中的空数组键?

php - 删除 SQL 查询中的空列

php - htmlspecialchars() 放在哪里

javascript - 从 html 表中的每一行中提取属性

javascript - ReactJS 组件 : fadeIn/fadeOut on mouse-enter/mouse-leave

javascript - 仅将 CSS 类添加到那些没有 'title' 属性的链接

html - 在不更改 CSS 的情况下在提交按钮上应用 input.button CSS?

html - 可以用显示 : table-cell to stack vertically without using display:block? 强制元素

html - 为什么 Chrome 和 Safari 中的大小不同(媒体查询问题)

javascript - 从内部回调 ES2015 访问属性