2015-09-27 6 views
0

Я строю игру tic-tac-toe, ниже приведен код, который я установил, чтобы установить флажок игрокаX, затем переключиться на игрока O. Используя $ .on ('click'), чтобы прослушать, в какую ячейку была нажата кнопка. Я получаю то, что, по моему мнению, происходит в пузырях. Каждый раз, когда нажимается одно окно, следующий блок производит экспоненциальную реакцию и так далее. Я пробовал e.stopPropogation, но он блокирует следующий ход.Событие jQuery bubbling

Как остановить реакцию наводнения?

function playX() { 


    $box.on('click', function (e) { 
     console.log(this); 
     var a = e.target.dataset.index; 
     b[a] = 'X'; 
     $(this).text('X'); 
     playO();  
    }) 
} 
    function playO() { 

    $box.on('click', function (e) { 
     console.log(this); 
     var b = e.target.dataset.index; 
     b[b] = 'O'; 
     $(this).text('O'); 

     playX(); 

}) 
} 

Вот ссылка на все это http://jsfiddle.net/shallak/fdctcvdt/

(Я также использую рамки CSS, материализовать)

+1

вы не должны быть привязку события каждый раз, когда playX или playO называется .. каждый раз, когда другой обработчик зарегистрирован, который вызывает «экспоненциальный» поведение вы столкнулись , Самое быстрое решение вашей проблемы - использовать «$ box.one (...)» вместо «$ box.on (...)» (это будет связывать событие один раз и очистить обработчик) –

+0

Как @elad. chen заявил, что вам нужно всего лишь связать событие click один раз. более того, лучше иметь 1 функцию и просто изменить код, если это X или O. – Saar

ответ

0

Вы не должны связывать событие каждый раз, когда playX или playO является каждый раз, когда регистрируется другой обработчик, который вызывает «экспоненциальное» поведение, которое вы испытываете. Самое быстрое решение вашей проблемы - использовать «$ box.one (...)» вместо «$ box.on (...)» (это будет связывать событие один раз и очистить обработчик)

В любом случае Я взял на себя смелость оптимизируйте реализации:

var results = (function() { 
    var currentPlayer = "X" 
    var b = new Array(9) // Assumed 'b' was array of played moves 

    // "$box" - make sure this one is available by this point 
    // or just set it accordingly. 
    $box.on("click", function(e) { 
     var index = e.target.dataset.index; 

     // make sure the current index was never played 
     if (index === undefined) { 
      if (currentPlayer === "X") { 
       b[index] = "X" 
       currentPlayer = "O" 
      } 
      else { 
       b[index] = "O" 
       currentPlayer = "X" 
      } 
     } 
    }) 

    // Return a reference to the array which holds each squre value 
    return b; 
}()) 
+0

Спасибо, elad и Stuart, очень полезно. Я думал, что .one() тоже будет работать, но я получаю те же ошибки. Я также попытался использовать исправление Стюарта и изменил его, чтобы он работал (добавив текст «x» или «o»), но он все еще не работает полностью. Я новичок в js, поэтому я уверен, что чего-то не хватает. – s77

+0

Какая проблема? Неясно –

+0

Когда я использую .one(), это не остановило пузырь. Когда я использовал уточнение Стюарта, я не мог получить текст в поле, хотя я и пытался. Я понимаю идею, содержащуюся в коде Стюарта, но мне не удалось заставить ее работать. – s77

Смежные вопросы