Javascript从DOM中删除错误的元素
Javascript deleting wrong elements from the DOM
我有粘贴Bin @ http://pastebin.com/bu2sz2C0的代码。除了killFrog函数之外,这段代码并不是我自己写的。
我遇到的问题是与killFrog功能。每只青蛙都存储在一个名为Frogs的数组中,然后将表示这些青蛙的DOM元素存储为_frogs。我试图做到这一点,当您单击Kill Frog按钮时,killFrog函数被触发并从数组中删除随机青蛙,然后从DOM中删除该青蛙。
使用console.log()我已经找到了青蛙的ID和青蛙的属性"data-frogid",并且正确地输出了应该从DOM中删除的青蛙,但是,有时它从DOM中删除了正确的青蛙,有时是错误的青蛙,有时根本不删除。我对此感到困惑,因为它输出到控制台应该删除哪只青蛙,但随后没有删除正确的青蛙。
这是我为killFrog写的代码
killFrog = function(){
console.log('////////////Selected Frog to Die///////////////');
var _randomFrog = this.Frogs[Math.floor(Math.random()*this.Frogs.length)];
console.log(_randomFrog);
var indexOfFrog = this.Frogs.indexOf(_randomFrog);
this.Frogs.splice(indexOfFrog,1); //Remove frog from array
console.log(_frogs.childNodes);
console.log("ID of FROG to be deleted" + _randomFrog.getId());
for (var i = 0; i < _frogs.childNodes.length; i++) {
if (_randomFrog.getId() == _frogs.childNodes[i].getAttribute("data-frogid")){
console.log("ID : " + _randomFrog.getId() + " Data attribute : " + _frogs.childNodes[i].getAttribute("data-frogid") + " NAME: " + _randomFrog.name + " DOM eleement name : " + _frogs.childNodes[i].innerHTML + " To be removed");
// _frogs.removeChild(_frogs.childNodes[i]);
_frogs.childNodes[i].parentNode.removeChild(_frogs.childNodes[i]);
}
};
console.log(this.Frogs.length + "Frogs left in the array");
},
更新:代码更新,删除重复的i变量@ http://pastebin.com/4JiQBK12
我相信这是由于Id在青蛙数组上的设置方式。在我更新的代码中,当我显示青蛙的数据属性时,它与它从数组中获得的ID不对应。
可以这样设置青蛙的id吗
frog.setId(this.Frogs[this.Frogs.length - 1] ? this.Frogs[this.Frogs.length - 1].getId() + 1 : 1);
因为您正在使用揭示模式来设置原型,所以Frog(和Pond)的所有实例都使用相同的数据。例如,如果将青蛙1的id设置为5,则青蛙2的id也将设置为5。下面是一个简单的例子:
function foo () {}
foo.prototype = function () {
var _id = 5;
return {
getId: function() {
return _id;
},
setId: function(id) {
_id = id
}
}
}();
var foo1 = new foo();
var foo2 = new foo();
foo1.setId(1);
console.log(foo2.getId()); //1
foo2.setId(8);
console.log(foo1.getId()); //8
要解决这个问题,不要使用揭示模式来定义原型。有几种方法,下面我所展示的只是其中一种。
function foo () {
var _id = 0;
this.getId = function() {
return _id;
};
this.setId = function(id) {
_id = id
};
}
var foo1 = new foo();
var foo2 = new foo();
foo1.setId(1);
console.log(foo2.getId()); //0
foo2.setId(8);
console.log(foo1.getId()); //1
您在同一作用域中声明了两次i
变量:
var i = this.Frogs.indexOf(_randomFrog);
和
for (var i = 0; i < _frogs.childNodes.length; i++) {
变量应该总是在作用域的顶部声明。提升和覆盖可能会导致很多混乱,就像这样。
在这种情况下,变量不应该被命名为相同的
相关文章:
- 元素在我的代码中不会.fadeTo.Don'I don’我不知道;s错误的JavaScript、JQuery、H
- 未捕获错误:元素缓存中id为x的DOM元素与DOM中的元素不同
- 角度多选下拉框给出错误元素.多选不是一个函数
- 聚焦和模糊错误元素触发的事件
- 错误:“元素当前不可见,因此可能无法与硒交互”
- 数组拼接删除了 AngularJS 中的错误元素
- 木偶嵌套布局视图未呈现,显示错误“元素必须存在于 DOM 中”
- materializecss 日期选择器量角器(错误:元素在点处不可单击)
- 失败:未知错误:元素在点(x,x)-角度/量角器处不可单击
- JSON级别()错误:元素列表后缺少]
- 如何不允许生成错误元素
- 使用HTML5
- Javascript错误:元素为空
- 针对错误元素的更改事件激发的JQuery
- IE 8 错误?元素卡入到位
- 来自 W3C 验证程序的错误“元素脚本不得具有属性延迟,除非还指定了属性 src”
- 错误:元素类型“uses-permission”后面必须跟属性规范“>”或“/>”
- 自动完成不工作,抛出错误元素.自动补全不是一个功能
- Jquery验证插件.没有使用远程规则删除错误元素(所有元素都可以在没有远程规则的情况下工作)
- 类在第一次检查时没有被添加到错误元素中,但是当字段再次被检查时一切正常(jquery验证插件)