简体   繁体   English

DOMNodeInserted和DOMNodeRemoved事件

[英]DOMNodeInserted and DOMNodeRemoved events

The code below is working fine, apart from the counter. 除了计数器,下面的代码工作正常。 When I add an item to the list, the counter is accurate, though when I remove an item from the list, it doesn't subtract one from the counter. 当我将一个项目添加到列表中时,计数器是准确的,尽管当我从列表中删除一个项目时,它不会从计数器中减去一个项目。 Any ideas? 有任何想法吗?

HTML 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 的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);

The problem is that the updateCount() function runs faster than the removeItem() function (before item is removed). 问题在于, updateCount()函数的运行速度比removeItem()函数的运行速度快(在删除项目之前)。 I'd suggest: 我建议:

Remove following lines: 删除以下行:

elList.addEventListener('DOMNodeInserted', updateCount, false);
elList.addEventListener('DOMNodeRemoved', updateCount, false);

And call your updateCount() a the end of your addItem and removeItem methods as follows: 并在addItemremoveItem方法的末尾调用updateCount() ,如下所示:

function removeItem(e) {

    /* Your code here*/

    updateCount();
}

EDIT: See working JSFiddle example 编辑:请参阅工作JSFiddle示例

Mutation events have been deprecated (more specifics from the W3C can be found here ). 不推荐使用突变事件(有关W3C的更多详细信息,请参见此处 )。 Instead, use mutation observers . 而是使用突变观察器

The DOM event handlers: DOM事件处理程序:

elList.addEventListener('DOMNodeInserted', updateCount, false);
elList.addEventListener('DOMNodeRemoved', updateCount, false);

Would change to the following. 将更改为以下内容。 Note that this will trigger updateCount for all DOM events on the element, but the observer could be configured to handle specific events. 请注意,这将触发元素上所有DOM事件的updateCount ,但是可以将观察者配置为处理特定事件。

var listObserver = new MutationObserver(updateCount);
listObserver.observe(elList, { attributes: true, childList: true, characterData: true });

A full, working example is below. 下面是一个完整的可行示例。

 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> 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM