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

way*_*are 26 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");
    }
Run Code Online (Sandbox Code Playgroud)

Tom*_*lak 26

您的代码不符合正确的原则.

$(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
});
Run Code Online (Sandbox Code Playgroud)
  1. 在document.ready函数中包装所有内容.尽可能避免使用全局变量.
  2. 利用jQuery this为您管理的事实.this如果你直接传递回调函数而不是自己调用它,那么它将永远是你所期望的.

  • @wayfare**a)**污染全局命名空间有副作用,最突出的变量来自项目的不同部分,相互覆盖.只要项目很小,就不会发生这种情况.当项目增长时,这会引入烦人且难以发现的错误.除此之外,通过全局变量运输状态是不好的方式.**b)**jQuery对象*是*数组.无需转换它.`$('td')`返回一个`<td>`节点数组.请注意,我使用`$ varname`来表示包含jQuery对象的变量 - 这是一个约定. (2认同)

Had*_*das 11

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

$("td").click(function(){
        marked($(this));
        return false;
    });
Run Code Online (Sandbox Code Playgroud)

并在功能:

function marked(td)
{
     console.log($(td));  
     $(td).addClass("marked");
     //....
}
Run Code Online (Sandbox Code Playgroud)