如何在单击jQuery函数中正确传递$(this)
我想在jQuery中创建一个tictactoe项目,我遇到了一个重大问题……
瓷砖在
如果我们现在查看“标记”函数, $(this)
应该是调用函数的
但是,它没有做任何事情,所以我检查了控制台,显然$(this)
包含DOM Window对象。
无论如何我可以将正确的$(this)
发送到“标记”function吗?
谢谢!
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"); }
您的代码不符合正确的原则。
$(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 });
- 在document.ready函数中包装所有内容。 尽可能避免使用全局变量。
- 利用jQuery为您管理的事实。 如果你直接传递回调函数而不是自己调用它,
this
将永远是你所期望的。
将触发事件的元素发送到以下函数:
$("td").click(function(){ marked($(this)); return false; });
并在function:
function marked(td) { console.log($(td)); $(td).addClass("marked"); //.... }
更简单地说,使用bind:
$(".detailsbox").click(function(evt){ test.bind($(this))(); }); function test() { var $this = $(this); }
试试这个:
$(function(){ var listCells = $.makeArray($("td")); $("td").click(function(){marked($(this),listCells)}); }); function marked(o,arr) { ...
您可以使用call
方法指定函数的范围:
$("td").click(function(){ marked.call(this, listCells); });
现在, marked
函数可以使用this
关键字访问被点击的元素。
你需要将$(this)
传递给你的函数:
$("td").click(function(){ marked(listCells, $(this))} );
并修改你的function:
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"); }
尝试:
$("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"); }
$(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; } } });
- 在由jquery .load()加载的容器上使用lazyload.js
- 如何在角度数据表中组合数据和显示图像
- Safari和Chrome中的跨域AJAX调用
- 在使用jqueryvalidation插件时重置表单
- 如何使用jQuery在屏幕上移动div
- 从C#中的代码调用JQuery函数
- 使用Jquery datatable jeditable而不使用必填字段URL
- 使用jqGrid进行内联编辑时,在表格上方显示表单控件
- 如何在jQuery中编写一个简单的预订DOM树遍历算法?
Interesting Posts