【问题标题】:Can't figure out why jQuery row toggle works on one table, but not another无法弄清楚为什么 jQuery 行切换在一个表上起作用,而在另一个表上不起作用
【发布时间】:2013-01-16 07:23:18
【问题描述】:

我设置了一个测试页面,该页面从一个实际项目页面中剥离出来,足以证明我的问题。 Here's the link.

要了解我的意思,请转到链接并观察单击顶部表格的行如何切换显示该行的文本框和标签,交替显示。请注意单击“取消”按钮如何使两行都显示标签。

当您单击其行时,底部表格的行为相同。但是,当您单击底部表格中的“取消”按钮时,问题就会出现。页面实际上会刷新,而不是仅仅隐藏该行的文本框。

我已经为此花费了 HOURS,但我终其一生都无法弄清楚发生了什么,也不知道如何解决它。

如果有人可以看看这个并帮助我弄清楚发生了什么,我将非常感激。

【问题讨论】:

    标签: jquery toggle rows


    【解决方案1】:

    stopPropogation 区分大小写。您的第二个事件处理程序使用了错误的大小写(它以大写的 S 开头)。

    // Prevent bubbling of click events in #tblBranchCoverage
    $('#tblBranchCoverage').on('click', ':input', function (e) {
        e.stopPropagation();
    });
    
    // Prevent bubbling of click events in #tblViewEditAllBranches
    $('#tblViewEditAllBranches').on('click', ':input', function (e) {
        e.StopPropagation();
    });
    

    但是,正如 niahar 所指出的,您的第二个表格在一个表格中,e.stopPropagation 还不够。您可以修改两个事件处理程序以简单地返回 false。在这种情况下,e.stopPropogation()e.preventDefault()return false 之间的差异可能值得 having a read

    如果您考虑在单击保存时使用 ajax 进行更新,您可以简单地使用基本按钮而不是输入按钮,而不必担心必须取消表单提交。

    <button type="button">Save</button>
    

    注意type="button" 位很重要,否则它会像输入按钮一样,然后提交您的表单!

    【讨论】:

    • @Spencerooni:感谢您提供的信息。我一定会看看你链接的文章。 我想知道表单标签是否真的有必要。我正在使用 ajax 来填充表格(由于用户在页面中的其他地方选择)并处理保存对表格的更改数据。因此,如果 $.ajax 正在处理所有事情,我可以直接取消表单标签吗?我确实需要指出,尽管正如我在对 niahar 的回答的评论中所说的那样,我尝试删除表单标签并将我的原始代码用于第二个表,但随后该表的取消按钮根本不起作用。
    • 我在这里找到了关于 return false、e.preventDefault 和 e.stopPropagation 之间区别的好文章:blog.webvines.co.uk/post/3743395029/… 和这里:fuelyourcoding.com/jquery-events-stop-misusing-return-false 顺便说一句,@Spencerooni,我修正了 stopPropagation 错字您指出并修复了它(niahar 的建议也有效。)
    【解决方案2】:

    不确定您是否成功,但我尝试了Spencerooni's code in jsfiddle,但没有帮助。

    但是,如果你用这个替换你的最后一点 js,那么它应该没问题:

    $('tr input.cancelListEditBranch').click(function(e) {
        // Show the labels and hide the edit elements
        $(this).closest("tr").find('.edit').fadeOut(200);
        $(this).closest("tr").find('.detailDisplay').delay(200).fadeIn(200);
        return false;
    });
    

    这里是another jsfiddle

    它在第一种情况而不是第二种情况下起作用的原因是第二个表格被包裹在form标签中,所以提交按钮在点击时会立即自动执行POST,无需等待让事件传播。因此,如果您想取消表单提交,您需要在第一阶段捕获事件(而不是在它传播到 table 时)。

    【讨论】:

    • 用我的代码替换你的代码确实可以使取消按钮正常工作。由于您对第二个表格在表单元素中的评论,我尝试删除表单标签并使用我的原始代码,我很惊讶地看到取消按钮仍然不起作用。知道为什么不?
    猜你喜欢
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 2014-12-08
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多