Как использовать jQuery для выбора узлов XML с уникальным текстовым содержимым? - PullRequest
2 голосов
/ 09 февраля 2010

Я пытаюсь вытащить список уникальных текстовых записей из документа XML «способом jQuery», и я бью стену.

Из этого XML:

<items>
  <item>
    <categories>
      <cat>Category 1</cat>
      <cat>Category 2</cat>
    </categories>
  </item>
  <item>
     <categories>
      <cat>Category 2</cat>
      <cat>Category 3</cat>
  </item>
 </items>

Я хотел бы создать список выбора, например:

<select>
 <option>Category 1</option>
 <option>Category 2</option>
 <option>Category 3</option>
</select>

Пока что все мои попытки приводят к дублированию узла опции "Категория 2". Я попытался использовать метод $ .unique (), но результаты заставляют меня думать, что он сравнивает только имя узла, а не текстовое содержимое. Вот мой последний взлом, который не работает:

var filters = $("cat",xmldoc);
filters = $.unique(filters);
$(filters).each(function()
{
    $("select").append("<option>" + $(this).text() + "</option>");
});

Я могу придумать несколько стандартных уловок javascript, чтобы это произошло, но я надеюсь, что есть хороший, элегантный способ сделать это.

Любые советы или рекомендации будут с благодарностью.

Спасибо!

1 Ответ

2 голосов
/ 10 февраля 2010

Элементы cat не являются дубликатами только потому, что они имеют одинаковое текстовое содержимое.Они по-прежнему являются элементами со своей собственной, другой идентичностью, и, следовательно, unique не удалит их.

Вместо этого вам придется читать текстовое содержимое в массив, а затем удалять дубликаты из массива.of-String.

К сожалению, вы также не можете использовать unique впоследствии для Array-of-String, потому что он поддерживает только элементы элемента DOM.

Я бы просто сделалудаление дублирования при построении списка:

var cats= [];
$('cat', xmldoc).each(function() {
    var text= $(this).text();
    if ($.inArray(text, cats)===-1)
        cats.push(text);
});

Затем добавьте каждую опцию к выбору:

$.each(cats, function() {
    $('select').append($('<option>').attr('val', this).attr('text', this));
});

Текст опции должен быть установлен с использованием attr и not путем передачи всего элемента в виде HTML.Когда вы создаете HTML из текста, вы должны экранировать HTML от любых текстовых строк, которые вы вставляете в HTML, иначе у вас будут потенциальные дыры в безопасности межсайтовых сценариев.

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