JQuery / Javascript:IE悬停不包括选择框选项?

时间:2008-10-16 00:22:07

标签: javascript cross-browser

我有一些脚本可以在鼠标悬停时加宽文本框,并在鼠标移开时缩短它。

我遇到的问题是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。

谢谢!

5 个答案:

答案 0 :(得分:12)

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

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

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

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

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

答案 1 :(得分:7)

显然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而道歉 - 我以前从未使用过它)。)

答案 2 :(得分:1)

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(); });

});

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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

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