javascript - 阻止 .appendChild 在已填充的 div 内创建?

标签 javascript html function

我正在尝试创建一个井字游戏,您可以在其中以 O 的身份与 Math.floor(Math.random()) 进行游戏,而用户正在玩如X。但是当我单击时,它有时会在已填充的框中创建 O

我只想允许每个 div 有一个 P 标签。

警告:代码极其困惑且过于复杂(抱歉)。

html:

<body onload="createDivs()">
  <p id="demo"></p> 
</body>

CSS:

div {
  border: solid 2px black;
  width: 300px;
  height: 300px;
  float: left;
  border-right: none;
  border-top: none;
  overflow: hidden;
}

JavaScript:

var alternate = "O";
var count = 0;

function createDivs() {
  var t;
  var ai;
  var trackId = [];

  for (i = 0; i < 9; i++) {
    var d = document.createElement("DIV");
    document.body.appendChild(d);

    d.onclick = function() {
      if (count > 8) {
        return
      }

      var xP = document.createElement("P");
      var oP = document.createElement("P");

      var childCount = "childID" + count;

      xP.setAttribute("id", childCount);

      trackId.push(childCount);
      /*
      alert(trackId.toString());
      */

      count++;
      oP.setAttribute("id", "childID" + count);
      count++;

      if (alternate == 'O') {
        t = document.createTextNode("X");
        alternate = 'X';
        xP.appendChild(t);
        this.appendChild(xP);
        this.onclick = function() {};

        /*
        for (aa = 0; aa < 9; aa++) {
            var zed = "D"+aa;
            var bb = document.getElementById(zed).innerText;
            while (bb == 'X' || bb == 'O') {
                zed = Math.floor(Math.random() * 9);
            } 
        }
        */

        if (count > 9) {} else {

          while (zed == 'X' || zed == 'O') {
            var r = Math.floor(Math.random() * 9);
            var zed = document.getElementById("D" + r).innerHTML;
            var zob = "D" + r;
            document.getElementById("demo").innerHTML = testConcat;
          }

          ai = document.createTextNode("O");
          alternate = 'O';
          oP.appendChild(ai);
          d.appendChild(oP);
        }
      }
    }

    var ii = document.createAttribute("id");
    ii.value = "D" + i;



    d.setAttributeNode(ii);
    var z = "D" + i;
    if (i == 3 || i == 6) {
      document.getElementById(z).style.clear = "left";
    }
  }
}

最佳答案

代码中几乎没有问题,但主要问题是当您寻找下一个空槽时,您正在检查 Div 的innerHTML 是否等于“X”或“O”。您无法使用此逻辑,因为您要在以“X”或“O”作为文本的 div 内附加 p 标记。

因此,当您在 while 循环内执行 document.getElementById("D"+r).innerHTML 时,您要么会得到空(这对您有用),要么会得到其中之一

<p>X</p>
<p>O</p>

(这将开始导致问题),因为这将使代码再次将子项附加到同一 Div 上。

您应该更好地检查 Div 内的子元素,如果已经有一个子元素(插槽已填满),代码应该寻找另一个空插槽。

这是更新后的代码片段

函数createDivs() { 变量t; 瓦尔艾; var trackId =[]; 变量计数 = 0; var 备用 =“O”;

    for (i=0; i<9; i++) {
        var d = document.createElement("DIV");
        document.body.appendChild(d);

        d.onclick = function() {
            if (count > 8) { 
                return
            }

            var xP = document.createElement("P");
            var oP = document.createElement("P");
            var zed = "X";
            var zod;

            var childCount = "childID"+count;

            xP.setAttribute("id", childCount);

            trackId.push(childCount);
            /*
            alert(trackId.toString());
            */

            count++;
            oP.setAttribute("id", "childID"+count);
            count++;

            if (alternate == 'O') {
                t = document.createTextNode("X");
                alternate = 'X';
                xP.appendChild(t);
                this.appendChild(xP);
                this.onclick = function() {};
                if (count > 9) {
                }
                else
                {
                while (zed == 'X' || zed == 'O') 
                {
                var r = Math.floor(Math.random() * 9);
                if(document.getElementById("D"+r).childElementCount == 0)
                zed = "";
                zob = "D"+r;
                }

                ai = document.createTextNode("O");
                alternate = 'O';
                oP.appendChild(ai);
                document.getElementById(zob).appendChild(oP);
            }
            }
        }

        var ii = document.createAttribute("id");
        ii.value = "D" + i;



        d.setAttributeNode(ii);
        var z = "D" + i;
        if (i == 3 || i == 6) {
                document.getElementById(z).style.clear = "left";
        }
    }
 }

笨蛋:http://plnkr.co/edit/FgQ5KbNEvBpnag9mn9qO?p=preview

希望这对您有帮助。

关于javascript - 阻止 .appendChild 在已填充的 div 内创建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38292380/

相关文章:

javascript - 浏览器html5实时游戏。广播游戏状态选项

javascript - 单击链接后强制浏览器保存文件

javascript - 遍历同一行的元素

c - 如何将链表传递给C中的函数

ios - 参数是未声明的类型?

c++ - c++:std::function实例的目标返回空指针

javascript - 具有无限循环的自定义 jQuery slider

javascript - 如何使 xPages 名称选择器显示公司目录或扩展目录目录名称?

javascript - 如何通过特定属性的值获取 <td> 标签

javascript - 根据下拉列表选择更改文本区域的字体