2014-01-06 3 views
1

У меня есть следующий HTML:Jquery добавить Li элементов в массив

 <ul id="note-item-lists" class="list-group list-group-sp"> 
    <li id="1" class="list-group-item"> 
     <div id="note-4" class="view"> 
      <button class="destroy close hover-action">×</button> 
      <div class="note-name"> 
       <strong id="new_note_title"> New note </strong> 
      </div> 
     </div> 
    </li> 
    <li id="2" class="list-group-item"> 
     <div id="note-4" class="view"> 
      <button class="destroy close hover-action">×</button> 
      <div class="note-name"> 
       <strong id="new_note_title"> Old note </strong> 
      </div> 
     </div> 
    </li> 
    </ul> 

Теперь я хочу сохранить эти два <li> «S в массив.

Для этой цели я создал следующий код: яваскрипт

var notes = new Array(); 

$('.list-group-item').each(function(){ 
    notes[$(this).id] = $(this); 
}); 

Однако когда я отладки я получаю пустые array каких-нибудь идеи?

+0

Возможно, вы просто хотите: 'var $ lis = $ ('. List-group-item')'. Это лучше, чем массив для хранения элементов DOM, это коллекция jQuery. Что вы пытаетесь сделать с этими идентификаторами? Почему они важны для вашего массива? – elclanrs

+0

@elclanrs Вышеприведенный пример длинного списка, сгенерированного php :). В реальном приложении будет несколько сотен элементов, где идентификатор совпадает с идентификатором ссылки базы данных. –

+0

Почему вы не можете хранить свою DOM в коллекциях jQuery. Когда вам нужно получить некоторые элементы и получить их идентификаторы, отфильтруйте коллекцию, сопоставьте идентификаторы, а затем '.toArray'. Держитесь за свои коллекции jQuery столько, сколько сможете, это мой совет. – elclanrs

ответ

2

Вы почти у цели. id является свойством узла DOM, а не объекта jQuery, поэтому вы должны использовать this.id вместо $(this).id.

var notes = []; 
$('.list-group-item').each(function() { 
    notes[this.id] = $(this); 
}); 

Имейте в виду, что ваш первый li элемент имеет id из 1, но Javascript массивы нулевой индексируются, поэтому первый элемент notes (т.е. notes[0]) будет undefined. Я хотел бы предложить только толкая их на массив в порядке их появления:

var notes = []; 
$('.list-group-item').each(function() { 
    notes.push($(this)); 
}); 
+0

также заметки - это не массив, он должен быть объектом –

+0

@Peter за вашу помощь! Идентификатор необходим для последующего поиска. однако я думал, что javascript не имеет ничего, что сравнивается с хэшмапом? Имеет ли это? –

+0

Это так, в Javascript они называются объектами. Вместо 'var notes = []' вы можете использовать 'var notes = {}', чтобы использовать его как хэш-карту. (Обратите внимание, что '[]' и '{}' быстрее и короче, чем 'new Array()' и 'new Object()'.) –

0

Если вы проверяете в хромированной консоли, вы должны объявить его как объект, как вы используете его в качестве объекта. Chrome странно с массивами в консоли (ну, на самом деле они делают это правильно, так как в JavaScript массивы в основном объекты, а не ассоциативные массивы сами по себе):

x = new Array() 
//[] 
x['a'] = 1 
//1 
x 
//[] 

Но:

x = {} 
//Object {} 
x['a'] = 1 
//1 
x 
//Object {a: 1} 
Смежные вопросы