- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我为点击事件设置了两个事件处理程序。一上所有<th>
s 在表格中,另一个通用的在文档中。
<th>
中的部分代码处理程序更改被单击元素的 innerHTML。我认为,至关重要的是,th
中有一个 anchor 标记。标签。
文档处理程序中的部分代码检查被单击元素的父节点。
似乎这两个事实导致了问题。如果我注释掉 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 调用中用一个新的 anchor 替换那个 anchor 。我该如何解决?
最佳答案
发生这种情况是因为在请求其父节点时,被单击的元素不再存在于文档中。您已将其替换为完全不同的元素。
与其更改父级的 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>
关于javascript - 覆盖 anchor 标记时更改 innerHTML 会破坏 parentNode 吗?怎么修?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34728165/
var topClick = function() { child = this.parentNode.parentNode.parentNode.parentNode; child.pare
在我的代码中,函数 displayUserTable 将一些名为 tUserBlock 的 div 附加到名为 centralWindow 的主 div。当您单击 tUserBlock 时,会从名为
这是一种病态的情况,但假设我有以下 HTML: [...] 我有一个表格的引用,例如 var form = document.getElementById(
我正在使用以下代码片段来更新表中的某些文本框值。 ProjectName Block .WorkProgressMilestone Completion
我有一个创建 HTML 表格的函数: makeHTMLTable: function(array){ var table = document.createElement('table');
我已经开始使用 d3,此时我正在编辑给定的脚本以满足新的要求。我尝试访问变量,但无法访问它。有人可以帮我吗? 问题出在第 5 行,我无法获取“this.parentNode”,但我需要它。 有人能指出
我正在通过为自己设置一些小练习来练习基本的 JS 技能。在这个中,我有一个列表 s 位于 div 内。练习的目的是包装每个 在一个 div 中。我正在使用replaceChild在这种情况下。 奇怪
我的 javascript 程序基本上创建一系列图像并随机选择一个图像并将其 src 设置为特定路径。然而,由于某种原因,代码有时似乎会卡住。在我的程序中,我调用其中一个图像的 element.par
我有以下带有 A 框架的 html 结构。基本上,我使用以下基本 html 构建原子的 3D 表示:\ 为了
如果我们使用 closable: true 关闭 tabPanel,则默认操作将销毁 tabPanel。因此,由于 tabPanel 被破坏,我们将无法再次显示 tabPanel。但是,我不希望 ta
我正在尝试使用 JavaScript 复制 jQuery 的 after(): var orangeBlock = 'Try out the New Version of CLO' var greyB
我有一个问题。如何多次使用 parentNode 属性? 我知道我可以做出这样的东西: document.getElementById("mytag").parentNode.parentNode.r
我正在尝试为我构建一个类似 jquery 的实用程序库,这正是我主要使用 jQuery 的东西。 我有以下代码: function jLib(selector) { this.elements =
我有一组嵌套的 div: a b c d 我
现在我有这段代码: function delete_box(n) { document.getElementById("box"+n).style.display = "none";
我有一个获取元素的 id 并找出它的 parentNode 的函数,现在我想在那个 中找到所有 id 以相同的 string 开头的元素>父节点. 有什么功能或方法可以找出来吗?我正在尝试这个: va
是否可以链接 parentNode(或类似的)调用? 例如,假设我有这个 html: 现在假设我在“按钮”上有一个事件监听器。现在我想将
考虑这个简单的页面: var upper; var lower; function crop() { //upper = document.getElemen
我有一个项目列表,上面有不同的事件处理程序。 ... Item ... Add to list A Add to list B
如果它有几个没有 id 的子节点,那么将一些内容添加到 ParentNode 的最佳方法是什么。 条件是: I need to add contents inside this
我是一名优秀的程序员,十分优秀!