在网格上获取div的位置

时间:2013-01-12 16:32:46

标签: javascript jquery jquery-ui

我正在制作棋盘游戏我正在寻找更好的方法来管理棋盘上的棋子。我现在拥有的是一种从坐标放置在板上的方法。这是存储播放器数据的JSON对象:

"players" : {
    "1" : {
        "id" : 1,
        "name": "ilya",
        "units" : [
            {
                "id" : 1,
                "row" : 1,
                "square" : 2
            },{
                "id" : 2,
                "row" : 2,
                "square" : 1
            },{
                "id" : 3,
                "row" : 3,
                "square" : 1
            }
        ]
    },

我只是通过创建一个div并将其附加到相应的棋盘方格div并使用jquery-ui移动它们来放置它们:

$('<div/>', {
    class: 'draggable player' + player + ' unit unit' + unit,
}).appendTo('.row' + row + ' .square' + square + ' .unitPosition');

rowsquare是一个表格,unitPositionsquare

中的帮助程序类

现在要在玩家移动后取回数据,我可以找回行和方形类并提取它们的数字,但在我看来这是一种非常低效的方式。有没有更好的方法来管理这样的网格并存储每个单元/单元的位置数据?

按照流行的要求,这是html(缩写为示例):

<div id="board">
    <div class="clearfix row row1">
        <div class="square square1">
            <div class="unitPosition"></div>
        </div>
        <div class="square square2">
            <div class="unitPosition"></div>
        </div>
        <div class="square square3">
            <div class="unitPosition"></div>
        </div>
    </div>
    <div class="clearfix row row2">
        <div class="square square1">
            <div class="unitPosition"></div>
        </div>
        <div class="square square2">
            <div class="unitPosition"></div>
        </div>
        <div class="square square3">
            <div class="unitPosition"></div>
        </div>
    </div>
</div>

董事会: enter image description here

2 个答案:

答案 0 :(得分:2)

为了更新数据对象,如果使用units作为每个元素的键将id更改为对象而不是数组,则会使其更简单

"players" : {
    "1" : {
        "id" : 1,
        "name": "ilya",
        "units" : {
            1: {
                "id" : 1,
                "row" : 1,
                "square" : 2
            },
            2:{
                "id" : 2,
                "row" : 2,
                "square" : 1
            }        
    }

您可以使用index()方法获取行和单元格索引。对每个元素使用data-属性将有很大帮助。

当您阅读数据时,您可以根据数据中eq()row的值,使用squre找到单元格。

var $cell = $('tr').eq( row ).find('td').eq( square);
$('<div data-player="'+player.id+'" data-unit_id="'+unit+'"/>', {
    class: 'draggable player' + player + ' unit unit' + unit,
}).appendTo($cell);

当您将设备放入新的方块时:

/* pseudo code, not sure what your drop/append code looks like*/

var $cell= /* your logic to define the cell being placed in*/
var square= $cell.index();
var row= $cell.parent().index();
/* read player and unit from "data-" attributes of DIV*/
var unit= $(this).data('unit_id'), player= $(this).data('player');

现在通过修改数据结构,可以非常轻松地更新主对象players

players[player].units[unit].row=row;
players[player].units[unit].square=square;

简单的单元格/行索引演示:http://jsfiddle.net/buh4h/

API参考:

http://api.jquery.com/index/

http://api.jquery.com/eq/

答案 1 :(得分:1)

我们对您的代码了解不多,但您似乎希望能够将数据附加到HTML元素,而不必依赖类,并从类名中提取数字。

您可以为每个表格单元格添加data-属性,并使用播放器div来分隔数据,而不是(或除此之外)使用类。你的HTML会变成这样:

<table>
    <tr>
        <td data-row="1" data-col="1">
            <div data-player="1"></div>
        </td>
        <!-- etc -->
    </tr>
    <!-- etc -->
</table>

然后,您可以通过阅读这些属性或使用.data()方法使用jQuery检索这些值:

// Assuming you're inside an event handler and "this" is a td
var row = $(this).attr('data-row');
// or
var row = $(this).data('row');