IE11中点击触发的下拉mouseout/mouseleave事件
Dropdown mouseout / mouseleave events triggered by click in IE11
有一些 mouseout
/ mouseleave
问题不太符合我的问题,这是我能找到的结尾:
我似乎仍然遇到同样的行为,所以开始吧。我有一个带有菜单控件的页面,该菜单控件显示在 hover
上并隐藏在 mouseout
上 - 在该页面上,我在页面顶部附近也有一个下拉控件,足够靠近几个菜单项将悬停菜单暴露在它通常覆盖下拉控件的位置。当下拉菜单关闭时,这很好。
如果用户打开下拉菜单,然后将鼠标悬停在显示悬停菜单的菜单项之一上,菜单现在显示在 打开的下拉控件后面。这种行为是不可取的,所以我的计划是 blur()
mouseout
上的下拉菜单强制关闭。这一切在 chrome 中都可以正常工作,但在 IE 中却不行。
HTML:
<select name="child5" id="child5">
<option value="1">Item - 1</option>
<option value="2">Item - 2</option>
<option value="3">Item - 3</option>
<option value="4">Item - 4</option>
<option value="5">Item - 5</option>
</select>
<br/>
<div id="sometext"></div>
jQuery(尝试 1,之前也用 mouseout
尝试过这些)Fiddle:https://jsfiddle.net/9wb77r6z/6/
$(document).ready(function () {
$("#child5").mouseleave(function () {
$(this).blur();
});
});
jQuery(尝试 2)Fiddle:https://jsfiddle.net/9wb77r6z/9/
$(document).ready(function () {
$("#child5").mouseleave(function (e) {
if (e.target.id == $(this).attr("id")) {
$(this).blur();
} else {
alert("nope!");
}
});
});
可以在 Chrome 中看到预期的行为。单击并打开下拉菜单时,它会保持打开状态,直到选择一个项目(单击)或用户触发 mouseout
/ mouseleave
(我都试过了,都在 Chrome 中工作但是不是 IE11).
当用户在 IE11 中单击下拉菜单时,它几乎立即触发了 mouseleave
事件,触发了我的 $("#child5").blur();
,这实际上使下拉菜单无法使用鼠标。
有人有想法吗?谢谢
代替使用 mouseout
/ mouseleave
事件,这是现在在 Chrome 和 IE11 中为我工作的解决方案:
$("#child5").mouseover(function (e) {
var t = $(this);
var offset = t.offset();
var xMin = offset.left;
var yMin = offset.top;
var xMax = xMin + t.innerWidth();
var yMax = xMin + t.innerHeight();
$(document).mousemove(function (e) {
if (e.pageX < xMin || e.pageX > xMax - 2 || e.pageY < yMin || e.pageY > yMax) {
$(this).unbind('mousemove');
var fakeSelect = t.clone(true);
t.replaceWith(fakeSelect);
}
});
});
以上是捕获目标控件并映射其外坐标。然后 mousemove
事件检测鼠标位置是否在映射坐标之外,因此可以 克隆控件并用克隆替换 (这是模仿 的巧妙方法=14=] 很有魅力)。
有一些 mouseout
/ mouseleave
问题不太符合我的问题,这是我能找到的结尾:
我似乎仍然遇到同样的行为,所以开始吧。我有一个带有菜单控件的页面,该菜单控件显示在 hover
上并隐藏在 mouseout
上 - 在该页面上,我在页面顶部附近也有一个下拉控件,足够靠近几个菜单项将悬停菜单暴露在它通常覆盖下拉控件的位置。当下拉菜单关闭时,这很好。
如果用户打开下拉菜单,然后将鼠标悬停在显示悬停菜单的菜单项之一上,菜单现在显示在 打开的下拉控件后面。这种行为是不可取的,所以我的计划是 blur()
mouseout
上的下拉菜单强制关闭。这一切在 chrome 中都可以正常工作,但在 IE 中却不行。
HTML:
<select name="child5" id="child5">
<option value="1">Item - 1</option>
<option value="2">Item - 2</option>
<option value="3">Item - 3</option>
<option value="4">Item - 4</option>
<option value="5">Item - 5</option>
</select>
<br/>
<div id="sometext"></div>
jQuery(尝试 1,之前也用 mouseout
尝试过这些)Fiddle:https://jsfiddle.net/9wb77r6z/6/
$(document).ready(function () {
$("#child5").mouseleave(function () {
$(this).blur();
});
});
jQuery(尝试 2)Fiddle:https://jsfiddle.net/9wb77r6z/9/
$(document).ready(function () {
$("#child5").mouseleave(function (e) {
if (e.target.id == $(this).attr("id")) {
$(this).blur();
} else {
alert("nope!");
}
});
});
可以在 Chrome 中看到预期的行为。单击并打开下拉菜单时,它会保持打开状态,直到选择一个项目(单击)或用户触发 mouseout
/ mouseleave
(我都试过了,都在 Chrome 中工作但是不是 IE11).
当用户在 IE11 中单击下拉菜单时,它几乎立即触发了 mouseleave
事件,触发了我的 $("#child5").blur();
,这实际上使下拉菜单无法使用鼠标。
有人有想法吗?谢谢
代替使用 mouseout
/ mouseleave
事件,这是现在在 Chrome 和 IE11 中为我工作的解决方案:
$("#child5").mouseover(function (e) {
var t = $(this);
var offset = t.offset();
var xMin = offset.left;
var yMin = offset.top;
var xMax = xMin + t.innerWidth();
var yMax = xMin + t.innerHeight();
$(document).mousemove(function (e) {
if (e.pageX < xMin || e.pageX > xMax - 2 || e.pageY < yMin || e.pageY > yMax) {
$(this).unbind('mousemove');
var fakeSelect = t.clone(true);
t.replaceWith(fakeSelect);
}
});
});
以上是捕获目标控件并映射其外坐标。然后 mousemove
事件检测鼠标位置是否在映射坐标之外,因此可以 克隆控件并用克隆替换 (这是模仿 的巧妙方法=14=] 很有魅力)。