![](/img/trans.png)
[英]Equivalent of DOMNodeInserted DOMNodeRemoved with MutationObserver?
[英]DOMNodeInserted and DOMNodeRemoved events
除了计数器,下面的代码工作正常。 当我将一个项目添加到列表中时,计数器是准确的,尽管当我从列表中删除一个项目时,它不会从计数器中减去一个项目。 有任何想法吗?
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);
问题在于, updateCount()
函数的运行速度比removeItem()
函数的运行速度快(在删除项目之前)。 我建议:
删除以下行:
elList.addEventListener('DOMNodeInserted', updateCount, false);
elList.addEventListener('DOMNodeRemoved', updateCount, false);
并在addItem
和removeItem
方法的末尾调用updateCount()
,如下所示:
function removeItem(e) {
/* Your code here*/
updateCount();
}
编辑:请参阅工作JSFiddle示例
不推荐使用突变事件(有关W3C的更多详细信息,请参见此处 )。 而是使用突变观察器 。
DOM事件处理程序:
elList.addEventListener('DOMNodeInserted', updateCount, false);
elList.addEventListener('DOMNodeRemoved', updateCount, false);
将更改为以下内容。 请注意,这将触发元素上所有DOM事件的updateCount
,但是可以将观察者配置为处理特定事件。
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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.