Javascript 有没有一种方法可以;重置";移动网络工具包';在初始悬停触发点击后的伪悬停行为?

Javascript 有没有一种方法可以;重置";移动网络工具包';在初始悬停触发点击后的伪悬停行为?,javascript,dom-events,mobile-safari,touchscreen,Javascript,Dom Events,Mobile Safari,Touchscreen,我正在一个网站上工作,我正在使用Javascript(通过JQuery)添加弹出框,其中包含列表中项目的额外信息。我正在使用JQuery的mouseeneter和mouseleave事件使弹出窗口出现和消失,当然这些在桌面浏览器中都可以正常工作 在Mobile Safari中,当我单击一个项目(这是我期望的,也是我想要发生的)时,弹出窗口就会出现,并且我添加了一个ontouchstart,它触发mouseleaveJQuery事件,从而在用户执行任何其他操作时隐藏任何可见的弹出窗口。这也可以很好

我正在一个网站上工作,我正在使用Javascript(通过JQuery)添加弹出框,其中包含列表中项目的额外信息。我正在使用JQuery的
mouseeneter
mouseleave
事件使弹出窗口出现和消失,当然这些在桌面浏览器中都可以正常工作

在Mobile Safari中,当我单击一个项目(这是我期望的,也是我想要发生的)时,弹出窗口就会出现,并且我添加了一个
ontouchstart
,它触发
mouseleave
JQuery事件,从而在用户执行任何其他操作时隐藏任何可见的弹出窗口。这也可以很好地工作,除了当用户点击一个他们刚刚查看并取消的弹出窗口的项目时(通过滚动或执行任何其他触发
ontouchstart
事件的操作),而不是再次显示弹出窗口时,它会激活附加到该项目的链接

如果用户点击另一项而不是再次点击同一项,则会显示新项的弹出窗口,如果用户再次点击第一项,则会显示该项的弹出窗口。同样,这是我所期待的,也是我所希望的

似乎一旦点击了带有悬停事件的项目,并且Mobile Safari被迫使该事件发生,该项目就会被标记为已触发悬停事件,因此下一次点击不必假装是悬停,它可以是正常的点击。用悬停事件点击另一个项目似乎会“重置”为上一个项目设置的标志

我希望能够为自己“重置”此标志,这样,当我用我的
ontouchstart
关闭弹出窗口时,该链接将被激活,而不是在单击某个项目时显示弹出窗口,然后下一次单击该项目,即使弹出窗口已关闭,而不是在单击该项目时激活该链接,因此在我看来,该项目已不再存在“悬停”,再次单击同一项目应再次显示弹出窗口,然后只有在链接激活时,在弹出窗口可见的情况下单击该项目

秘密似乎在于让Mobile Safari退出其“伪悬停”“当我使用
ontouchstart
触发
mouseleave
时,我在任何地方都找不到任何有用的模式,比如当mobileSafari假装悬停在任何东西上,以及是否可以通过Javascript事件访问这些东西


我知道我可以编写一个版本的弹出代码,专门用于移动Safari,但让浏览器完成大部分模拟悬停事件的艰苦工作对我来说似乎效率更高。要是我能把这最后一点小事弄清楚就好了。

我猜悬停状态与哪个元素有焦点有关,而不是作为一个标志。一次点击可聚焦,第二次点击可激活链接

尝试通过提供另一个元素焦点来关闭弹出窗口,看看效果是否更好

$('body').focus();
tl;但是请尝试以下方法:

# :hover fix
# e.g.: body:not(.stoppedhovering) .styled:hover
hoverFix = ->
  window.clearTimeout hoverFix.delay if hoverFix.delay?
  $('body').removeClass 'stoppedhovering'
  delayed = -> $('body').addClass 'stoppedhovering'
  hoverFix.delay = _.delay delayed, 600
$('*').live 'touchstart', hoverFix

顺便说一句,这是coffeescript+下划线,但我相信你可以推断出js:)