【问题标题】:How can you differentiate between a user click and .click()?如何区分用户点击和 .click()?
【发布时间】:2019-07-23 21:23:54
【问题描述】:

对于我一直在开发的 Web 应用程序,我一直在使用 Kendo UI,因此我不必编写一堆组件。我有 6 个网格位于标签条内,并应用了 .Select() 标记,因此网格中出现了复选框。例如,当您在网格 1 中进行选择时,它会启用包含网格 2 的选项卡。 如果您从网格 1 中删除了所有选择,则会禁用所有以下网格。另一个要求是它还应该清除您在这些子网格中所做的任何选择。

我一直在使用这种方法来取消选中给定网格中的所有内容:

function uncheckAll(gridID) {
    const inputString = gridID + " input[type='checkbox']:checked";
    const checked = $(inputString);
    const selectAll = $(gridID + " input[type='checkbox']:first")[0].checked;
    if (selectAll) {
        let checkedExcludingCheckAll = [];
        for (let i = 1; i < checked.length; i++) {
            checkedExcludingCheckAll.push(checked[i]);
        }
        for (row of checkedExcludingCheckAll) {
            row.click();
        }
    } else {
        for (row of checked) {
            row.click();
        }
    }
}

代码完全按照预期工作。问题是,当您从更高级别的网格中取消选择所有内容时,因为此代码调用 click 事件,它会调用每个其他网格的所有其他事件处理程序,并遍历每个子网格(最多 5 个) 并取消选择所有内容。渐近地,这有点像一场噩梦。

我最后修改了我的代码,只抓取在当前启用的选项卡中所做的选择。存储在禁用选项卡内的网格中存在的任何选择都将被忽略,这意味着它是我的代码不需要遍历每个网格并触发所有这些事件。

所以,如果我可以强制uncheckAll()取消选中直接子网格中的项目,而不触发所有那些不必要的事件,那将是非常棒的。实现这一目标的最佳方法是什么?我已经考虑暂时禁用row.click() 行的事件处理程序,但这会导致一些意外行为。我在这里有什么选择?

编辑:更多代码示例。当row.click() 被调用时,click 事件会运行到这些运行其余代码的事件处理程序中。

function dataBound() {
   // this handler reads only the 'select all' box
   $('#Grid.k-checkbox:first').unbind('click').on('click', () => {
       // ...
       // function calls that call uncheckAll() within them if a condition is satisfied
   }
   // read in any checkbox in the grid that isn't the 'select all' box
   $('#Grid.k-checkbox:not(:first)').on('change', clickOneCheckbox);
}

function clickOneCheckbox() {
    // ...
    // function calls that call uncheckAll() within them if a condition is satisfied
}

【问题讨论】:

  • 我相信问题不在于您调用click(),而是您的jQuery 集合的内容包含的元素多于应有的元素。没有合适的例子很难说。
  • 我在帖子中包含了更多代码。我可以尝试添加更多,但我不确定要添加多少,以免造成太多混乱。
  • 一个可行的例子是最好的。它不一定是完整的代码,但可以忠实地复制您的问题。从那个额外的 JS 中,我只能猜测 CSS 选择器在 dataBound 函数中过于通用,并且正在切换所有 “全选” 框。有人会认为这些选择器只会返回一个项目,因为您在选择器中有一个 ID,但是如果您重新使用了 ID(不好),那么您将返回多个元素。不看标记很难知道。
  • 而不是触发click 事件来取消选中...更改cheched 属性。 $("checkboxSelector').prop("checked", false); -- 这不会触发其他点击处理程序。
  • @LouysPatriceBessette 如果您想提交帖子而不是评论,我会将您标记为解决方案

标签: javascript jquery kendo-ui event-handling click


【解决方案1】:

而不是触发click 事件来取消选中...更改cheched 属性

$("checkboxSelector").prop("checked", false);

这不会触发其他 click 处理程序。 ;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-26
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多