0

我已将大型应用程序中的一个难以跟踪的错误隔离到以下最小工作示例:

<html>
<head>
    <title>Test page</title>
    <script type="text/javascript" language="JavaScript">
        function OnClickHandler (t) {
            t.disabled = true;
            var n = parseInt (t.getAttribute ("num"));
            document.body.appendChild (document.createTextNode (
                "num = " + t.getAttribute ("num") + ", checked = " + t.checked.toString () + " | "
            ));
            t.setAttribute ("num", n + 1);
            t.disabled = false;
        }
    </script>
</head>
<body>
    <input type="checkbox" num="0" onclick="OnClickHandler(this)" />
    <br />
</body>
</html>

我期待的是num属性的值和复选框的选中状态之间会有完美的同步。但是这个条件不成立,可以通过快速单击复选框来查看。以下是示例输出:

输入:两次非常快速的点击,短暂的暂停,两次非常快速的点击,短暂的暂停,单击

数 = 0,检查 = 真 | 数 = 1,检查 = 真 | 数 = 2,检查 = 假 | 数 = 3,检查 = 假 | 数字 = 4,检查 = 真 |

该逻辑的意图是该num属性仅在检查状态更改时才更改。应用程序的很多后续逻辑都依赖于这种同步。实现此同步的推荐方法是什么?

在此先感谢您的帮助。

4

2 回答 2

0

好吧,我在发布问题后几乎立即发现了我的问题。我的错误是非常基本的,但我想我还是会发布我的回复。

看起来正确的实现应该使用onchange而不是onclick复选框。因此,代码应如下所示:

测试页面函数 OnClickHandler (t) { t.disabled = true; var n = parseInt (t.getAttribute ("num")); document.body.appendChild (document.createTextNode ("num = " + t.getAttribute ("num") + ", 检查 = " + t.checked.toString () + " | " )); t.setAttribute("num", n + 1); t.disabled = 假;}

希望这可以为一些可怜的灵魂节省一些白发。

于 2013-01-06T04:56:33.243 回答
0

您是否尝试过将 onchange 与复选框一起使用而不是 onclick?

于 2013-01-06T04:58:01.597 回答