什么';用JavaScript显示对话框/模式的最有效方法是什么?
[更新:]这里有一个测试链接(如果您不想克隆repo) 我有很多对话框/模态,当鼠标在web应用程序的某些链接上移动时需要显示 目录(tl;dr)什么';用JavaScript显示对话框/模式的最有效方法是什么?,javascript,modal-dialog,dom-events,mouseevent,mousemove,Javascript,Modal Dialog,Dom Events,Mouseevent,Mousemove,[更新:]这里有一个测试链接(如果您不想克隆repo) 我有很多对话框/模态,当鼠标在web应用程序的某些链接上移动时需要显示 目录(tl;dr) 我以前是怎么处理的 我最近是怎么尝试的 哪个更好 那滑鼠呢 我以前是怎么处理的 我通常的做法是使用事件委托 因此,我向容器添加一个事件处理程序,然后检查相关元素是否成为目标,然后显示相关对话框 我通常会有一个对话框,我会更改其中的内容并重新定位(保存大量不同的HTML标记) 如果触发了mouseover事件(用于链接),则显示对话框 如果触发了m
- 我以前是怎么处理的
- 我最近是怎么尝试的
- 哪个更好
- 那滑鼠呢
mouseover
事件(用于链接),则显示对话框
如果触发了mouseout
事件(用于链接),则我将隐藏该对话框
如果我触发了事件处理程序的链接的mouseout
,那么我通常需要设置一个计时器来延迟隐藏对话框(刚好足够长),这样我就可以将鼠标移到对话框上,对话框本身会清除链接的mouseout
设置的计时器
然后,我将一个mouseout
事件绑定到该对话框,以便在用户将鼠标从对话框上滚下时隐藏该对话框
在这个阶段我遇到了两个问题,第一个问题几乎一直都在发生,另一个是我最近注意到的一个边缘案例,这促使我尝试找到更好的解决方案
mouseout
事件,因此我需要检查元素是否有一个父元素,即对话框本身,如果是,则不要试图隐藏对话框
mousemove
事件绑定到document.documentElement
元素(但如果需要,可以在document.body上执行),然后存储鼠标位置的x/y坐标。我们提供了对“检查”方法的公共API访问,该方法让我们知道鼠标的位置是否在我们提供给“检查”的元素上(我们测量元素尺寸并将其添加到其x/y坐标上)
在上述回购协议中,我们有一个日历,每当特定日期发生事件时,它都会显示一个对话框。我们正在存储所有具有事件的,并为每个事件设置一个计时器(这是因为我们需要不断调用“check”方法来查看是否有鼠标在上面)
因此,可能会有31+的机会(因为我们正在显示下个月的前几天)显示对话框,因此设置了31+计时器
这个示例repo现在可以工作了,而我使用事件委托的第一个版本没有
哪个更好?
我担心mousemove
版本的性能,因为它可能会使用很多计时器(取决于一个页面中需要多少对话框)。在我上面的日历示例中,最多可以运行31个以上的计时器
那滑鼠呢?
我知道这些事件存在,如果所有浏览器都支持,那么我可以安全地使用第一个版本,而不必检查导致错误mouseout/over事件触发的子元素。但不管怎样,我不相信这会修复事件日历的示例,在该示例中,移动鼠标太快意味着的鼠标移出/覆盖事件不是由浏览器触发的。无论采用哪种方式,我知道您可以在jQuery提供mouseenter/leave事件的情况下多填充这些内容,但查看它们的代码时,我无法让它们对我的脚本起作用(因为我不使用jQuery或任何其他通用库-ps,我也不希望这样做,所以请不要建议将其作为选项)
非常感谢有人能为我提供的任何帮助/建议或指导
对话框有“x”个子元素,在子元素上滚动鼠标会触发对话框的mouseout事件,因此我需要检查元素是否有一个父元素,即对话框本身,如果是,则不要试图隐藏对话框
要解决这个问题:在事件代码中,只需使用函数“isAncestor”(见下文)
因此,在元素的mouseout代码(我们称之为“itemElement”)中,您可以像这样检查它:
//We're really mousing out, close dialog
if ( !isAncestor( mouseOutEvent.target, itemElement ) )
{
...do something ...
}
对话框有“x”个子元素,在子元素上滚动鼠标会触发对话框的mouseout事件,因此我需要检查元素是否有一个父元素,即对话框本身,如果是,则不要试图隐藏对话框
要解决这个问题:在事件代码中,只需使用函数“isAncestor”(见下文)
因此,在元素的mouseout代码(我们称之为“itemElement”)中,您可以像这样检查它:
//We're really mousing out, close dialog
if ( !isAncestor( mouseOutEvent.target, itemElement ) )
{
...do something ...
}
与其要求我们制作您的文件的本地副本来测试问题,为什么不在link上为我们设置它或使用link更新它,但这里再次说明一点,以防您错过它:您可以重新构造HTML吗?如果给定的events section/div元素是其关联的calendar date元素的子元素,则可以简化鼠标悬停事件管理。如果你不能在JS运行之前改变HTML,你会考虑改变它以达到同样的目的吗?@ THEGEKE,我故意使用一个弹出来处理所有的事件,因为另一种选择是将31个弹出的元素(所有HTML)加载到页面中。