JQuery/Javascript:IE 悬停不涵盖选择框选项?

JQuery/Javascript: IE hover doesn't cover select box options?

提问人:Eli 提问时间:10/16/2008 最后编辑:scunliffeEli 更新时间:2/8/2013 访问量:18505

问:

我有这个脚本可以在鼠标悬停时加宽文本框,并在鼠标关闭时缩短文本框。

我遇到的问题是Internet Explorer似乎没有扩展它,而是将鼠标悬停在选择框的选项上。

这意味着在IE中,我可以单击选择,选择选项下拉列表,但是如果我尝试选择一个,它们就会消失,并且一旦我离开选择框本身,选择框就会重新调整大小。

示例代码:

<script type='text/javascript'>
$(function() {
$('#TheSelect').hover(
    function(e){
        $('#TheText').val('OVER');
        $(this).width( 600 );
    },
    function(e){
        $('#TheText').val('OUT');
        $(this).width( 50 );
   }
);
});
</script>

和:

<input type='text' id='TheText' /><br /><br />

<select id='TheSelect' style='width:50px;'>
    <option value='1'>One</option>
    <option value='2'>Two</option>
    <option value='3'>Three</option>
    <option value='42,693,748,756'>Forty-two billion, six-hundred and ninety-three million, seven-hundred-forty-some-odd..... </option>
    <option value='5'>Five</option>
    <option value='6'>Six</option>
    <option value='7'>Seven...</option>
</select>

IE中的选择框有什么解决方法吗?如果有人能推荐一个真正可靠的,我什至会考虑一个jquery替代品。

谢谢!

JavaScript 跨浏览器

评论


答:

7赞 Dan 10/16/2008 #1

显然,IE不考虑select元素的下拉位部分。这是可行的,但需要对 expando 属性和模糊/焦点事件进行一些作弊,以启用和禁用“隐藏”效果,以阻止它在鼠标进入元素的下拉部分时启动。

试一试:

$(function() {
    var expand   = function(){ $(this).width(600) }
    var contract = function(){ if (!this.noHide) $(this).width(50) }
    var focus    = function(){ this.noHide = true }
    var blur     = function(){ this.noHide = false; contract.call(this) }
    $('#TheSelect')
        .hover(expand, contract)
        .focus(focus)
        .click(focus)
        .blur(blur)
        .change(blur)
});

(如果这不是应该使用jQuery的方式,请道歉 - 我以前从未使用过它:))

13赞 user99425 5/1/2009 #2

看起来这篇文章已经发布了一段时间,但希望仍然有人对解决方法感兴趣。我在构建我正在处理的新网站时遇到了这个问题。上面是一个产品滑块,对于每个产品,将鼠标悬停在产品上会弹出一个大的信息气泡,其中包含有关产品的信息、用于选择购买选项的下拉列表和购买按钮。我很快发现,每当我的鼠标离开选择菜单的初始可见区域(即尝试选择一个选项)时,整个气泡都会消失。

答案(谢谢你,开发jQuery的聪明人),都是关于事件冒泡的。我知道解决这个问题的最直接方法必须是暂时“禁用”悬停的输出状态。幸运的是,jQuery内置了处理事件冒泡的功能(他们称之为传播)。

基本上,只有大约一行左右的新代码,我就将方法附加到下拉列表的“onmouseleave”事件(将鼠标悬停在选择列表中的一个选项上似乎可以可靠地触发此事件 - 我尝试了其他一些事件,但这个事件似乎非常可靠)关闭了事件传播(即 不允许父元素从下拉列表中听到有关“OnMouseLeave”事件的信息。

就是这样!解决方案比我预期的要优雅得多。然后,当鼠标离开气泡时,悬停的输出状态会正常触发,网站会继续其业务。这是修复程序(我把它放在document.ready中):

$(document).ready(function(){
  $(".dropdownClassName select").mouseleave(function(event){
    event.stopPropagation();
  });
});

评论

0赞 actual_kangaroo 7/28/2015
对我来说效果不是很好,我正在悬停时移动下拉列表和选项,这仍然会导致 IE 中的跳跃。不过,我可以看到它如何解决大多数人的问题
0赞 Jory Hogeveen 10/19/2023
这条评论为我节省了很多时间,因为我在调试时正朝着完全不同的方向前进,谢谢!
0赞 MytyMyky 8/12/2009 #3

有同样的问题,WorldWidewebb 的答案在 IE8 上运行良好。我只是做了一个小小的改动,从选择器中删除了“select”,因为我在选择器中包含了选择框的类。使它成为一个非常简单的修复。

此外,我在使用 hoverIntent jquery 插件的菜单上实现了它,没有任何问题。(无干扰)。

1赞 Scott G 12/3/2009 #4

WorldWideWeb的答案非常有效。

我遇到了一个略有不同的问题,我对表单字段的包含项(悬停以显示选择菜单)产生了悬停效果,而在 IE 上,用户无法从下拉列表中进行选择(它一直在重置值)。我添加了 worldwideweb 的建议(带有选择的 ID)和中提琴,它奏效了。

他是我所做的:

$(".containerClass").hover(function() {
    $(this).children("img").hide();
    $('#idOfSelectElement').mouseleave(function(event) { event.stopPropagation(); });
}, function() {
    $(this).children('img').show();
    $('#idOfSelectElement').mouseleave(function(event) { event.stopPropagation(); });

});
1赞 Sam 1/8/2013 #5

我有一个基于悬停隐藏/显示的表单。如果用户专注于选择,则表单将隐藏。我能够用这样的东西来解决我的问题:

element.find('select').bind('mouseenter mouseleave',function(){
    //Prevent hover bubbling
    return false;
});