Javascript:无法执行';removeChild';在';节点';:参数1的类型不是';节点';
我正试图从其中一门课程中重现一些练习。它将从UL中删除一个li项并将其附加到另一个UL 当我以下面的方式编写代码时,所有的工作都完成了Javascript:无法执行';removeChild';在';节点';:参数1的类型不是';节点';,javascript,removechild,Javascript,Removechild,我正试图从其中一门课程中重现一些练习。它将从UL中删除一个li项并将其附加到另一个UL 当我以下面的方式编写代码时,所有的工作都完成了 var removeMeandAppendMe = function() { var parentLi = this.parentNode; var goneElement = incompleList.removeChild(parentLi); compleList.appendChild(goneElement); }; var
var removeMeandAppendMe = function() {
var parentLi = this.parentNode;
var goneElement = incompleList.removeChild(parentLi);
compleList.appendChild(goneElement);
};
var li = incompleList.getElementsByTagName('li');
for (var i = 0; i < incompleList.children.length; i++) {
var link = li[i];
var liCheckArray = link.getElementsByTagName('input');
var liCheck = liCheckArray[0];
liCheck.onchange = removeMeandAppendMe;
}
var removeMeandAppendMe=function(){
var parentLi=this.parentNode;
var goneElement=incompleList.removeChild(parentLi);
completlist.appendChild(goneElement);
};
var li=incompleList.getElementsByTagName('li');
for(var i=0;i
当我将代码更改为以下内容时,会出现错误“未能在“节点”上执行“removeChild”:参数1不是“节点”类型
函数removeMeandAppendMe(fromList,toList){
var parentLi=this.parentNode;
var goneElement=fromList.removeChild(parentLi);
toList.appendChild(goneElement);
}
var li=incompleList.getElementsByTagName('li');
for(var i=0;i
困扰我的是,当我的RemoveMeansDapPendMe函数没有参数且不能使用参数时,代码运行良好。谁能告诉我为什么,我的错误在哪里?多谢各位
(我知道这里讨论的模糊问题:)首先,正如Pointy所提到的,您确实需要将对
RemoveMeandAppendMe(不完整列表,完成列表)
的调用包装在匿名函数中,这样就不会过早地调用它
考虑到这一点,您会收到此错误,因为每次函数调用时,this
的值是多少。调用RemoveMeandAppendMe()
时,这是一个HTMLInputElement对象,但调用RemoveMeandAppendMe(不完整列表,完成列表)
时,这是窗口对象,因此这.parentNode
是未定义的因此“不是'Node'类型”,这就是您看到该错误消息的原因)
这个问题有很多微妙之处:这个
指的是什么,以及如何处理不同的“函数”声明(大量讨论)。仅仅改变RemoveMeandAppendMe(不完整列表,完整列表)
的声明方式也不能解决问题
在某种程度上,您的问题可以归结为“为什么这个
指的是参数化函数调用的窗口对象,而非参数化函数调用的是HTMLInputElement对象?”我相信在这种情况下,这是因为,当我们将参数化函数调用封装在匿名函数中时(类似于:liCheck.onchange=function(){removeMeandAppendMe(completList,completList);};
),removeMeandAppendMe
没有“本地”所有者,因此此函数的所有权默认为全局对象Window()
要解决此问题,您可以将this
传递到调用removeMeandAppendMe
,其中this
将引用复选框,然后将其用作参数化函数中的变量。我已将所有这些都放在您的位置,您可以通过注释/取消注释不同的内容来处理这些内容。希望这有所帮助 你能创建一个显示你的问题的列表吗?什么是不完整列表
?它被分配到哪里?当然:不完整列表
和完整列表
是这两个无序列表的ID。问题在最后一行。你没有分配removeManadapendme
,你正在调用它。我建议你查看.bind()
函数来实现您希望执行的操作。
function removeMeandAppendMe(fromList, toList) {
var parentLi = this.parentNode;
var goneElement = fromList.removeChild(parentLi);
toList.appendChild(goneElement);
}
var li = incompleList.getElementsByTagName('li');
for (var i = 0; i < incompleList.children.length; i++) {
var link = li[i];
var liCheckArray = link.getElementsByTagName('input');
var liCheck = liCheckArray[0];
liCheck.onchange = removeMeandAppendMe(incompleList, compleList);
}