变量设置为 HTML object 随着对象的变化

Variable set to HTML object changes with the object

我正在用 Vanilla JS 制作一个简单的国际象棋游戏,并且正在尝试实现一个撤消移动功能,当您按下一个按钮时,您可以收回您的移动。目前有两个按钮,一个是撤销你的动作,另一个是提交你的动作并将游戏交给你的对手。大多数国际象棋游戏的简单功能。

现在的工作方式是在玩家移动之前为动态生成的 8 x 8 棋盘 HTML 对象分配一个变量(所以 let previousState = board 其中 boardconst board = document.getElementById("board"))。因此,在玩家接触游戏之前,board 的当前状态就被保存了。

这是 JS:

function drawBoard() {
    // Two loops one for even rows one for odd inside of another loop so all rows are drawn
    let isWhite = false
    let idSwitch = 0
    for (let p = 1; p <= 4; p++) {
        let oddRow = document.createElement("div")
        let evenRow = document.createElement("div")
        for (let i = 1; i <= 8; i++) {
            idSwitch++
            let square = document.createElement("div")
            square.classList.add("square")
            square.setAttribute("id", `square${idSwitch}`)
            if (isWhite) {
                isWhite = false
            } else {
                square.classList.add("black")
                isWhite = true
            }
            oddRow.appendChild(square)
        }
        board.appendChild(oddRow)

        for (let q = 1; q <= 8; q++) {
            idSwitch++
            let square = document.createElement("div")
            square.classList.add("square")
            square.setAttribute("id", `square${idSwitch}`)
            if (isWhite) {
                square.classList.add("black")
                isWhite = false
            } else {
                isWhite = true
            }
            evenRow.appendChild(square)
        }
        board.appendChild(evenRow)
    }
}

和 HTML:

<section id="board-container">
    <div id="board"></div>
</section>

供参考。

然后,当玩家移动时,变量应该保持完全相同,这样,如果他们想恢复到原来的状态,变量仍然存在。

所以,搬家之后,他们有两个选择。要么将移动传给他们的对手,此时 previousState 变量被重新分配给棋盘的新状态(即棋盘在上述移动之后的状态),或者,这就是摩擦,他们可以按下撤消,面板将恢复到轮到他们之前的状态(即 board var 设置的内容)。

简单吧?你在他们走之前分配一个 var ,然后如果他们想收回棋盘,就把棋盘还原给它。否则,将 var 重置为他们离开后董事会的样子。冲洗并重复。

唯一的问题是,由于某种原因,变量在最初定义时和玩家移动后的某个时间发生了变化。发生的事情是玩家离开,变量被记录到控制台。它有父元素 board,然后是所有的行和方块,然后是方块中正确位置的所有棋子。然后玩家移动,变量再次注销,但是现在棋盘元素,现在实际的 HTML 对象,是不同的,并且由于某种原因,从未重新分配的变量反映了如何董事会现在看起来。我不明白为什么,因为它应该保持不变,而不是与董事会同步更新。为什么会这样?

这是一个代码笔,您可以自己检查一下: https://codepen.io/jacklouden/pen/qBaLPdo.

谢谢!

您是否熟悉按引用或按值变量的概念?我猜这是你的问题。

上面已经有一个很好的 SO post。

JavaScript by reference vs. by value

我将直接引用 post 的话来回答这个问题。

” Javascript 总是按值传递,但是当变量引用对象(包括数组)时,“值”是对对象的引用。 改变一个变量的值永远不会改变底层的原语或对象,它只是将变量指向一个新的原语或对象。 但是,更改变量引用的对象的 属性 确实会更改基础对象。"

尝试复制您的 html 对象并将其隐藏。我没有深入了解你在做什么,但你正在做 DOM 操作,你需要创建一个包含状态的新 DOM 元素。这应该为您提供所需的重置功能。