Проблема с $(это)

Я пытаюсь попрактиковаться в JS, написав крестики-нолики. Вот мой код до сих пор:

$(document).ready(function() {
    var turn = "X";
    $("td").on("click", function() {
        updateTile();
    });
    function updateTile() {
        if ($(this).html() == "") {
            $(this).html("<h1>" + turn + "</h1>");
            updateTurn();
        }
    }
    function updateTurn() {
        if (turn == "X") {
            turn = "O";
        }
        else if (turn == "O") {
            turn = "X";
        }
    }
});

Это не работает. Моя отладка привела меня к мысли, что $(this) в updateTile() не относится к $(this) когда td нажата. Если так, то почему? $("td") это объект, который вызывает updateTile()так не должно $(this) обратитесь к td элемент?

3 ответа

Решение

Вы вызываете анонимную функцию вместо своей собственной.

Свяжите свой клик, как это:

$("td").on("click", updateTile);

РЕДАКТИРОВАТЬ:

ОП хотят делать другие вещи по клику.

Таким образом, вы можете использовать call, чтобы иметь возможность использовать this и функцию анонима.

$("td").on("click", function() {
   alert("Click");
   updateTile.call(this);
});

Вы вне контекста, так this это не this ты хочешь.

$(document).ready(function() {
    var turn = "X";
    $("td").on("click", function() {
        updateTile(this);
    });
    function updateTile(that) {
        if ($(that).html() == "") {
            $(that).html("<h1>" + turn + "</h1>");
            updateTurn();
        }
    }
    function updateTurn() {
        if (turn == "X") {
            turn = "O";
        }
        else if (turn == "O") {
            turn = "X";
        }
    }
});

JQuery внутренне связывает текущий элемент с this контекст функции, которую вы передаете в качестве обработчика. Итак, просто передайте функцию напрямую:

$("td").on("click", updateTile);
Другие вопросы по тегам