![](/img/trans.png)
[英]Javascript parentNode is null when changing content innerHTML
[英]Changing innerHTML breaks parentNode when anchor tag is overwritten? How to fix?
我为click事件设置了两个事件处理程序。 一个在表中的所有<th>
,另一个在文档上的通用的。
<th>
处理程序中的部分代码更改了单击元素的innerHTML。 至关重要的是,我认为, th
标签内部有一个锚标签。
文档处理程序中的部分代码检查单击元素的parentNode。
看来这两个事实导致了一个问题。 如果我注释掉innerHTML修改行,一切正常。 如果我把它留在里面,我得到元素的parentNode
“null”。
这是一个已知的问题,如果是这样的解决方案是什么? 这是Chrome中的错误,还是JavaScript / DOM因某种原因而导致的行为?
function isInside(eChild, eParent) { alert('element is ' + eChild); if (eChild === eParent) { return true; } if (eChild === document) { return false; } return isInside(eChild.parentNode, eParent); } function init1() { document.getElementById('th').addEventListener('click', function(e) { document.getElementById('th').innerHTML = '<a href="#">Changed</a>'; }); } function init2() { document.addEventListener('click', function(e) { if (isInside(e.target, document.getElementById('table'))) { alert('found in table'); } else { alert('not found in table'); } }); } init1(); init2();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <table id="table"> <thead> <tr> <th id="th"><a href="#">Click me</a> </th> </tr> </thead> </table>
如果你注释掉了
document.getElementById('th').innerHTML = '<a href="#">Changed</a>';
在JavaScript中,您将遇到所需的行为。
我假设这是因为事件是在<a>
而不是<th>
上触发,然后我在innerHTML调用中用新的替换该锚点。 我该如何解决这个问题?
发生这种情况是因为单击的元素在请求其parentNode时不再存在于文档中。 你用一个完全不同的元素取而代之。
而不是更改父元素的innerHTML,因此替换使用新元素单击的元素,只需更改现有元素即可。
我已经压缩了下面的完整演示以节省空间,但解决方案的核心在于:
var th = document.getElementById('th');
var link = th.querySelector('a');
th.addEventListener('click', function(e) {
link.textContent = 'Changed';
});
这是演示:
function isInside(eChild, eParent) { alert('element is ' + eChild); if (eChild === eParent) return true; if (eChild === document) return false; return isInside(eChild.parentNode, eParent); } var th = document.getElementById('th'); var link = th.querySelector('a'); th.addEventListener('click', function(e) { link.textContent = 'Changed'; }); document.addEventListener('click', function(e) { if (isInside(e.target, document.getElementById('table'))) alert('found in table'); else alert('not found in table'); });
<table id="table"><thead><tr><th id="th"><a href="#">Click me</a></th></tr></thead></table>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.