Javascript jQuery';函数的作用是:使用html特殊字符来分隔html?

Javascript jQuery';函数的作用是:使用html特殊字符来分隔html?,javascript,jquery,html,Javascript,Jquery,Html,请查看以下代码: 在第一个链接中,有一个title属性,包含html特殊字符,后跟“!”(后面跟哪个字符并不重要)。 当我们使用jQuery的attr()函数获取title属性的值时,html被破坏了(您可以看到没有“我不确定您是在问问题还是在寻找问题的解决方案。如果是后者,那么奇怪的是,这似乎工作得很好:<; 更新代码: HTML: ​ jQuery: $('a').each(function() { $('body').append($(this).attr('title'

请查看以下代码:

在第一个链接中,有一个title属性,包含html特殊字符
,后跟“!”(后面跟哪个字符并不重要)。
当我们使用jQuery的attr()函数获取title属性的值时,html被破坏了(您可以看到没有“我不确定您是在问问题还是在寻找问题的解决方案。如果是后者,那么奇怪的是,这似乎工作得很好:
<;

更新代码:

HTML:



jQuery:

$('a').each(function() {
    $('body').append($(this).attr('title')); });

// just to exclude that it's append() function's fault :)
$('body').append("<div style='color:red'>This is the less than sign: &lt;! Now you know it?</div>");​
$('a').each(function() {
    $('body').append($(this).attr('title')); });

// just to exclude that it's append() function's fault :)
$('body').append("<div style='color:red'>This is the less than sign: &lt;! Now you know it?</div>");​
$('a')。每个(函数(){
$('body').append($(this.attr('title');});
//只是为了排除它是append()函数的错误:)
$('body').append(“这是小于号:!现在你知道了吗?”);​
更新小提琴:


文本没有丢失问题是它被注释了,因为
与被翻译成
相同
这是小于号:<!现在你知道了吗?

为什么会发生这种情况? 这是因为
!现在您知道了吗?
被转换为

根据HTML标准
注释结构的开始和结束。注意,这是注释结构而不是注释。因此,browwer将其余部分转换为注释,除非它获得结束分隔符

如何解决? 你已经知道了。使用
&;
来替换
&
。所以写
<;!
而不是
。这将使
附加到body元素,而不是
,后者是注释结构

在这种情况下

title="<div style='color:red'>This is the less than sign: &lt;! Now you know it?</div>"

如果要保留HTML实体,请使用
div
作为
处理。或者,
<;div&;gt;
将在浏览器窗口中实际呈现

见:

因此,如果您希望浏览器实际显示
,请使用以下命令:
<!

这很有趣。我查了a中的文本,参考资料说:

用户代理应按如下方式解释属性值:

  • 用字符替换字符实体,
  • 忽略换行
  • 用一个空格替换每个回车或制表符

  • 显然,这是预期的行为。
    被解析为
    没有什么真正的错误

    问题是html内部属性必须进行编码。您已经对
    进行了编码,实际上这是由浏览器直接完成的


    如果你看

    var e = document.createElement('div');
    e.innerHTML = '<!';
    console.log(e.innerHTML);
    
    var e=document.createElement('div');
    

    e、 innerHTML='在属性中包含HTML代码有效吗?我从JSFIDLE添加了您的代码。因此,问题和答案应该是完全“自包含的”“。标题不应包含任何HTML。有些人确实会将链接悬停,然后看到代码。你看到W3C标准了吗?请看我的答案@ErikE:在属性中包含转义代码是有效的。那么在我看来,它就像jQuery中的一个bug。请尝试归档并链接到问题。我想看到官方的回应。@JanDvorak,你可以随时去IRC频道问问自己;)没有jQuery错误。问题在于将文本作为HTML使用。问题不在于如何使其工作,而在于为什么在当前的形状和形式中它不工作。@KingKongFrog补充了为什么您仍然没有回答最终的原因--您回答了
    启动HTML注释的近似原因。但是为什么属性需要双重编码呢?这只是因为OP将HTML塞进了它不属于的地方。因此,为了安全起见,如果以编程方式编码属性,那么所有的
    字符不应该都是
    &;lt?一个实体后面的角色可以决定该实体的表示方式,这是一件非常令人讨厌的事情。@ErikE,这取决于你想做什么。看到这里的区别了吗:你回答了问题,但没有解决更重要的问题,即OP不应该这样做。@ErikE,嗯?也许你没听到这句话?“在所有情况下,属性中不应包含HTML实体”我关心的不是“如何转义实体”,而是“将HTML放在标题属性中,转义与否”。如果要转义作为有效字符实体编码一部分的符号,那么你怎么能把一个符号和作为字符实体编码的一部分放在那里呢?但是你有一个未替换的符号和在那里。所以你应该做
    &;amp;amp;lt。但是,仍然没有被取代!所以
    &;amp;amp;amp;lt。等待--
    &;amp;amp;amp;amp;lt。否,
    &;amp;amp;amp;amp;amp;lt。啊!问题是为什么双重逃跑?如果规则是,如您所说,
    用字符替换字符实体
    ,那么
    怎么不做这项工作呢?它逃走了。@ErikE:不太可能。在解析HTML时,浏览器将用各自的字符替换字符实体。您只是转义了两次,因此您检索的值是两次转义代码的未转义版本,该代码只转义一次。@ErikE:想解释一下如何转义吗?我从来没有将HTML放入工具提示中,所以我不知道您为什么需要这样做,但这样做本身并没有任何错误。@ErikE:这不是问题的关键。问题是为什么属性的值在从解析器传递到脚本或样式表时发生变化。即使这样做“正确”,也会出现同样的问题:
    append
    信息+1。我调查过,它确实发生在
    append
    上。你知道为什么
    被认为是注释的开始吗?@RicardoLohmann因为html注释
    
    <div style='color:red'>This is the less than sign: <!-- Now you know it? --></div>
    <div style='color:red'>This is the less than sign: < ! Now you know it?</div> 
    
    <!-- this is a comment -->
    <!-- and so is this one,
        which occupies more than one line -->
    
     comment declaration =
        MDO ("<!"), (comment, ( s | comment )* )?, MDC (">")
     comment =
        COM ("--"), SGML character*, COM ("--")
    
    title="<div style='color:red'>This is the less than sign: &lt;! Now you know it?</div>"
    
    title="&lt;div style='color:red'&gt;This is the less than sign: &amp;lt;! Now you know it?&lt;/div&gt;"
    
    &amp;lt;
    
    var e = document.createElement('div');
    e.innerHTML = '<!';
    console.log(e.innerHTML);