【问题标题】:Why is mouseenter event triggered when page below is scrolled?为什么滚动下方页面时会触发 mouseenter 事件?
【发布时间】:2013-05-24 18:13:14
【问题描述】:

我注意到mouseenter 事件在鼠标未被触摸但光标下方的页面滚动时触发。

看看这个小提琴:http://jsfiddle.net/F3EwW/

重现步骤:

  1. 点击li
  2. 使用向上/向下箭头键滚动项目
  3. 当下方的li 滚动到视图时,您会注意到mouseenter 事件被触发。

注意:要注意此行为,请确保鼠标光标位于 li 上方并保持不动。

最初,我接受这是默认行为,并继续在我的代码中解决这个问题。但后来我很好奇,想在任何我无法在任何地方找到的文档中验证这种行为。

有谁知道这种行为是否记录在规范或任何真实网页的任何地方?

我查找了 w3spec event scrollmouse event order,但找不到任何相关信息。

另外mouseenter的规格说明如下,

当指针设备移动到元素或其后代元素之一的边界时,用户代理必须调度此事件。此事件类型类似于 mouseover,但不同之处在于它不会冒泡,并且当指针设备从一个元素移动到其后代元素之一的边界时不得调度。

在 Chrome 中,您会注意到 mouseover 也会被触发。我已经在此发布了 questionbug report

【问题讨论】:

  • 我无法复制你在那个小提琴中提到的 Chrome 或 Firefox 中的行为......
  • @DavidBarker 您是否点击了UL 并使用箭头键滚动?
  • 是的,我做到了,我可以得到任何接近你提到的行为的唯一方法是如果我将鼠标悬停在 UL 上然后滚动......但我会期待这种行为跨度>
  • 我也希望这种行为
  • @Vega 我明白你的意思,必须承认我最初对你的问题有点困惑......我也无法在任何地方找到它的记录。也就是说,如果您将事件处理程序应用于元素而不是光标本身,它将监听其约束内的任何鼠标移动。无论鼠标移动与否,它都清楚地检测到它,我会说这是一个有意义的意外“功能”。

标签: javascript jquery browser dom-events


【解决方案1】:

你意识到你有$('li').mouseenter(function () { 吗? 这导致 mouseenter 事件绑定到每个 li 元素,因此当您使用向上和向下键滚动并且鼠标仍在 ul 内时,它会不断输入新的 l​​i。这不是意外的功能鼠标进入新元素

您正在寻找的行为更像是这样的:

$("element").bind("mousemove mouseenter", function(event) {
    //...
});

您还需要意识到 DOM 理解鼠标相对于文档的移动,而不是像您的操作系统那样理解鼠标在屏幕上的位置。

【讨论】:

  • 该演示是专门为演示您所说的而创建的。问题是这种行为记录在哪里?规范说当指针设备移动到元素或其后代元素之一的边界时,用户代理必须调度此事件。..但指针设备没有被触及。
  • 它说“当指针设备移动时”,你似乎把它解释为“当鼠标移动时”,当你滚动浏览器时,你的指针指向操作系统是有区别的设备没有移动到它拥有的文档对象模型,如果它说,“当指针设备的位置移动时”,这个文档可能会更好......还请记住,它不会冒泡层次结构.
猜你喜欢
  • 1970-01-01
  • 2011-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-17
  • 1970-01-01
  • 2017-07-09
相关资源
最近更新 更多