【问题标题】:Must I specify endding tag with jquery.append()?我必须用 jquery.append() 指定结束标记吗?
【发布时间】:2010-11-15 05:45:52
【问题描述】:

我正在研究别人的 jquery 脚本,我注意到他打开一个标签而不关闭它,但似乎浏览器也不在乎(尚未用 IE 测试)

上面写着:

$('#mydiv').append('<ul>')

但是哪里都没有

.append('</ul>')

脚本不会关闭列表,但浏览器会自动关闭(我只是在浏览器中做了一个“检查元素”)。

这是一种“合法”行为,还是应该始终关闭 javascript 自动生成内容中的标签?

【问题讨论】:

    标签: javascript jquery html


    【解决方案1】:

    要正确地做到这一点,您应该附加:

    $('#mydiv').append('<ul></ul>')
    

    是的,浏览器会处理它(特别是 .innerHTML 实现会处理它,不是 jQuery),至少是主要的,但为什么不能在所有情况下都安全并使用有效的标记?

    $('#mydiv').append('<ul>')
    

    ...仍然调用.innerHTML,而不是createElement,仅在$('&lt;ul&gt;') 中调用document.createElement()。正如我最初所说,浏览器使用 .append()not jQuery 和 not document.createElement 来处理它(无论如何都不会采用这样的语法)。
    You can see test/play with what I mean here

    【讨论】:

    • 自从我看到document.createElement 被用于init,我想它会在append 中做同样的事情,例如应用一些正则表达式来获取实际的标签名称并调用createElement。事实证明它比这更棘手,可能是为了提高效率
    【解决方案2】:

    简短的回答:你应该。

    长答案导致短答案:

    当你说.append('&lt;ul&gt;')时,
    甚至.append('&lt;ul&gt;&lt;/ul'),在幕后jQuery 调用document.createElement 并且浏览器知道该做什么。

    这并不像 jQuery 实际上将 HTML 字符串放在任何地方,而是解析它并创建必要的 DOM 元素

    更新- 正如尼克指出的那样,情况可能并非总是如此。相关来源:init 如果你只传递ul,它只会调用createElement。如果html字符串比较复杂,会进入buildFragment,比这更复杂。

    基于此,我想说通过 jQuery 创建单个元素的最佳/最快方法是执行类似

    的操作
    $('<ul>').appendTo($target);
    

    更新 2- 所以显然jQuery在某些方法中只调用createElement,但append最终调用clean,它有一个关闭标签的正则表达式。所以无论哪种方式,你都是安全的,jQuery 像往常一样拯救你。 相关来源:

    ...
    
    } else if ( typeof elem === "string" ) {
      // Fix "XHTML"-style tags in all browsers
      elem = elem.replace(rxhtmlTag, "<$1></$2>");
    
      ...
    

    更新 3- 所以当你调用 append 时,jQuery 并没有为你解决任何问题,它只是将字符串注入到一个临时的 div 元素中。似乎大多数浏览器即使没有正确关闭也知道如何处理 HTML,但为了保存它可能最好自己关闭它!或者,如果您觉得懒惰,请执行类似 .append($('&lt;ul&gt;')) 之类的操作,它不使用 innerHTML

    【讨论】:

    • “这不像 jQuery 实际上将 HTML 字符串放在任何地方”...正是它所做的,它创建一个文档片段,然后根据所提供的内容设置 HTML .这个答案一点也不正确,它是innerHTML 处理这个,不是 jQuery 或createElement
    • 嗯.. 在对 jQuery 源代码进行了更仔细的检查之后,它似乎使用了这两种方法,具体取决于位置。例如。如果你只传递'ul',它只会创建那个元素:james.padolsey.com/jquery/#v=1.4&fn=init
    • @Infinity - 是的,在这种特定情况下(但不是.append(),您正在查看处理$('&lt;ul&gt;')的代码)。您的其余答案也不正确,.append('&lt;ul&gt;&lt;/ul') 不是由 jQuery 处理的,而是由.innerHTML 处理的。
    • 做了更多的挖掘.. 更新了我的答案。很高兴知道这一切
    • @Infinity - 仍然是错误的,它只会关闭某些自关闭(在 XHTML 中)标签,请查看正则表达式:rxhtmlTag = /&lt;(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^&gt;]*)\/&gt;/ig,。在这里测试:jsfiddle.net/nick_craver/RqVtt
    猜你喜欢
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多