Установить динамическую переменную?

Это может быть очень просто, но мой мозг почему-то не понимает этого.

Я делаю игру Tic-Tac-Toe/Hollywood Squares, и все квадратные переменные имеют значение null square0Value = ""; square1Value = ""; и т.п.

Когда вы щелкаете по одному из квадратов, он запускает загрузочный модал с крупным планом квадрата и двумя кнопками, X и O, и передает все данные из квадрата сетки в модал, так что мне нужна только одна модальная разметка блок.

Когда вы нажимаете X или O, мне нужно, чтобы он динамически устанавливал квадратную переменную, которая связана с модальным значением либо X, либо O, как только модальное окно закрыто, другая функция javascript проверяет все переменные, чтобы увидеть, есть ли 3. -in-a-row и отображает файл console.log о том, что X или O выиграли игру. Но я не пишу это правильно, и ни одна из квадратных переменных не устанавливается.

Вот мой код:

HTML:

<button class="squareButton" data-toggle="modal" data-target="#squareModal" data-square="" data-nameplate="" data-xo="" data-id="square0">
     <div class="xo"></div>
     <div class="nameplate"></div>
     <div class="desk"></div>
</button>

(Я повторил это 9 раз.)

[Модальная разметка]

<div class="modal fade-scale" id="squareModal" tabindex="-1" role="dialog" aria-labelledby="squareModal">
  <div class="modal-dialog modal-lg" role="document">
    <div class="modal-content">
      <div class="modal-body">
        <div class="square">
            <div class="squareModal">
                <div class="xo"></div>
                <div class="nameplate"></div>
                <div class="desk"></div>
            </div>
        </div>
      </div>
      <div class="modal-footer">
        <button type="button" id="modalX" class="btn btn-default btn-xo" data-dismiss="modal">X</button>
        <button type="button" id="modalO" class="btn btn-default btn-xo" data-dismiss="modal">O</button>
      </div>
    </div>
  </div>
</div>

JS: Уменя есть построенный массив, который заполняет каждый квадрат знаменитостью / личностью, и функция document.ready, которая перемешивает массив, заполняет квадраты:

$(document).ready(function(){
    shuffle(squares);
    for (i = 0; i < 9; i++) { 
        $("#square"+i).find('.squareButton').addClass(squares[i][0]);
        $("#square"+i).find('.squareButton').data("square", squares[i][0]);
        *// the [0] block of the array is a class filler*
        $("#square"+i).find('.squareButton').data("nameplate", squares[i][1]);
        *// the [1] block of the array is the celebrity's name*
        $("#square"+i).find('.nameplate').html(squares[i][1]);
    }
});

var square0Value = "";
    var square1Value = "";
    var square2Value = "";
    var square3Value = "";
    var square4Value = "";
    var square5Value = "";
    var square6Value = "";
    var square7Value = "";
    var square8Value = "";

    var squareClass = "";
    var squareName = "";
    var squareXO = "";
    var squareId = "";

    $('#squareModal').on('show.bs.modal', function (event) {
      var button = $(event.relatedTarget);
      squareClass = button.data('square');
      squareName = button.data('nameplate');
      squareXO = button.data('xo');
      squareId = button.data('id');
      console.log(squareId);

      var modal = $(this)
      modal.find('.modal-body').addClass(squareClass);
      modal.find('.modal-body .nameplate').html(squareName);
      modal.find('.modal-body .xo').html(squareXO);
    })

    $('#squareModal').on('hidden.bs.modal', function (event) {
        var modal = $(this);
        modal.find('.modal-body').removeClass(squareClass);
        checkWin();
    });

    function clickX(){
        $(eval(squareId+'Value')).val("X");
        $(eval(squareId)).addClass('selected');
        $(eval(squareId)).find(".squareButton").data("xo", "X");
        $(eval(squareId)).find(".xo").html("X");
    }

    function clickO(){
        $(eval(squareId)).addClass('selected');
        $(eval(squareId+'Value')).val("O");
        $(eval(squareId)).find(".squareButton").data("xo", "O");
        $(eval(squareId)).find(".xo").html("O");
    }

    $("#modalX").on("click", function(e){
        e.preventDefault();
        clickX();
    });

    $("#modalO").on("click", function(e){
        e.preventDefault();
        clickO();
    });

function checkWin() {
    for (i = 0; i < 9; i++) { 
        console.log("Square"+i+": " + eval('square'+[i]+'Value'));
    }

    checkWinX();
    checkWinO();
    if (square0Value != "" && square1Value != "" && square2Value != "" && square3Value != "" && square4Value != "" && square5Value != "" && square6Value != "" && square7Value != "" && square8Value != ""){
        checkBoardFull();
    }
}

Проблема заключается в функциях clickX() и clickO(), где я пытаюсь установить значение (eval(squareId+'Value')) в качестве значения X или O, которое необходимо. Я хочу сделать это как можно более динамичным, поэтому не нужно писать функцию для каждого модального режима.

Заранее спасибо.

3 ответа

Так что да... преобразование моих глобальных квадратных значений в массив было НАМНОГО более простым способом организации вещей... извините всех.

Не уверен, почему вы используете eval,

$("#"+squareId).addClass()

Может быть достаточно

Вот мое предложение.

var button = $(event.relatedTarget);

Если я читаю это правильно, то это кнопка, по которой была нажата кнопка модального показа. Если это так, то я полагаю, что это далеко не одно предположение, что только один мод может показывать одновременно. Если это так, то вы можете сделать эту переменную выше, а не в пределах этого обработчика.

Что это делает для вас? Что ж, если вы сделаете это, тогда вы можете использовать этот элемент в вашем clickX и clickY. Например...

    function clickX(){
        button.data('xo', 'X');
        button.find('.xo').html('X');
    }

Мне неясно, на что ссылаются другие, но если у вас есть кнопка, у вас есть доступ к поиску вложенных дочерних элементов или к поиску родительских элементов, если вам нужно их найти.

Другие вопросы по тегам