li_array.sort()
не должен работать, поскольку li_array
- это не массив, а объект jQuery (если вы не используете плагин). Обновление: Кажется, jQuery действительно предоставляет метод сортировки, и это та же самая встроенная функция, которую используют массивы.Это немного удивляет меня, так как я ничего не смог найти в документе.Есть ли у кого-то дополнительная информация об этом?
Кроме того, нет необходимости клонировать элементы (что означает, что вам не нужно empty
список).Если вы добавляете существующие элементы DOM к другому элементу, jQuery сначала позаботится о его отсоединении.
Это должно сработать (при условии ul
ссылается на ваш список):
var li_array = $('ul li').get(); // li_array will be an array of **DOM elements**
li_array.sort( custom_func );
$(li_array).appendTo(ul);
// or $(li_array).appendTo('ul'); or however you reference the list
Есливы прикрепляете один и тот же обработчик кликов к каждому элементу <li>
, вам лучше использовать делегирование событий, используя .delegate()
:
$('ul').delegate('li', 'click', function() {
// handler
});
Подробнее о делегате:1025 *
Делегирование событий использует тот факт, что события всплывают в DOM-дереве .Приведенный выше код добавляет прослушиватель события click к элементу ul
.Обработчик будет запускаться для каждого события щелчка, которое вызывается у потомков этого элемента.Теперь jQuery умный и выполняет обработчик только для li
элементов (элементов, соответствующих селектору, переданных в качестве первого аргумента в delegate
.
Преимущество заключается в том, что вы не добавляете обработчики событий вкаждый элемент li
, но только один для их общего предка.
Вы также можете добавить больше элементов li
в список, не добавляя к ним прослушиватели событий. Обработчик событий, связанный с ul
, также будет захватывать кликинедавно добавленные элементы.