代码之家  ›  专栏  ›  技术社区  ›  Eric

必须用jquery.append()指定endding标记吗?

  •  3
  • Eric  · 技术社区  · 14 年前

    我正在研究其他人的jquery脚本,我注意到他打开了一个标记而没有关闭它,但是浏览器似乎并不在意(还没有用IE测试)

    写着:

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

    但是没有一个地方

    .append('</ul>')
    

    脚本不会关闭列表,但浏览器会自动关闭(我只是在浏览器中执行了一个“inspect element”)。

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

    2 回复  |  直到 14 年前
        1
  •  4
  •   Nick Craver    14 年前

    做得好,你 应该 附加:

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

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

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

    ... 仍然 电话 .innerHTML ,不是 createElement ,仅在 $('<ul>') document.createElement() 打电话。正如我最初所说,浏览器处理它 .append() , jQuery和 document.createElement (反正不采用这种语法)。
    You can see test/play with what I mean here

        2
  •  3
  •   adamJLev    14 年前

    简而言之:你应该。

    长答案导致短答案:

    当你说 .append('<ul>') ,
    甚至 .append('<ul></ul') ,幕后jQuery调用 document.createElement 浏览器知道该怎么做。

    jQuery并不是把HTML字符串放在任何地方,而是解析它并创建必要的DOM元素

    更新- 正如尼克指出的,情况可能并不总是这样。相关来源: init 如果你只是通过 ul ,它只是打电话 createElement . 如果html字符串更复杂,它将进入 buildFragment 比这更复杂。

    基于此,我认为通过jQuery创建单个元素的最佳/最快方法是

    $('<ul>').appendTo($target);
    

    更新2- 显然jQuery只调用 createElement公司 在某些方法中,但是 append 最后打电话来 clean 它有一个关闭标记的regex。所以不管怎样,您都是安全的,jQuery照常保存您。 相关来源:

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

    更新3-因此当您调用jQuery时,它不会为您修复任何东西 追加 ,它只是将字符串注入 div 元素。似乎大多数浏览器都知道如何处理HTML,即使没有正确关闭,但要保存它,最好自己关闭它!或者如果你觉得懒,做一些像 .append($('<ul>')) 不使用innerHTML