【问题标题】:jQuery trigger firing click event but not sending event datajQuery触发触发点击事件但不发送事件数据
【发布时间】:2015-04-23 10:16:52
【问题描述】:

搜索了几个小时后,我似乎无法弄清楚为什么 jQuery 触发的点击事件没有将实际事件传递给点击函数。这是一个示例:jsfiddle

$(document).ready(function () {
    $('tr').click(function (event) {
        if (event.target.type !== 'checkbox') {
            $(':checkbox', this).trigger("click");
        }
    });

    $(':checkbox').click(function (event) {
        console.log(event.shiftKey);
    });
});

如果我单击第一个复选框,控制台会按预期记录“false”。然后,如果我按住 shift 键并选中最后一个复选框,控制台会按预期记录“true”,因为单击该框时,shift 被按住。

现在转到数据并单击行而不是复选框。无论在单击一行时是否按住 shift 键,都会触发复选框单击事件,并根据需要选中/取消选中该框,但 event.shiftKey 始终返回 false。

为什么从行触发点击事件会导致原始事件未传递给点击处理程序?

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    完全模拟鼠标点击并不像看起来那么简单。在这里你可以找到它的详细代码(不使用 jQuery):https://stackoverflow.com/a/6158050/405623

    从功能的角度来看,您可能拥有想要在行中的任何点击和内部定义它是什么类型的事件时运行的功能。我的意思是摆脱生成事件以在一个地方处理它们。

    【讨论】:

      【解决方案2】:

      您在复选框上触发了一个新事件,而不是传递原始事件。在那种情况下,不会按下任何档位。我会使用命名函数来避免这种混淆,如下所示:

      $(document).ready(function () {
          $('tr').click(function (event) {
              console.log('Row clicked');
              eventHandler(event, this);
          });
      
          $(':checkbox').click(function (event) {
              event.stopPropagation();
              console.log('Checkbox clicked');
              eventHandler(event, this);
          });
      
          function eventHandler(event, elem){
              console.log(event.shiftKey);
              $(':checkbox', elem).click();
          }
      });
      

      小提琴:http://jsfiddle.net/4hfwsh5q/7/

      stopPropagation() 还可以防止在您单击复选框时将事件进一步向下传递,因此不会触发对该行的单击。

      更新这是另一个只在 shift 被保持时检查/取消选中复选框的小提琴: http://jsfiddle.net/4hfwsh5q/8/

      【讨论】:

      • 我喜欢它的发展方向。但是,单击该行不会导致复选框被选中/取消选中。似乎我需要在该行上添加一个点击触发器,但最终我对新函数进行了两次调用。
      • 我更新了我的小提琴,它应该选中复选框。但根据您想要对 shift 键检查执行的操作,可能需要进一步改进
      • 感谢 KJell,它几乎可以像我希望的那样工作。目标是让表格以我们都期望的方式响应点击、ctrl+点击和 shift-click。我需要能够知道何时单击复选框是否按住了 shift 键,以便我可以检查最后一个框和当前框之间的每个框。所以,你最近的小提琴几乎是完美的,但是当 shift 被保持时,它会发送一个 true,然后是一个 false,因为两个事件正在触发。我正在尝试现在订购,看看我能想出什么适合我的情况。
      • 你可以在我的更新中查看我最后的小提琴。由于您尝试做的与默认行为有点不同,我认为可以调用 preventDefault() 并通过 elem.checked 自己做点击魔术:)
      • 尽管我无法让它完全满足我的需求,但这是解决此问题的正确方法。在您的帮助下,我得到了 95% 的工作解决方案,也许有一天我会再试一次。不幸的是,我只是有很多其他的代码参与其中,这些代码不能很好地适应这些变化。感谢您的帮助!
      猜你喜欢
      • 2011-11-19
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 2011-07-29
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多