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(),但是没有用……
-
即使在html上下文中jsfiddle.net/t5DvY/1也没有必要
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/。
-
如果没有转义,为什么没有显示为换行符?直接将其放入属性时会执行此操作。
-
@ Artefact2当您将属性直接放在html中时,它由html解析器解释,它将转义序列转换为
。设置.attr时,该值按字面值使用,因此您使用字面值。 被html转义,当不转义时,它成为换行符
(0x0A)
-
这应该是公认的答案。这是金色的:Escaping is only necessary in a context ...。当您开始阅读该主题时,会有很多困惑。
你是对的; 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()); |
-
这是令人难以置信的复杂,您可以只使用foo
bar。那就是html unescape之后字符串变成的东西。 htmlUnescape(foobar) === foo
bar
-
这就是我想要的,谢谢!因为这也适用于其他实体(其他人都专注于换行符,这是我最讨厌的示例)。
-
@ Artefact2,您不需要首先使用任何实体。再给我一个例子。任何给定的实体"YYYY;"都可以替换为\uYYYY。
-
@ Artefact2:完全是哈哈。发布此内容后,我认为对于换行符来说可能有点过分,但我喜欢它,因为它适用于所有实体。
-
此外,任何代码点引用(YYYY;,\uYYYY ...)都可以替换为文字字符。
-
@Esailija能否请您发表评论为答案? \uYYYY显然不是众所周知的。我不知道。 :D
如果您经常这样做,此功能将节省您的时间:
1 2 3 4
| function unescp(x){
return $('').html(x).text();
}
$("div").attr('title',unescp('foobar')); |
在这里查看:http://jsfiddle.net/9Lnru/
?
您可以尝试将值放在隐藏元素中。然后让jQuery将该值复制到div中。我不确定它是否会不经意地通过jQuery,但是值得一试...