【问题标题】:Multidimensional Array Not Updating (or is it...?)多维数组未更新(或者是......?)
【发布时间】:2014-01-23 10:14:26
【问题描述】:

如果不编写创可贴代码,我似乎无法解决最特殊的问题。

完整来源: http://sinsysonline.com/tictactoe_test.html 或小提琴: http://jsfiddle.net/JsXEP/

我将multidimensional array 用于JStable 用于HTML,用于数据和显示目的。

因此,对于 JS,我们的数据将如下所示:

var b = [ ["","",""], ["","",""], ["","",""] ];

该表格将是一个标准表格,对我们的 HTML 进行了一些 CSS 调整:

<table id="board">
<tr><td></td><td></td><td></td></tr>
<tr><td></td><td></td><td></td></tr>
<tr><td></td><td></td><td></td></tr>
</table>

所以,这就是问题所在。输入工作正常,重置游戏似乎工作正常,但让我们创建一个use-case 以便我可以演示问题。

如果我最初使用3grid size,然后尝试在不刷新页面的情况下使用grid size4 制作游戏,数据似乎显示在我的array 的右上角代码按预期工作。

但是,当您 console.log(b) 时,它实际上不会更新 b 并且表中第一个 three rows 之后的任何内容都不会响应。

我收到以下控制台错误:

TypeError: b[row] is undefined

为什么b 实际上并没有随着增加的值而更新,即使我在click-handler 的开头为#go 将其定义为var b=[];

为什么我的#alert 调试框填写了正确的b 值?

抓挠头

感谢任何帮助...


HTML:

<div id="dashboard">
    <p>How large is your grid? (3-10)</p>
    <input type="text" id="size" size="1" />

    <p>Which icon would you like?</p>
    <select name="mydropdown" id="mark">
        <option value="check">Check-Mark</option>
        <option value="x">Traditonal X</option>
        <option value="o">Traditional O</option>
    </select>
    <h3 id="title">Troubleshooting Console</h3>
    <input type="button" id="go" value="Create Board / Reset" />
    <p id="alert">Alerts Live Here</p> 
</div>
<table id="board">
</table>

Javascript:

$("#go").click(function () {
    var b=[],
        s = parseInt($("#size").val()),
        v = $("#mark").val();
    if (s<3 || s>10) { alert("That is not a valid input. Please select 3-10"); return; }
    $('#board tr').remove();
    $('#alert').text("Your Turn!");

    for (var i = 0; i < s; i++) {
        var t = [];
        var $tr = $('<tr />').data('index', i + 1);

        for (var j = 0; j < s; j++) {
            t[j] = "";
            $('<td />').data('index', j + 1).appendTo($tr);
        }
        b.push(t);
        $("#board").append($tr);
    }

    $("#board").on('click', 'td', function () {
        var $td = $(this),
            td = $td.data('index')-1,
            row = $td.parent().data('index')-1;
        b[row][td] = "X";
        $td.removeClass().addClass(v);
        $('#alert').text(b);
    });
});

完整来源: http://sinsysonline.com/tictactoe_test.html 或小提琴: http://jsfiddle.net/JsXEP/

【问题讨论】:

  • 你检查row的值了吗?并且 jsfiddle 会更好地调试。
  • 添加了小提琴。是的,我做到了。它返回 3(在第 4 行,这是我们希望看到的)。问题似乎在b 的定义范围内。
  • 另一方面,如果我只是使用 loop up to 10 创建 array 本身,它可以无限期地正常工作...但这不符合我的目的,因为我希望arraytable 成正比。或者,如果我 开始 以 10 作为我的值,那么所有后续的变体也都有效。仅当最初选择的值低于下一个 game 时。
  • 请检查我的回答。

标签: javascript jquery html arrays dom


【解决方案1】:

问题在于闭包属性和点击函数的多个定义。 Updated Fiddle

$("#board").on('click', 'td', function () {
    var $td = $(this),
        td = $td.data('index')-1,
        row = $td.parent().data('index')-1;
    b[row][td] = "X";
    $td.removeClass().addClass(v);
    $('#alert').text(b);
});

每次用户更改设置时都会注册此函数,并且无论何时定义它,它都会捕获b。所以,第一次,让我们说,b 是 [3][3] 并且点击功能是用它创建的。下一次,b 是 [4][4] 并创建一个新的点击功能(旧的仍然存在,b [3][3])。所以他们俩现在都被解雇了。如果我选择 3 x 3 之外的任何东西,旧的会失败。这就是你面临这个问题的原因。

所以,我只是将点击功能的定义,bv 移到外面,现在可以正常工作了。

【讨论】:

  • Lau​​ghing 我尝试将它们设为全局,但忘记将点击功能分开:-P 非常感谢!
  • 现在只是一些关于数组逻辑的算法。再次非常感谢你。我对 DOM 操作相对较新,它是从 Javascript 切换到 jQuery 的一种杂耍,但像你这样的人使这成为可能 :-) View Current Version
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-03
  • 1970-01-01
  • 2012-09-07
  • 2021-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多