jQuery закрытие открытых тегов - PullRequest
1 голос
/ 11 февраля 2011

При попытке проанализировать xml-файл в табличном формате jQuery продолжает закрывать мой открывающий тег <tr>. Есть ли обходной путь для этого?

<script type="text/javascript">
    $(document).ready(function(){
    $.ajax({
            type: "GET",
            url: "sample-data.xml",
            dataType: "xml",
            success: parseXml
        });
    }); 

    function parseXml(xml)
    {
      $(xml).find("user").each(function()
      {  
        var id = "#sortable";  
            $(id).append("<tr>");
            $(id).append("<td>" + $(this).find("name").text() + "</td>");
            $(id).append("</tr>");

      });
    }
</script>

<table id="table" class="tablesorter">
    <thead>
      <tr>
        <th>test</th>
      </tr>
    </thead>
    <tbody id="sortable">

    </tbody>
</table>

Вот как выводится разметка:

 <tr></tr>
 <td>data</td>

Ответы [ 4 ]

2 голосов
/ 11 февраля 2011

Просто вызовите 1 добавление вместо нескольких добавлений.

Измените эту часть:

        $(id).append("<tr>");
        $(id).append("<td>" + $(this).find("name").text() + "</td>");
        $(id).append("</tr>");

на эту:

        $(id).append("<tr><td>" + $(this).find("name").text() + "</td></tr>");
2 голосов
/ 11 февраля 2011

Я бы посоветовал не использовать append в цикле. Вместо этого выведите его за пределы цикла.

var id = $("#sortable");
var html = '';

  $(xml).find("user").each(function()
  {  

    html += '<tr>';
      html += '<td>';
          html += $(this).find("name").text( );
      html += '</td>';
    html += '</tr>';   
  });

  id.append(html);

В тех случаях, когда вы собираетесь использовать $ (this), много раз внутри цикла, например, для возраста, пола и т. Д., Я предлагаю вам присвоить переменную $ (this) вместо вызова $ (this) снова и снова и снова.

P.S Я не тестировал этот код, просто хочу что-то предложить ... но надеюсь, что он работает. Ура ^^

1 голос
/ 15 июля 2012

Я не думаю, что jQuery является виновником здесь.

Когда вы звоните append("<tr>"), что вы хотите, чтобы он делал?Ответ: Вы хотите изменить DOM согласно вашей спецификации.Но DOM - это структура данных, а не строка .Вы не можете добавить «незамкнутый» элемент в DOM, поэтому все элементы по своей сути закрыты в момент их добавления.

В результате последующий append("<td>...</td>") добавляет TDэлемент после <tr>, а не внутри него.Кроме того, любая попытка append("</tr>") просто игнорируется, поскольку она будет довольно бессмысленной, учитывая обработку append("<tr>").

1 голос
/ 11 февраля 2011

Да, JQuery на самом деле не работает. Попробуйте это:

function parseXml(xml)
{
  $(xml).find("user").each(function()
  {  
    var id = "#sortable";  
        $(id).append('<tr></tr>');
        $(id).find('tr:last').html("<td>" + $(this).find("name").text() + "</td>");

  });
}
...