События DOMNodeInserted и DOMNodeRemoved
Код ниже работает нормально, кроме счетчика. Когда я добавляю элемент в список, счетчик является точным, хотя при удалении элемента из списка он не вычитается из счетчика. Есть идеи?
HTML
<nav>
<div id ="counter">1</div>
<ul id="list">
<li class="test" id="liOne"><a href="#">test</a></li>
</ul>
<p id="contOne"></p>
<a id="button" class="button btn" href="#">Add</a><br>
<a id="button" class="button removeBtn" href="#">Remove</a>
</nav>
JavaScript
var elList, addLink, newEl, netText, counter, listItems, removeLink, removeEl;
elList = document.getElementById('list');
addLink = document.querySelector('.btn');
counter = document.getElementById('counter');
removeLink = document.querySelector('.removeBtn');
function addItem(e) {
if(e.preventDefault) {
e.preventDefault();
} else {
e.returnValue = false; //IE fallback code
}
newEl = document.createElement('li');
newText = document.createTextNode('New List Item');
newAnchor = document.createElement('a');
newAnchor.setAttribute('href', '#');
newAnchor.appendChild(newText);
newEl.appendChild(newAnchor);
elList.appendChild(newEl);
}
function removeItem(e) {
if(e.preventDefault) {
e.preventDefault();
} else {
e.returnValue = false; //IE fallback code
}
var removeEl = document.querySelector('li');
var containEl = removeEl.parentNode;
containEl.removeChild(removeEl);
}
function updateCount() { // Declare function
listItems = elList.getElementsByTagName('li').length; // Get total of <li>s
counter.innerHTML = listItems; // Update counter
}
removeLink.addEventListener('click', removeItem, false);
addLink.addEventListener('click', addItem, false);
elList.addEventListener('DOMNodeInserted', updateCount, false); // DOM updated. fires when a node is inserted into dom tree
elList.addEventListener('DOMNodeRemoved', updateCount, false);
2 ответа
Проблема в том, что updateCount()
Функция работает быстрее, чем removeItem()
функция (до удаления элемента). Я бы предложил:
Удалить следующие строки:
elList.addEventListener('DOMNodeInserted', updateCount, false);
elList.addEventListener('DOMNodeRemoved', updateCount, false);
И позвони updateCount()
конец вашего addItem
а также removeItem
методы следующим образом:
function removeItem(e) {
/* Your code here*/
updateCount();
}
РЕДАКТИРОВАТЬ: см. Рабочий пример JSFiddle
События мутации устарели (более подробную информацию от W3C можно найти здесь). Вместо этого используйте наблюдателей мутации.
Обработчики событий DOM:
elList.addEventListener('DOMNodeInserted', updateCount, false);
elList.addEventListener('DOMNodeRemoved', updateCount, false);
Изменился бы на следующее. Обратите внимание, что это сработает updateCount
для всех событий DOM на элементе, но наблюдатель может быть настроен для обработки определенных событий.
var listObserver = new MutationObserver(updateCount);
listObserver.observe(elList, { attributes: true, childList: true, characterData: true });
Полный рабочий пример приведен ниже.
var elList, addLink, newEl, netText, counter, listItems, removeLink, removeEl;
elList = document.getElementById('list');
addLink = document.querySelector('.btn');
counter = document.getElementById('counter');
removeLink = document.querySelector('.removeBtn');
function addItem(e) {
if (e.preventDefault) {
e.preventDefault();
} else {
e.returnValue = false; //IE fallback code
}
newEl = document.createElement('li');
newText = document.createTextNode('New List Item');
newAnchor = document.createElement('a');
newAnchor.setAttribute('href', '#');
newAnchor.appendChild(newText);
newEl.appendChild(newAnchor);
elList.appendChild(newEl);
}
function removeItem(e) {
if (e.preventDefault) {
e.preventDefault();
} else {
e.returnValue = false; //IE fallback code
}
var removeEl = document.querySelector('li');
var containEl = removeEl.parentNode;
containEl.removeChild(removeEl);
}
function updateCount() { // Declare function
listItems = elList.getElementsByTagName('li').length; // Get total of <li>s
counter.innerHTML = listItems; // Update counter
}
removeLink.addEventListener('click', removeItem, false);
addLink.addEventListener('click', addItem, false);
var listObserver = new MutationObserver(updateCount);
listObserver.observe(elList, { attributes: true, childList: true, characterData: true });
<nav>
<div id="counter">1</div>
<ul id="list">
<li class="test" id="liOne"><a href="#">test</a>
</li>
</ul>
<p id="contOne"></p>
<a id="button" class="button btn" href="#">Add</a>
<br>
<a id="button" class="button removeBtn" href="#">Remove</a>
</nav>