函数内部函数未执行

时间:2019-10-21 18:02:36

标签: javascript

对不起,标题很抱歉,我不确定如何正确地用措辞

这是我正在尝试制作的Tic Tac Toe游戏-

我试图在我的reset()内部调用我的set(),以便每次单击#reset按钮时,容器上的下一次单击将显示“ X”。

现在,它适用于前两次单击,当我将该函数传递给HTML button标记时,它可以运行3次,但是接下来的单击将显示“ O”。我需要它每次都能正常工作,因为当您重置游戏时,它应该是“ Player 1轮到”,它在容器上显示“ X”

#heads {
    padding-top: 30px;
    text-align: center;
    font-size: 30px;
    color: rgb(46, 46, 46);
}

#container {
    text-align: center;
    margin-top: 20px;
    display: grid;
    grid-template-columns: 1fr 1fr 1fr;
    grid-template-rows: 1fr 1fr 1fr;
    width: 300px;
    height: 300px;
    background-color: rgb(46, 46, 46);
    border: 1px solid  rgb(255, 255, 255);
}

#container div {
    font-size: 25px;
    border: 2px solid rgb(255, 255, 255);
    color: white;
    text-align: center;
    padding-top: 35px;
}

#container div:hover {
    background-color:rgb(58, 58, 58);
}

#reset {
    margin-top: 10px;
    background-color: rgb(46, 46, 46);
    color: white;
    border-radius: 3px;
    outline: none;
}

#reset:hover {
   background-color:  rgb(58, 58, 58);
}

#divone {
    font-size: 18px;
    margin-top: 15px;
    color: rgb(46, 46, 46);
}

#divtwo {
    display: none;
    font-size: 18px;
    margin-top: 15px;
    color: rgb(46, 46, 46);
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link href="./style.css" type="text/css" rel="stylesheet">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>    <title>Tic Tac Toe </title>
</head>
<body>

<header id="heads">TIC TAC TOE</header>
<center>
<div id="divone">PLAYER 1's TURN</div>
<div id="divtwo">PLAYER 2's TURN</div>
</center>


 <center>   
<div id="container">


</div>
</center>

<center>
<button id="reset">RESET GAME</button>
</center>


</body>

<script>
const container = document.querySelector('#container')
gameBoard = ['', '', '', '', '', '', '', '', '']

// creates divs for gameboard
let html = '';
for (var i = 0; i <= 8; i++) {
    html += '<div class="letters">' + gameBoard[i] + '</div>';
}
container.innerHTML += html;


// object constructors 
function Player1(name) {
    this.name = name
    this.one = function () {
        event.target.textContent = 'X'
        let x = document.getElementById('playertwo')
    }
}
function Player2(name) {
    this.name = name
    this.two = function () {
        event.target.textContent = 'O'
    }
}

let bop = new Player1('bop')
let bob = new Player2('bob')


// toggles between player 1 and player 2 functions to mark the table
function set() {
    $('#container').click(function () {
        var clicks = $(this).data('clicks');
        if (clicks) {
            bob.two()
        } else {
            bop.one()
        }
        $(this).data("clicks", !clicks);
    });
}
set()


// 'reset game' button, clears table, sets 'player 1's turn', and makes the next click 'X'
function reset(){
document.querySelector('#reset').addEventListener("click", () => {


    set()

    container.innerHTML = html;

    document.querySelector('#divone').style.display = 'block'
    document.querySelector('#divtwo').style.display = 'none'

})
}
reset()


// display whos turn it is
container.addEventListener('click', () => {
    if (document.getElementById('divone')) {

        if (document.getElementById('divone').style.display == 'none') {
            document.getElementById('divone').style.display = 'block';
            document.getElementById('divtwo').style.display = 'none';
        }
        else {
            document.getElementById('divone').style.display = 'none';
            document.getElementById('divtwo').style.display = 'block';
        }
    }

})
</script>
</html>

谢谢您的帮助!

1 个答案:

答案 0 :(得分:1)

问题在于set函数本身。当您继续调用set函数时,它将继续向容器添加多个事件侦听器。因此,当您单击该框时,单击一次将触发多个事件。而是一次附加一个事件侦听器,然后像下面的代码片段一样在重置时设置正确的数据属性

#heads {
    padding-top: 30px;
    text-align: center;
    font-size: 30px;
    color: rgb(46, 46, 46);
}

#container {
    text-align: center;
    margin-top: 20px;
    display: grid;
    grid-template-columns: 1fr 1fr 1fr;
    grid-template-rows: 1fr 1fr 1fr;
    width: 300px;
    height: 300px;
    background-color: rgb(46, 46, 46);
    border: 1px solid  rgb(255, 255, 255);
}

#container div {
    font-size: 25px;
    border: 2px solid rgb(255, 255, 255);
    color: white;
    text-align: center;
    padding-top: 35px;
}

#container div:hover {
    background-color:rgb(58, 58, 58);
}

#reset {
    margin-top: 10px;
    background-color: rgb(46, 46, 46);
    color: white;
    border-radius: 3px;
    outline: none;
}

#reset:hover {
   background-color:  rgb(58, 58, 58);
}

#divone {
    font-size: 18px;
    margin-top: 15px;
    color: rgb(46, 46, 46);
}

#divtwo {
    display: none;
    font-size: 18px;
    margin-top: 15px;
    color: rgb(46, 46, 46);
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link href="./style.css" type="text/css" rel="stylesheet">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>    <title>Tic Tac Toe </title>
</head>
<body>

<header id="heads">TIC TAC TOE</header>
<center>
<div id="divone">PLAYER 1's TURN</div>
<div id="divtwo">PLAYER 2's TURN</div>
</center>


 <center>   
<div id="container">


</div>
</center>

<center>
<button id="reset">RESET GAME</button>
</center>


</body>

<script>
const container = document.querySelector('#container')
gameBoard = ['', '', '', '', '', '', '', '', '']

// creates divs for gameboard
let html = '';
for (var i = 0; i <= 8; i++) {
    html += '<div class="letters">' + gameBoard[i] + '</div>';
}
container.innerHTML += html;


// object constructors 
function Player1(name) {
    this.name = name
    this.one = function () {
        event.target.textContent = 'X'
        let x = document.getElementById('playertwo')
    }
}
function Player2(name) {
    this.name = name
    this.two = function () {
        event.target.textContent = 'O'
    }
}

let bop = new Player1('bop')
let bob = new Player2('bob')


// toggles between player 1 and player 2 functions to mark the table

    $('#container').click(function () {
        var clicks = $(this).data('clicks');
        console.log(this, $(this).data("clicks"));
        if (clicks) {
        console.log('two called');
            bob.two()
        } else {
                console.log('one called');
            bop.one()
        }
        $(this).data("clicks", !clicks);
    });




// 'reset game' button, clears table, sets 'player 1's turn', and makes the next click 'X'
function reset(){
document.querySelector('#reset').addEventListener("click", () => {


$('#container').data("clicks", false);

    container.innerHTML = html;

    document.querySelector('#divone').style.display = 'block'
    document.querySelector('#divtwo').style.display = 'none'

})
}
reset()


// display whos turn it is
container.addEventListener('click', () => {
    if (document.getElementById('divone')) {

        if (document.getElementById('divone').style.display == 'none') {
            document.getElementById('divone').style.display = 'block';
            document.getElementById('divtwo').style.display = 'none';
        }
        else {
            document.getElementById('divone').style.display = 'none';
            document.getElementById('divtwo').style.display = 'block';
        }
    }

})
</script>
</html>