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

将PHP关联数组传递给JS函数触发SyntaxError该如何解决?

报错原因

你遇到的语法错误核心是HTML属性引号和JSON字符串引号嵌套冲突:
你给onclick属性用了双引号包裹,内联传参时第二个参数又用了双引号,同时json_encode默认输出的JSON字符串本身也是双引号包裹,直接把onclick属性提前截断,HTML解析时语法断裂,就会抛出Unexpected end of input错误。

修复方案

方案1:快速修复内联传参写法

对JSON结果做HTML转义,同时修正引号嵌套逻辑即可:

foreach ($staff->roles as $role) {
    $actionRoles .= $role->name . ',';
    array_push($selected_roles,['id'=>$role->id,'name'=>$role->name]);
}
// 转义JSON里的特殊字符和引号,适配HTML属性场景
$rolesJson = htmlspecialchars(json_encode($selected_roles), ENT_QUOTES);
$tableAction = '
<div class="menu-item px-3">
    <!-- 用转义后的单引号包裹JSON参数 -->
    <a onclick="editStaff(this, \''.$rolesJson.'\')" >
        Edit
    </a>
</div>
';

方案2:使用data属性传递(更推荐,易维护)

避免内联事件的引号嵌套问题,把数据存在自定义属性里,通过JS事件监听获取:

PHP代码修改

foreach ($staff->roles as $role) {
    $actionRoles .= $role->name . ',';
    array_push($selected_roles,['id'=>$role->id,'name'=>$role->name]);
}
$rolesJson = htmlspecialchars(json_encode($selected_roles), ENT_QUOTES);
$tableAction = '
<div class="menu-item px-3">
    <!-- 数据存在data属性里,去掉内联onclick -->
    <a class="edit-staff-btn" data-roles="'.$rolesJson.'" >
        Edit
    </a>
</div>
';

JS绑定事件

// 全局绑定编辑按钮点击事件
document.querySelectorAll('.edit-staff-btn').forEach(btn => {
    btn.addEventListener('click', function() {
        // 直接解析data属性里的JSON为JS数组
        const selectedRoles = JSON.parse(this.dataset.roles);
        // 调用原有编辑函数
        editStaff(this, selectedRoles);
    })
})
JS函数接收参数方式

如果用方案1的内联传参,函数内先解析JSON即可:

function editStaff(el, rolesJson) {
    // 把JSON字符串转成JS数组
    const roles = JSON.parse(rolesJson);
    // 正常使用数组,比如遍历取值
    roles.forEach(role => {
        console.log('角色ID:', role.id, '角色名:', role.name);
    })
}

如果用方案2的data属性方案,传入的已经是解析完成的数组,直接使用即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 03:06:03