Как выполнить расширенную вставку DOM с помощью jQuery append () (в правильном порядке)? - PullRequest
2 голосов
/ 28 ноября 2010

Когда я использую метод jQuery append(), результирующий вывод 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>

Ответы [ 5 ]

3 голосов
/ 28 ноября 2010

Используйте простую реализацию 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

3 голосов
/ 28 ноября 2010

Важно помнить, что .append() не добавляет HTML, он добавляет элементы DOM , сгенерированные в HTML, который вы передаете, например, <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');

Вы можете проверить это здесь .

1 голос
/ 28 ноября 2010

Вам нужно построить полную строку сначала , а затем передать ее для добавления:

 // 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);

Есть более эффективные способы построения этой строки, но ... вы поняли.

0 голосов
/ 28 ноября 2010
<script>
$('#a').html(your_html);
</script>
0 голосов
/ 28 ноября 2010

Приложение jQuery предназначено для работы с полным фрагментом HTML.Измените свой код на все append () только один раз и передайте его весь ваш код, объединенный вместе.Если вы этого не сделаете, append () автоматически закроет все открытые теги.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...