我从一个数据库中输出值(它并不真正对公众开放,但它对公司的用户开放——这意味着,我不担心XSS)。

我试图输出一个这样的标签:

<a href="" onclick="DoEdit('DESCRIPTION');">Click Me</a>

DESCRIPTION实际上是一个来自数据库的值,它是这样的:

Prelim Assess "Mini" Report

我尝试用“\”替换“”,但无论我怎么尝试,Firefox总是在单词evaluate后的空格后面切断我的JavaScript调用,这导致了各种各样的问题。

我肯定错过了那个显而易见的答案,但我怎么也想不出来。

有人想指出我的愚蠢吗?

这里是整个HTML页面(它将是一个ASP。NET页面最终,但为了解决这个问题,我拿出了一切,但问题代码)

<html>
    <body>
        <a href="#" onclick="DoEdit('Preliminary Assessment \"Mini\"'); return false;">edit</a>
    </body>
</html>

当前回答

您可以复制这两个函数(下面列出),并使用它们来转义/反转义所有引号和特殊字符。您不必使用jQuery或任何其他库来实现这一点。

function escape(s) {
    return ('' + s)
        .replace(/\\/g, '\\\\')
        .replace(/\t/g, '\\t')
        .replace(/\n/g, '\\n')
        .replace(/\u00A0/g, '\\u00A0')
        .replace(/&/g, '\\x26')
        .replace(/'/g, '\\x27')
        .replace(/"/g, '\\x22')
        .replace(/</g, '\\x3C')
        .replace(/>/g, '\\x3E');
}

function unescape(s) {
    s = ('' + s)
       .replace(/\\x3E/g, '>')
       .replace(/\\x3C/g, '<')
       .replace(/\\x22/g, '"')
       .replace(/\\x27/g, "'")
       .replace(/\\x26/g, '&')
       .replace(/\\u00A0/g, '\u00A0')
       .replace(/\\n/g, '\n')
       .replace(/\\t/g, '\t');

    return s.replace(/\\\\/g, '\\');
}

其他回答

您需要转义写入DoEdit的字符串,以清除双引号字符。它们会导致onclick HTML属性过早关闭。

使用JavaScript转义字符\在HTML上下文中是不够的。您需要将双引号替换为适当的XML实体表示,&quot;。

您可以复制这两个函数(下面列出),并使用它们来转义/反转义所有引号和特殊字符。您不必使用jQuery或任何其他库来实现这一点。

function escape(s) {
    return ('' + s)
        .replace(/\\/g, '\\\\')
        .replace(/\t/g, '\\t')
        .replace(/\n/g, '\\n')
        .replace(/\u00A0/g, '\\u00A0')
        .replace(/&/g, '\\x26')
        .replace(/'/g, '\\x27')
        .replace(/"/g, '\\x22')
        .replace(/</g, '\\x3C')
        .replace(/>/g, '\\x3E');
}

function unescape(s) {
    s = ('' + s)
       .replace(/\\x3E/g, '>')
       .replace(/\\x3C/g, '<')
       .replace(/\\x22/g, '"')
       .replace(/\\x27/g, "'")
       .replace(/\\x26/g, '&')
       .replace(/\\u00A0/g, '\u00A0')
       .replace(/\\n/g, '\n')
       .replace(/\\t/g, '\t');

    return s.replace(/\\\\/g, '\\');
}

可以使用escape()和unescape() jQuery方法。像下面,

使用转义(str);使用unescape(str_esc)转义字符串并再次恢复。

“;在这个特殊的情况下,就像我之前建议的,因为HTML上下文。

然而,如果你想让你的JavaScript代码在任何上下文中独立转义,你可以选择原生JavaScript编码: '变成\x27 变成了\x22

所以你的onclick会变成:DoEdit('初步评估\x22Mini\x22');

例如,当将JavaScript字符串作为参数传递给另一个JavaScript方法时(alert()是一个简单的测试方法),这也可以工作。

我指的是重复的堆栈溢出问题,我如何转义一个onClick处理程序内的JavaScript代码中的字符串?

我已经使用jQuery做了一个示例

var descr = 'test"inside"outside';
$(function(){
   $("#div1").append('<a href="#" onclick="DoEdit(descr);">Click Me</a>');       
});

function DoEdit(desc)
{
    alert ( desc );
}

这在Internet Explorer和Firefox中都有效。