Javascript:无法执行';removeChild';在';节点';:参数1的类型不是';节点';

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

我正试图从其中一门课程中重现一些练习。它将从UL中删除一个li项并将其附加到另一个UL

当我以下面的方式编写代码时,所有的工作都完成了

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);
}