【问题标题】:Checkbox Click not in sync -Jquery复选框单击不同步-Jquery
【发布时间】:2011-07-25 21:09:07
【问题描述】:

我有一个带有复选框和文本输入列的表格。复选框列的最后一行有一个“全选”链接。

全部勾选后点击:

1:文字必须改为“Uncheck All”

2:在列中勾选上面的框并设置textbox text = 500。

在“取消选中全部”时: 1:文字必须改为“全选” 2:取消选中该框并清除文本框。

但是上面的第 2 点不能正常工作。

步骤:

1:单击“全选” - 文本更改为“取消全选”并选中复选框,但未将文本框设置为 500。

2: 点击“Uncheck All” - 文本更改为“Check All”并且框未选中,但现在它将文本框设置为 500。

我认为这是一些事件处理问题,但到目前为止我还没有弄清楚。

有什么想法吗?

注意:我将不得不使用“onclick”,因为我的实际代码是 .aspx 页面,它无法识别带有复选框的 onchange。

更新代码 Sample.

【问题讨论】:

    标签: javascript jquery asp.net checkbox


    【解决方案1】:

    函数 onClick() 和 setValue() 在 click() 对复选框进行检查之前运行; 因此,在第 1 步,它没有看到选中的复选框。

    【讨论】:

    • 是的,我设置了警报并且有点理解,但我现在该如何解决。
    • 这是正确的方法和解决方案。 jsbin.com/inocud/20/edit (我尽可能少地编辑让您理解.. 代码可以进一步优化)。即使没有人为您的代码提供修复,您也应该为正确的答案投票。
    • 尚未完全查看您的代码,但有一些副作用。如果我没有在 CheckAll 中设置 .attr("checked","checked") 单击它会将所有检查设置为未选中并将未选中设置为选中。所以必须保持这一点。
    • 啊忘了那个案子了。您所要做的就是在允许它单击之前对其进行验证。这应该做到jsbin.com/inocud/25
    • 谢谢。您的解决方案正在引领我前进,但需要进行调整以使其在我的复杂场景中充分发挥作用。我还在努力。
    【解决方案2】:

    将“已检查”更改为布尔值,这很好。

    更新 http://jsbin.com/inocud/16

    类方法 - http://jsbin.com/inocud/22

    【讨论】:

    • 不,这不起作用。另见我上面的帖子。我已经更新了代码示例。
    • 天啊。非常不合逻辑,但是将复选框检查反转为 !chb.checked ,它似乎从一开始就起作用。 jsbin.com/inocud/16 似乎已检查的属性是额外的,因为无论如何它都会被检查,所以它可能会在某些时候被双重反转
    • 啊……谢谢。为什么这对你有用?我尝试了确切的 !chb.checked 逻辑,但行为方式与原始方式相同。我会玩一会儿,如果我没有看到任何其他副作用,我会关闭它。
    • 哦,我不认为它是双反的,但它是 setValue 和 onclick 的调用顺序,正如 jason 所指出的那样。
    • 好的,我明白为什么 !chb.checked 对我不起作用并且不起作用,因为使用它会破坏对复选框本身的点击。
    【解决方案3】:

    试试这个

    <script> 
     $(function () {
                $(".checkall").click(function () {
    
    
                    if ($(this).text() == "Check All") {
                        $(this).text("Uncheck All");
                        $(this).parent().parent().prevUntil('tbody').each(function () {
                            $(this).find("td input:checkbox").attr('checked', 'checked').click();
                        });
                    }
                    else {
                        $(this).text("Check All");
                        $(this).parent().parent().prevUntil('tbody').each(function () {
                            $(this).find("td input:checkbox").removeAttr('checked').click();
                        });
                    }
                });
            });
            function setValue(chb, txtid, valu) {
                if ($(chb).is(":checked")) {
                    $("#" + txtid).val(valu);
                }
                else {
                    $("#" + txtid).val("");
                }
            }
    
    </script>
    

    【讨论】:

    • 问题是你在调用click方法后设置了checked属性。
    • 我尝试了您的建议,但它也不起作用。它只是颠倒了复选框和文本框的行为。
    【解决方案4】:

    尝试射击。

    已更新(虽然是 hack,但有效):http://jsfiddle.net/2YGYt/

    另一种方法(非hacky方式):http://jsfiddle.net/2YGYt/3/

    【讨论】:

    • 不,我不能在那里设置它。有很多行。它必须从 setValue 设置,因为 onclick 是作为属性从 asp.net 中的代码隐藏添加的。因此,对于列中的每个复选框,值 500 会有所不同。
    • 然后只需切换您的click.attr 的顺序 - 请参阅此处:jsbin.com/inocud/13/edit
    • 我已经尝试过了,但没有运气。请检查我更新的示例,以更好地了解我的场景。
    • 添加了另一种方式,使用jQuery data proeprty bag。
    • 我试过你的最终版本,但它不起作用,尤其是当你点击复选框但我已经让它工作了。感谢您的尝试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多