Javascript 当锚定标记被覆盖时,更改innerHTML会中断parentNode吗?如何修复?

Javascript 当锚定标记被覆盖时,更改innerHTML会中断parentNode吗?如何修复?,javascript,dom,Javascript,Dom,我为click事件设置了两个事件处理程序。一个在表中的所有上,另一个在文档上 处理程序中的部分代码更改单击元素的innerHTML。关键的是,我认为,th标记中有一个锚标记 文档处理程序中的部分代码检查所单击元素的parentNode 这两个事实似乎引起了一个问题。如果我注释掉innerHTML修改行,一切正常。如果我将其保留在中,则元素的parentNode会得到“null” 这是一个已知的问题,如果是,解决方案是什么?这是Chrome中的一个bug,还是JavaScript/DOM的行为出于

我为click事件设置了两个事件处理程序。一个在表中的所有
上,另一个在文档上

处理程序中的部分代码更改单击元素的innerHTML。关键的是,我认为,
th
标记中有一个锚标记

文档处理程序中的部分代码检查所单击元素的parentNode

这两个事实似乎引起了一个问题。如果我注释掉innerHTML修改行,一切正常。如果我将其保留在中,则元素的
parentNode
会得到“null”

这是一个已知的问题,如果是,解决方案是什么?这是Chrome中的一个bug,还是JavaScript/DOM的行为出于某种原因

功能为嵌入式(eChild,eParent){
警报('元素为'+eChild');
如果(eChild==eParent){
返回true;
}
如果(eChild==文档){
返回false;
}
返回isInside(eChild.parentNode,eParent);
}
函数init1(){
document.getElementById('th')。addEventListener('click',函数(e){
document.getElementById('th')。innerHTML='';
});
}
函数init2(){
document.addEventListener('click',函数(e){
if(isInside(e.target,document.getElementById('table')){
警报(“在表中找到”);
}否则{
警报(“未在表中找到”);
}
});
}
init1();
init2()

之所以发生这种情况,是因为在请求其父节点时,已单击的元素不再存在于文档中。您已将其替换为完全不同的元素

只需更改现有元素,而不是更改父元素的innerHTML,从而用新元素替换单击的元素

为了节省空间,我将完整的演示压缩到下面,但解决方案的要点如下:

var th = document.getElementById('th');
var link = th.querySelector('a');

th.addEventListener('click', function(e) {
  link.textContent = 'Changed';
});
下面是演示:

功能为嵌入式(eChild,eParent){
警报('元素为'+eChild');
如果(eChild==eParent)返回true;
如果(eChild==文档)返回false;
返回isInside(eChild.parentNode,eParent);
}
var th=document.getElementById('th');
var link=th.querySelector('a');
th.addEventListener('click',函数(e){
link.textContent='Changed';
});
document.addEventListener('click',函数(e){
if(isInside(e.target,document.getElementById('table'))警报('found in table');
else警报(“未在表中找到”);
});

能否共享相关的代码片段?如果没有代码片段,则不清楚DOM的哪些部分受到影响。不,这不是问题,可能是代码中的其他内容。请提供显示此问题的相关代码,否则此问题属于离题。一般来说,答案为“否”。例如,它工作得很好
th
处理程序更改
th
innerHTML
document
处理程序想要
th
parentNode
,并获取它。