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

传递含双引号的字符串参数时出现引号语法错误,求解决方案

引号错误修复求助

传递内部包含双引号的字符串作为参数时出现引号错误,错误截图如下:

引号错误

原代码:

function renderHTML(courseRender) {
    const render = courseRender.map(function (course) {
        return (
            `
                <li class='course-item-${course.id}'>
                <b>${course.name}</b>
                <button onclick="handleDeleteCours(${course.id})" class='btn-del'>Delete</button>
                <button onclick="innitValueInForm('${course.name}', '${course.description}', '${course.id}')" class="btn-edit">Update</button> 
                <p>${course.description}</p>
                </li>
        
        `
    )
})
    ulElement.innerHTML = render.join('')
}

function innitValueInForm(nameValue, desValue, id){
    const btn_creat = document.querySelector('.btn-creat')
    btn_creat.className = 'btn-update'
    btn_creat.innerHTML = 'Update'

    document.querySelector('input[name="name"]').value = nameValue
    document.querySelector('input[name="description"]').value = desValue

    btn_creat.onclick = function(){
        const dataUpdate = {
            name: document.querySelector('input[name="name"]').value,
            description: document.querySelector('input[name="description"]').value
        }
    }
}

已尝试的修改:

<button onclick="innitValueInForm(\`${course.name}\`, \`${course.description}\`, '${course.id}')" class="btn-edit">Update</button>

<button onclick="innitValueInForm('${course.name.replace(/'/g, "\\'")}', '${course.description.replace(/'/g, "\\'")}', '${course.id}')" class="btn-edit">Update</button>

修复方案

方案一:避免内联onclick,使用事件委托(推荐)

内联事件处理函数容易引发引号冲突、XSS风险,且代码耦合性高。改用事件委托更安全可靠:

function renderHTML(courseRender) {
    const render = courseRender.map(course => `
        <li class='course-item-${course.id}' data-id="${course.id}">
            <b>${course.name}</b>
            <button class='btn-del'>Delete</button>
            <button class="btn-edit" data-name="${course.name}" data-description="${course.description}" data-id="${course.id}">Update</button> 
            <p>${course.description}</p>
        </li>
    `).join('');
    ulElement.innerHTML = render;
}

// 给父元素ul绑定事件委托
ulElement.addEventListener('click', function(e) {
    const target = e.target;
    // 处理删除按钮
    if(target.classList.contains('btn-del')) {
        const id = target.closest('.course-item').dataset.id;
        handleDeleteCours(id);
    }
    // 处理编辑按钮
    if(target.classList.contains('btn-edit')) {
        const { name, description, id } = target.dataset;
        innitValueInForm(name, description, id);
    }
});

方案二:正确转义双引号和单引号

如果一定要保留内联onclick,需要同时转义字符串中的单引号和双引号:

// 转义函数
function escapeAttrValue(str) {
    return str.replace(/'/g, "\\'").replace(/"/g, '\\"');
}

function renderHTML(courseRender) {
    const render = courseRender.map(function (course) {
        const escapedName = escapeAttrValue(course.name);
        const escapedDesc = escapeAttrValue(course.description);
        return (
            `
                <li class='course-item-${course.id}'>
                <b>${course.name}</b>
                <button onclick="handleDeleteCours(${course.id})" class='btn-del'>Delete</button>
                <button onclick="innitValueInForm('${escapedName}', '${escapedDesc}', '${course.id}')" class="btn-edit">Update</button> 
                <p>${course.description}</p>
                </li>
        
        `
    )
})
    ulElement.innerHTML = render.join('')
}

说明

  • 方案一的事件委托不仅解决了引号冲突,还提升了代码可维护性,避免重复绑定事件,同时降低XSS风险。
  • 方案二的转义需要覆盖所有可能的引号类型,否则仍会出现语法错误。

内容的提问来源于stack exchange,提问作者Nguyễn Ngọc Ngân Hà

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 06:23:10