Вы не «перемещаете» элементы, вы создаете копию и удаляете оригинал.Хотя это выглядит как «движение» с точки зрения пользователя, новые создаваемые элементы не имеют назначенных обработчиков кликов.From MDN : «Клонирование узла копирует все его атрибуты и их значения, но не копирует прослушиватели событий.»
Согласно MDN , .appendChild()
удалитдочерний элемент от его текущего родителя, поэтому вам не нужно двухступенчатое клонирование / удаление, которое вы делаете в данный момент.Я не проверял это, но, возможно, используя только .appendChild()
, он сохранит обработчики?Если это так, вам нужно удалить этот обработчик и назначить новый, чтобы разрешить, к какому списку он теперь принадлежит.
Или переписать ваши обработчики так, чтобы они проверяли, какой список является текущим родителем (посмотрите на .parentNode
) и перейдите к списку прочее в зависимости от ситуации.
Принимая во внимание, что события щелчка «всплывают», начиная с целевого / исходного элемента и вплоть дородительская иерархия, вам, вероятно, лучше настроить обработчики щелчков на родительских элементах <ul>
, а затем проверить, на каком <li>
была нажата кнопка.Таким образом, вам не нужно беспокоиться об установке новых обработчиков кликов для новых дочерних <li>
элементов.
function testList() {
var usersA = document.getElementById("users-a"),
usersB = document.getElementById("users-b");
usersA.onclick = function(e) {
// allow for the IE and non-IE way of handling the event object
if (!e) e = window.event;
var el = e.target || e.srcElement;
if (el.tagName === "li") {
usersB.appendChild(el);
}
}
usersB.onclick = function(e) {
// allow for the IE and non-IE way of handling the event object
if (!e) e = window.event;
var el = e.target || e.srcElement;
if (el.tagName === "li") {
usersA.appendChild(el);
}
}
}
Кроме того, если вы используете .getElementsByTagName()
, называйте его один раз в инициализации цикла и присвойте результат переменной, затем используйте переменную - не продолжайте вызывать функцию снова и снова, чтобы проверить длину или получить доступ к отдельным элементам внутри цикла:
for (var i=0, lis = usersA.getElementsByTagName("li"); i < lis.length; i++) {
lis[i].onclick = function() {
// etc
}
}