当函数中存在多个时,javascript/DOM中的removeChild无法正常工作
更新: 以下是JSFIDLE链接: 它似乎在JSFIDLE中不起作用,但我猜它可以显示整个代码——html、css和Js。 在使用Javascript进行DOM编辑时,我面临着一种非常奇怪的情况。我的示例代码如下。基本上,swapCells将接收两个对象,每个对象有两个子对象-一个是img元素,另一个是textNode。我想看的是removeChild的工作原理 我已经标记了所有混淆的两行。 问题#1位于sourceTD移除其子项的行上,问题#2位于从destinationTD移除最后一个子项的行上 让我解释一下下面的代码是如何运行的: a) 当代码中只出现问题行#1时,sourceTD子级被删除,输出表示source有一个img类型的子级;destination有2个子项——img和文本——按预期工作 b) 当代码中只存在问题行#2时,destinationTD子项将被删除,其工作方式与上述类似,如预期的那样 c) 现在的问题是,当代码中出现这两行时,它只会删除sourceTD lastChild。仅针对警报的sourceTD部分接收输出destinationTD警报不会出现,因此我无法评估目标子项是否已被删除 代码: 请让我知道,当两个问题行都存在时,为什么代码行为异常。还有,是不是有一个函数只能删除一个节点,或者只有一个removeChild可以工作。。。?????我很困惑当函数中存在多个时,javascript/DOM中的removeChild无法正常工作,javascript,ajax,dom,removechild,Javascript,Ajax,Dom,Removechild,更新: 以下是JSFIDLE链接: 它似乎在JSFIDLE中不起作用,但我猜它可以显示整个代码——html、css和Js。 在使用Javascript进行DOM编辑时,我面临着一种非常奇怪的情况。我的示例代码如下。基本上,swapCells将接收两个对象,每个对象有两个子对象-一个是img元素,另一个是textNode。我想看的是removeChild的工作原理 我已经标记了所有混淆的两行。 问题#1位于sourceTD移除其子项的行上,问题#2位于从destinationTD移除最后一个子项
谢谢 当两行都在其中时,您将调用
destinationTD.removeChild(destinationTD.lastChild)代码>两次,因此两个子项都将被删除。if语句的计算结果为false,因为destinationTD
没有子节点,所以您不会得到任何输出-在这种情况下,缺少输出是代码正常工作的证明,而不是代码正常工作的证明。排序->
TD的第一个子节点是换行符,而不是img元素。。。。将数字增加1,其工作正常。。。在prod环境中使用似乎有点脆弱-除非您可以控制HTML-也许可以改为使用getelementbytagname('img')
?Ahhh。。。我明白了
该问题是由于在删除后引用不再存在的子节点而创建的错误
例如,如果sourceTD有3个子节点,并且被引用为childNodes[1]和childNodes[2],那么在删除sourceTD的最后一个子节点时,就不再有childNodes[2],因为只剩下2个节点,也不再有第三个节点。由于JS中的这个错误,剩余的代码被抑制,无法运行。这就是为什么destinationTD警报也被抑制的原因
愚蠢的引用
感谢大家,特别是@ManseUK提供的所有帮助也许还可以使用并包含您的HTML。。。那将help@ManseUK我已经将jsfiddle链接添加到问题()@RobG更新了您的jsfiddle-->==um。。很抱歉,但它似乎没有如我预期的那样起作用。您可以查看一下前面提到的sourcTD和DestinationTD removeChild,但我看到代码只针对sourcTD警报集运行。有什么用?@arunnair那是因为它被移除了!
function swapCells(sourceTD, destinationTD){
//line below is issue line#1
sourceTD.removeChild(sourceTD.lastChild);
//line below is issue line#2
destinationTD.removeChild(destinationTD.lastChild);
if(sourceTD.hasChildNodes()){
alert("Source has: " + sourceTD.childNodes.length);
alert(sourceTD.childNodes[0].alt);
alert(sourceTD.childNodes[1].nodeName);
}
destinationTD.removeChild(destinationTD.lastChild);
if(destinationTD.hasChildNodes()){
alert("Destination has: " + destinationTD.childNodes.length);
alert(destinationTD.childNodes[0].alt);
alert(destinationTD.childNodes[1].nodeName);
}
}