尝试在 jQuery 中设置 td 的索引
Trying to Set the Index of a td in jQuery
正在为我的 jQuery class 创建拼图交换益智游戏。现在我正在努力尝试用空白图块切换点击的图块(之后我会弄清楚如何将它限制在相邻的图块上)。我已经将两个索引的索引存储在新变量中,但我无法弄清楚如何将变量分配为 td 元素索引。
$(document).ready(function(){
$('img').click(function(){
var tileSelected = $(this); //grab the clicked tiles index
var tileIndexOld = $("img").index(tileSelected);
var blankTile = $("#blank"); //grab the blank tiles index
var blankIndexOld = $("img").index(blankTile);
var tileIndexNew = blankIndexOld; //swap tile and blank indexes
var blankIndexNew = tileIndexOld;
$(this).attr("index", tileIndexNew);
$("#blank").attr("index", blankIndexNew);
});
});
我也尝试过 $(tileSelected).index(tileIndexNew);和 $(this).index() = tileIndexNew;等。我似乎无法弄清楚如何用新索引覆盖。
编辑:
好吧,我已经看到了我(尝试的)索引交换方式的邪恶!仍在研究解决方案,但我正在改变轨道并专注于按照 Starscream1984 的建议更改 src。弄明白了再更新,谢谢大家!
解决方案:
在尝试了三种不同的方式(具有多个子变体)之后,这就是我最终得到的结果:
$(document).ready(function(){
$("td").click( function(){
var tileVertical = $(this).index(); //get clicked tiles vertical position via its td
var tileHorizontal = $(this).parent().index(); //get clicked tiles horizontal position via its tr
var blankTile = $("#blank").parent(); //getting the td that contains the blank tile
var blankVertical = blankTile.index(); //get blank tiles vertical position (via its td)
var blankHorizontal = blankTile.parent().index(); //get blank tiles horizontal position via its tr
if( Math.abs(blankVertical - tileVertical) + Math.abs(blankHorizontal - tileHorizontal) == 1) //check if clicked tile is adjacent to the blank tile
{
blankTile.empty().html( $(this).html() ); //put the tile html into the blank slot
$(this).html("<img id='blank' src='blank.jpeg' width='200px' />"); //fill the tile slot with the blank, ID IS CRITICAL!!!!
} //function will only run once if id is omitted from this tag!!!
return 1;
});
});
我最初的方法是尝试使用索引作为一个快速而肮脏的变量来换出。我发现,在这种情况下,索引更像是一张带有 x 和 y 坐标的地图。需要交换的是 table 单元格的内部 html,而不是索引本身。
您需要使用 jQuery DOM 修改方法移动元素。此解决方案假定每个图块都包含在网格中的 DIV 中。
$('img').click(function(){
var tileSelected = $(this);
var parentSelected = tileSelected.parent();
var blankTile = $("#blank");
var blankParent = blankTile.parent();
parentSelected.append(blankTile);
blankParent.append(tileSelected);
});
A)
$('img').each(function(index, elem){
console.log(index);
});
B)
$('img').click(function(){
var index = $(this).index();
//or
//var index = $('img').index($(this));
console.log(index);
});
是正确的方法。所以你的代码似乎是正确的。您确定在您 运行 函数时所有图像都存在吗?您是否注意到您的选择器在 DOM 中找到了 all img?
如果你想为 td 分配一个索引变量,一种动态的方法如下:
$(document).ready(function(){
var tdArray = $("td");//grabs all td elements
for(i = 0; i < tdArray.length; i++){
$(tdArray[i]).attr('data-index',i);//adds a data-index attribute on each one
}
});
然后您可以像这样处理点击事件:
$("td").click(function(){
alert($(this).attr('data-index'));
});
要跟踪您的空白图块,您可以简单地将其数据索引分配给全局变量。
正在为我的 jQuery class 创建拼图交换益智游戏。现在我正在努力尝试用空白图块切换点击的图块(之后我会弄清楚如何将它限制在相邻的图块上)。我已经将两个索引的索引存储在新变量中,但我无法弄清楚如何将变量分配为 td 元素索引。
$(document).ready(function(){
$('img').click(function(){
var tileSelected = $(this); //grab the clicked tiles index
var tileIndexOld = $("img").index(tileSelected);
var blankTile = $("#blank"); //grab the blank tiles index
var blankIndexOld = $("img").index(blankTile);
var tileIndexNew = blankIndexOld; //swap tile and blank indexes
var blankIndexNew = tileIndexOld;
$(this).attr("index", tileIndexNew);
$("#blank").attr("index", blankIndexNew);
});
});
我也尝试过 $(tileSelected).index(tileIndexNew);和 $(this).index() = tileIndexNew;等。我似乎无法弄清楚如何用新索引覆盖。
编辑:
好吧,我已经看到了我(尝试的)索引交换方式的邪恶!仍在研究解决方案,但我正在改变轨道并专注于按照 Starscream1984 的建议更改 src。弄明白了再更新,谢谢大家!
解决方案:
在尝试了三种不同的方式(具有多个子变体)之后,这就是我最终得到的结果:
$(document).ready(function(){
$("td").click( function(){
var tileVertical = $(this).index(); //get clicked tiles vertical position via its td
var tileHorizontal = $(this).parent().index(); //get clicked tiles horizontal position via its tr
var blankTile = $("#blank").parent(); //getting the td that contains the blank tile
var blankVertical = blankTile.index(); //get blank tiles vertical position (via its td)
var blankHorizontal = blankTile.parent().index(); //get blank tiles horizontal position via its tr
if( Math.abs(blankVertical - tileVertical) + Math.abs(blankHorizontal - tileHorizontal) == 1) //check if clicked tile is adjacent to the blank tile
{
blankTile.empty().html( $(this).html() ); //put the tile html into the blank slot
$(this).html("<img id='blank' src='blank.jpeg' width='200px' />"); //fill the tile slot with the blank, ID IS CRITICAL!!!!
} //function will only run once if id is omitted from this tag!!!
return 1;
});
});
我最初的方法是尝试使用索引作为一个快速而肮脏的变量来换出。我发现,在这种情况下,索引更像是一张带有 x 和 y 坐标的地图。需要交换的是 table 单元格的内部 html,而不是索引本身。
您需要使用 jQuery DOM 修改方法移动元素。此解决方案假定每个图块都包含在网格中的 DIV 中。
$('img').click(function(){
var tileSelected = $(this);
var parentSelected = tileSelected.parent();
var blankTile = $("#blank");
var blankParent = blankTile.parent();
parentSelected.append(blankTile);
blankParent.append(tileSelected);
});
A)
$('img').each(function(index, elem){
console.log(index);
});
B)
$('img').click(function(){
var index = $(this).index();
//or
//var index = $('img').index($(this));
console.log(index);
});
是正确的方法。所以你的代码似乎是正确的。您确定在您 运行 函数时所有图像都存在吗?您是否注意到您的选择器在 DOM 中找到了 all img?
如果你想为 td 分配一个索引变量,一种动态的方法如下:
$(document).ready(function(){
var tdArray = $("td");//grabs all td elements
for(i = 0; i < tdArray.length; i++){
$(tdArray[i]).attr('data-index',i);//adds a data-index attribute on each one
}
});
然后您可以像这样处理点击事件:
$("td").click(function(){
alert($(this).attr('data-index'));
});
要跟踪您的空白图块,您可以简单地将其数据索引分配给全局变量。