如何在单击jQuery函数中正确传递$(this)

时间:2012-03-05 08:14:14

标签: jquery click this

我正在尝试在jQuery中创建一个tictactoe项目,我遇到了一个重大问题......

瓷砖位于<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 个答案:

答案 0 :(得分:25)

您的代码不遵循正确的原则。

$(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将永远是您所期望的。

答案 1 :(得分:11)

将触发事件的元素发送到如下函数:

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

并在函数中:

function marked(td)
{
     console.log($(td));  
     $(td).addClass("marked");
     //....
}

答案 2 :(得分:4)

更简单地说,使用bind:

$(".detailsbox").click(function(evt){
   test.bind($(this))();
});
function test()
{
   var $this = $(this);
}

答案 3 :(得分:1)

尝试:

$("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");
}

答案 4 :(得分:0)

试试这个:

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



function marked(o,arr)
{
...

答案 5 :(得分:0)

您可以使用call方法指定函数的范围:

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

现在marked功能可以使用this关键字访问点击的元素。

答案 6 :(得分:0)

您需要将$(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");
}

答案 7 :(得分:0)

$(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;
        }
    }
});