2

当我使用 jQueryappend()方法时,生成的 HTML 输出不是我想要的顺序。

正如您在下面的测试用例中看到的,任何时候我打开一个DIV标签而不关闭它,它仍然是关闭的。

标签也是如此<ul>- 在我预期之前它也被关闭了 - 我希望它在<li>应该嵌套在它下面的第二个标签之后关闭。

按照编写顺序构建大块动态 HTML 的最佳方法是什么?

 $('#a').remove(); // remove #a from the dom and re-insert it dynamically
 $("<div id='a'>").insertAfter('div#main');

 $('#a').append("  <ul>");
 $('#a').append("    <li>A</li>");
 $('#a').append("    <li>B</li>");
 $('#a').append("  </ul>"); 
 $('#a').append("  <div id='X1'>");
 $('#a').append("    <div id='b'>");
 $('#a').append("      <div id='b1'></div>");
 $('#a').append("      <div id='b2'></div>");
 $('#a').append("    </div>");
 $('#a').append("    <div id='c'>");
 $('#a').append("      <p id='c1'></p>");
 $('#a').append("    </div>");
 $('#a').append("  </div>");
 $('#a').append("  <div id='X2'>B</div>");
 $('#a').append("</div>");

 <div id="main>
  <div id="a>
   <ul></ul> // <ul> tag is closed!?
   <li>A</li>
   <li>B</li>
   <div id='X1'></div> // div is closed!?
   <div id='b'> // div is closed!?
   <div id='b1'></div>
   <div id='b2'></div>
   <div id='c'></div> // div is closed!?
   <p id='c1'></p>
   <div id='X2'>B</div>
  </div>
 </div>
4

5 回答 5

3

这里要记住的重要一点是,.append()它不会附加 HTML,它会附加由您传入的 HTML 生成的DOM 元素,因此例如<ul>将是<ul></ul>您所看到的元素。

要将其隔开类似于您当前所拥有的,您需要附加每一行或\像这样使用:

$("<div id='a'>\
    <ul> \
       <li>A</li> \
       <li>B</li> \
    </ul> \
    <div id='X1'> \
     <div id='b'> \
       <div id='b1'></div> \
       <div id='b2'></div> \
     </div> \
     <div id='c'> \
       <p id='c1'></p> \
     </div> \
    </div> \
   <div id='X2'>B</div> \
  </div>").insertAfter('div#main');

你可以在这里测试一下

于 2010-11-27T23:19:57.837 回答
3

使用简单的 StringBuffer 实现,如下所示。一旦 html 完全离线缓冲,立即将其写入 DOM:

function StringBuffer() {
   this.buffer = [];
 }

 StringBuffer.prototype.append = function append(string) {
   this.buffer.push(string);
   return this;
 };

 StringBuffer.prototype.toString = function toString() {
   return this.buffer.join("");
 };

 var buf = new StringBuffer();
 buf.append('<ul>');
 buf.append('<li>A</li>');
 buf.append('</ul>');
 ...etc...
 $("#a").empty().html(buf.toString());

请参阅:http: //developer.yahoo.com/performance/rules.html

于 2010-11-27T23:20:09.527 回答
1

您需要先构建完整的字符串然后将其传递给附加:

 // this creates the div with id 'a', and inserts it into 
 // the DOM (assuming you have an existing div with id 'main')
 //
 $("<div id='a'></div>").insertAfter('div#main');

 // now you can build up additional content as a string...
 //
 var s = "  <ul>";
 s += "    <li>A</li>";
 s += "    <li>B</li>";
 s += "  </ul>"; 
 s += "  <div id='X1'>";
 s += "    <div id='b'>";
 s += "      <div id='b1'></div>";
 s += "      <div id='b2'></div>";
 s += "    </div>";
 s += "    <div id='c'>";
 s += "      <p id='c1'></p>";
 s += "    </div>";
 s += "  </div>";
 s += "  <div id='X2'>B</div>";

 // now, use the append() function to create DOM from the string,
 // and append it to the content of your div#a all at once.
 //
 $('#a').append(s);

有更有效的方法来构建该字符串,但是......你明白了。

于 2010-11-27T23:19:10.983 回答
0
<script>
$('#a').html(your_html);
</script>
于 2010-11-28T03:30:52.307 回答
0

jQuery append 旨在处理完整的 HTML 片段。仅将您的代码修改为 all append() 一次,然后将所有代码串联在一起。如果不这样做,append() 将自动关闭所有打开的标签。

于 2010-11-27T23:19:35.243 回答