escape()似乎不能一致地工作?

时间:2011-10-07 14:20:14

标签: javascript string browser escaping

使用javascript,我会生成HTML代码,例如添加一个以点击链接开头的功能,例如:

$('#myDiv').append('<a href="javascript:start(\''+TERM+'\');">click</a>');

如果有人点击链接(点击),应该调用start()TERM可以包含一个单词,例如worldmoody's,生成的HTML代码如下所示:

<a href="javascript:start('world');">click</a>

OR

<a href="javascript:start('moody's');">click</a>

如您所见,第二个例子不起作用。所以我决定“逃避”TERM,就像这样:

$('#myDiv').append('<a href="javascript:start(\''+escape(TERM)+'\');">click</a>');

使用firebug查看HTML源代码,可以看到生成了以下代码:

<a href="javascript:start('moody%27s');">click</a>

这很好,直到我真的点击链接 - 所以浏览器(这里是firefox)接缝解释%27并试图解雇start('moody's');

在JS中处理该术语之前,有没有办法逃避术语持久化而不解释%27?是否有其他解决方案而不是使用正则表达式将'更改为\'

3 个答案:

答案 0 :(得分:3)

不要尝试生成内联JavaScript。那种方式太痛苦和维护地狱。 (如果你要沿着那条路走下去,那么你将使用\转义JavaScript字符串中的字符。

改为使用标准事件绑定例程。

假设$是jQuery,而不是使用该无用变量名的许多其他库之一:

$('#myDiv').append(
    $('<a>').append("click").attr('href', 'A sensible fallback').click(function (e) {
        alert(TERM); // Because I don't have the function you were calling
        e.preventDefault();
   })
);

另见http://jsfiddle.net/TudEw/

答案 1 :(得分:0)

escape()函数用于转义通过网络而不是字符串的url。我不知道有一个内置的函数来逃避JavaScript的字符串,但是你可以试试我在网上找到的那个:http://www.willstrohl.com/Blog/EntryId/67/HOW-TO-Escape-Single-Quotes-for-JavaScript-Strings

用法:EscapeSingleQuotes(strString)

编辑:注意到有关正则表达式的说明。这个解决方案 使用正则表达式,但我认为没有错: - )

答案 2 :(得分:0)

escape()用于url编码的东西,而不是用于放入字符串文字。您的代码存在严重缺陷,原因有多种。

如果您想要onclick事件,请使用onclick事件。不要试图用你的标记“注入”javascript代码。如果变量中包含“字符串”,则除非生成URL或其他受限制的术语,否则不应替换其中的任何内容。

var element = $('<span>click</span>');
element.bind('click', function () { start(TERM); });
$('#myDiv').append(element);

如果您不知道这是做什么的,那么请回到基础并了解javascript中的事件和函数引用。