关于javascript:使用jQuery.attr()转义属性值

Escaping of attribute values using jQuery.attr()

当使用jQuery更新元素的title属性时,我发现实体(尤其是,这是当前推荐的在title属性中添加换行符的方式)未正确显示(该实体显示 而不是被解析为文本…)。

例如:

1
2
<!-- This works fine -->
baz

但是这个:

1
2
3
baz

$("div").attr('title', 'foobar'); // Escapes the &

有没有办法让jQuery逃避值? 我尝试在.attr()之前使用unescape(),但是没有用……


jQuery不会转义任何内容,实际上您的字符串实际上是设置为标题。您可以
只需使用:

1
2
$("div").attr('title','foo
bar'
)

http://jsfiddle.net/t5DvY/

逃避的含义似乎有很多误解。您在做什么完全没有必要。

转义仅在字符本来会具有特殊含义并且您不希望其具有任何特殊含义的情况下才有必要。

例如,在html解析器的眼中,<很特殊。如果要确保将其视为文字,则必须将其替换为<
<。重点放在html解析器的眼中。在javascript中,<在字符串中不以任何方式特殊,因此您可以
执行elem.setAttribute("title", '"">hi'),这就是您所得到的,元素的标题实际上就是"">hi

至于html代码点引用,它们通常是无用的。您可以简单地使用文字字符。无需编写,您只需
?。除了编写ö,您还可以编写?。这是http://jsfiddle.net/fnqDn/2/。


你是对的; unescape()在这种情况下将不起作用。您可以执行的操作与此处答案中提到的操作类似。

基本上,使用jQuery创建一个空元素,将其HTML设置为标题中所需的文本(在本例中为'foobar'),然后取回该元素的文本。

听起来有点复杂?的确如此,但是这对任何HTML实体都适用,并且实际上只是一种形式。这是代码:

1
2
3
4
baz

    var title = $('').html('foobar').text();
    $("div").attr('title', title);

或一行:

1
$('div').attr('title', $('').html('foobar').text());


如果您经常这样做,此功能将节省您的时间:

1
2
3
4
function unescp(x){
 return $('').html(x).text();
}
$("div").attr('title',unescp('foobar'));

在这里查看:http://jsfiddle.net/9Lnru/


您可以尝试将值放在隐藏元素中。然后让jQuery将该值复制到div中。我不确定它是否会不经意地通过jQuery,但是值得一试...