Как правильно передать $ (this) в функцию click jQuery - PullRequest
26 голосов
/ 05 марта 2012

Я пытаюсь сделать tictactoe проект в jQuery, и у меня возникла серьезная проблема ...

Плитки находятся в тегах <td>, и я пытаюсь сделать так, чтобы, когда пользователь щелкаетна плитке он вызывает «помеченную» функцию.

Если мы теперь посмотрим на «помеченную» функцию, $(this) предназначен для узла <td>, из которого была вызвана функция.

Однако он ничего не делал, поэтому я проверил консоль и, очевидно, $(this) содержал объект DOM Window.

Могу ли я в любом случае отправить правильный тип $(this) в "отмеченную" функцию?

Спасибо!

<script type="text/javascript">

    var TURN_X = false;
    var TURN_O = true;

    var turn = false;  // this is to see whos turn it is.

    $(document).ready(function(){

        var listCells = $.makeArray($("td"));
        $("td").click(function(){marked(listCells)});   //THIS IS WHERE I HAVE PROBLEMS
        return false;
    });

    function marked(arr)
    {
        console.log($(this));  // THIS CONSOLE LOG RETURNS "DOM Window"
        $(this).addClass("marked");

        if(turn == TURN_X)
        {
        this.innerHTML = "X";
        turn = false;
        }
        else
        this.innerHTML = "O";

        var tileNum = $(this).attr("id");
    }

Ответы [ 8 ]

26 голосов
/ 05 марта 2012

Ваш код не соответствует правильным принципам.

$(function(){
    var TURN_X = "X",
        TURN_O = "O", 
        turn   = TURN_O,
        $listCells = $("td");

    function marked() {        // define event handler
        var $this   = $(this),
            tileNum = $this.attr("id");

        if ( !($this.hasClass("marked") ) {
            $this.addClass("marked").text(turn);
            turn = (turn == TURN_X) ? TURN_O : TURN_X;
        }
    }

    $listCells.click(marked);  // attach event handler
});
  1. Обернуть все в функции document.ready. По возможности избегайте глобальных переменных.
  2. Воспользуйтесь тем, что jQuery управляет this для вас. this всегда будет тем, что вы ожидаете, если будете передавать функции обратного вызова напрямую, а не вызывать их самостоятельно.
11 голосов
/ 05 марта 2012

Отправьте элемент, который инициирует событие, в функцию следующим образом:

$("td").click(function(){
        marked($(this));
        return false;
    });

и в функцию:

function marked(td)
{
     console.log($(td));  
     $(td).addClass("marked");
     //....
}
4 голосов
/ 13 мая 2016

Проще говоря, используйте bind:

$(".detailsbox").click(function(evt){
   test.bind($(this))();
});
function test()
{
   var $this = $(this);
}
1 голос
/ 05 марта 2012

Попробуйте:

$("td").click(function(event){
    marked(listCells, $(this));
});

Тогда:

function marked(arr, sel) {
    console.log($(this));
    sel.addClass("marked");

    if(turn == TURN_X) {
        this.innerHTML = "X";
        turn = false;
    } else {
        this.innerHTML = "O";
    }
    var tileNum = $(this).attr("id");
}
0 голосов
/ 05 марта 2012
$(document).ready(function(){
    var TURN_X = false,
        TURN_O = true,
        turn = false,
        listCells = $.makeArray($("td"));

    $("td").click(function() {
        marked(listCells, this)
    });

    function marked(arr, self) {
        $(self).addClass("marked");

        if(turn == TURN_X) {
            self.innerHTML = "X";
            turn = false;
        }else{
            self.innerHTML = "O";
            var tileNum = self.id;
        }
    }
});
0 голосов
/ 05 марта 2012

Вам нужно передать $(this) вашей функции:

$("td").click(function(){ marked(listCells, $(this))} );

и изменить вашу функцию следующим образом:

function marked(arr, that)
{
  that.addClass("marked");

  if(turn == TURN_X)
  {
    that.innerHTML = "X";
    turn = false;
  }
  else
    that.innerHTML = "O";

  var tileNum = that.attr("id");
}
0 голосов
/ 05 марта 2012

Вы можете использовать метод call, чтобы указать область действия функции:

$("td").click(function(){ marked.call(this, listCells); });

Теперь функция marked может получить доступ к элементу, по которому щелкнули, используя ключевое слово this.

0 голосов
/ 05 марта 2012

попробуйте это:

$(function(){
    var listCells = $.makeArray($("td"));
    $("td").click(function(){marked($(this),listCells)});  
});



function marked(o,arr)
{
...
...