You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP含空格元素数组传递至JS函数时出现语法错误求助

解决PHP数组含空格/换行时传递到JavaScript函数的语法错误

问题原因

你的代码报错是因为json_encode($value)生成的JSON字符串中可能包含换行符、双引号等特殊字符,直接拼接到onclick的单引号属性里时,会破坏HTML属性的语法结构,导致JavaScript解析时出现字符串字面量未转义换行的错误。比如JSON里的换行被HTML解析为实际换行,打断了JS的字符串;或者特殊字符和属性引号冲突。

方案一:转义JSON字符串并规范HTML属性引号

修改PHP代码,用htmlspecialchars转义JSON字符串,同时将onclick属性用双引号包裹,避免字符串冲突:

$db = Db::getInstance();
$sql = "select * from users ";
$record = $db->query($sql);
$i = 1;
foreach ($record as $key => $value) {
    // 转义JSON中的特殊字符,ENT_QUOTES同时转义单双引号
    $jsonData = htmlspecialchars(json_encode($value), ENT_QUOTES);
    // onclick用双引号包裹,参数用单引号
    echo "<tr><td><a onclick=\"editRecord('$jsonData')\" data-toggle='modal' data-target='#userModal' href='#'><i class='icon-pencil'></i></a></td></tr>";
}

JS函数保持不变即可:

function editRecord(n) {
    let p = JSON.parse(n);
    console.log(p['U_name']);
}

方案二:使用data属性存储数据(更推荐)

这种方式避免直接在onclick中拼接字符串,更安全易维护,也不需要复杂的转义:

PHP代码

$db = Db::getInstance();
$sql = "select * from users ";
$record = $db->query($sql);
$i = 1;
foreach ($record as $key => $value) {
    $jsonData = htmlspecialchars(json_encode($value));
    // 将JSON数据存在data-user属性中
    echo "<tr><td><a class='edit-link' data-user='{$jsonData}' data-toggle='modal' data-target='#userModal' href='#'><i class='icon-pencil'></i></a></td></tr>";
}

JavaScript代码

// 页面加载完成后绑定点击事件
document.addEventListener('DOMContentLoaded', function() {
    document.querySelectorAll('.edit-link').forEach(link => {
        link.addEventListener('click', function() {
            // 从data属性获取并解析JSON
            let p = JSON.parse(this.dataset.user);
            console.log(p['U_name']);
        });
    });
});

说明

  • htmlspecialchars会将HTML特殊字符(如双引号、换行、小于号等)转义为实体,避免破坏HTML结构和JS语法。
  • 方案二遵循了行为与结构分离的原则,代码更清晰,也能避免因字符串拼接带来的潜在安全问题(比如XSS风险)。

内容的提问来源于stack exchange,提问作者kian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 05:25:18