【问题标题】:I'm looping over an array and modifying the contents of the array, but I don't get the results I expect.我正在循环一个数组并修改数组的内容,但我没有得到我期望的结果。
【发布时间】:2013-02-18 22:15:28
【问题描述】:

我正在循环一个数组并修改数组的内容,但我没有得到我期望的结果。我错过了什么或做错了什么?

我有两组 div(一组是攻击者,另一组是敌人),每组包含三个元素。我试图通过在它周围制作边框来从每一侧选择一个元素。现在我想将课程从攻击者切换到敌人,反之亦然。 但是当我使用 for 循环时,它会以某种方式忽略一些元素并且只更改一两个 div 类。这是我的代码:

HTML:

<div id="army1">
    <div class="attacker">
        <img src="img/Man/Archer.jpg" />
        <div class="hp"></div>
    </div>
    <br><div class="attacker">
        <img src="img/Man/Knight.jpg" />
        <div class="hp"></div>
    </div>
    <br><div class="attacker">
        <img src="img/Man/Soldier.jpg" />
        <div class="hp"></div>
    </div>
    <br>            
</div>

<div id="army2">
    <div class="enemy">
        <img src="img/Orcs/Crossbowman.jpg" />
        <div class="hp"></div>
    </div>
    <br><div class="enemy">
        <img src="img/Orcs/Mine.jpg" />
        <div class="hp"></div>
    </div>
    <br><div class="enemy">
        <img src="img/Orcs/Pikeman.jpg" />
        <div class="hp"></div>
    </div>
    <br>            
</div>

还有我的 javascript 代码:

var attacker = document.getElementsByClassName('attacker');
var enemy = document.getElementsByClassName('enemy');


var button = document.getElementById("fight");

// var class1 = document.getElementsByClassName("first")[0].getAttribute("class");
// class1 = class1.split(" ");

//choose attacker
for (var i = 0; i < attacker.length; i++) {
    attacker[i].onclick = function () {
        //select only one attacker and set its id to attackerid
        if (this.getAttribute('class') != 'attacker first') {
            resetAttackerClasses();
            this.setAttribute('class', 'attacker first');
        } else {
            resetAttackerClasses();
        }

    };
}

//choose enemy
for (var i = 0; i < enemy.length; i++) {
    enemy[i].onclick = function () {
        //select only one attacker and set its id to enemyid
        if (this.getAttribute('class') != 'enemy second') {
            resetEnemyClasses();
            this.setAttribute('class', 'enemy second');
        } else {
            resetEnemyClasses();
        }
    };
}

//fight
button.onclick = function() {
    //take off enemy health
    document.getElementsByClassName('enemy second')[0].children[1].style.width = '50px';

    resetAttackerClasses();
    resetEnemyClasses();

     for (var i = 0; i < attacker.length; i++) {
            attacker[i].setAttribute('class', 'enemy');
            enemy[i].setAttribute('class', 'attacker');
    };
};


function resetAttackerClasses() {
    for (var i = 0; i < attacker.length; i++) {
        attacker[i].setAttribute('class', 'attacker');
    };
}
function resetEnemyClasses() {
    for (var i = 0; i < attacker.length; i++) {
        enemy[i].setAttribute('class', 'enemy');
    };
}

【问题讨论】:

    标签: javascript html css loops


    【解决方案1】:

    这是因为您要删除用于获取元素的类,这意味着该元素将自动从活动的 NodeList 中删除(因为它不再与查询匹配)。 p>

    发生这种情况时,NodeList 被重新索引,因此下一个元素成为当前元素,而您最终会跳过它并使用下一个 i++;

    要修复它,请改为反向迭代。

    如果您不想反向操作,则每次从列表中删除元素时都会减少索引。

    【讨论】:

    • 您应该也可以复制它,然后遍历新数组: var nodeArr = Array.prototype.slice.call(theNodeList, 0);
    • @lmortenson:是的,这也可以。不过很高兴避免复制。如果 OP 关心订单,我宁愿减少索引。
    猜你喜欢
    • 2023-02-02
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    • 2019-12-30
    • 1970-01-01
    • 2023-03-13
    • 2020-07-05
    • 2023-04-06
    相关资源
    最近更新 更多