2009-09-21 37 views
3

由于在这个question中解释的问题,我有一种情况,我需要将mousewheel事件附加到下拉列表中,只有当它展开(我在onclick事件中这样做) 。不过,当列表崩溃时,我需要删除mousewheel事件。我如何去检测这个?Javascript检测下拉列表关闭时

我不能只使用onchange事件,因为用户可能没有真正改变他们的选择。我已经尝试了onblur事件,但在大多数浏览器(IE除外)下拉列表保持聚焦,当列表被折叠。

干杯。

var list = document.getElementById("list"); 
list.onclick = function (e) { 
    // attach mousewheel 
    list.onmousewheel = function (e) { 
     // ... 
    } 
    // attach click off 
    // This event fires fine in all browsers except FF when the list is expanded. 
    // In firefox it only fires when anywhere in the document is clicked twice. 
    // The first click closes the drop down list as expected and the second one 
    // fires the event. 
    window.document.onclick = function (e) { 
     list.onmousewheel = null; 
     window.document.onclick = null 
    } 
}; 

编辑: 不幸的是,在Firefox MEDER的解决方案不起作用。文档上的点击事件不会被触发,直到我点击两次下拉列表。我该如何解决这个问题?它在IE中正常工作。

EDIT2: 我做了一些更多的测试与以下浏览器像预期的那样

  • IE 7,
  • 三价铬
  • 歌剧院10

Firefox的要求在窗口中单击2次以使其工作& Safari根本不起作用。

看来,即使您点击下拉列表中的Firefox,仍然关注它。直到第二次点击发生,下拉列表才最终失去焦点。

+0

你有链接或代码? – 2009-09-21 03:46:45

回答

1

你在找这样的吗?如果用户点击不在#el内的任何地方,它将分支出来,你可以做你想做的事情,虽然这需要jQuery,但是需要太多的DOM脚本。

var dropdown = $('#el'); 
$(document).click(function(e){ 
    if ((!$(e.target).is(dropdown)) || !$(e.target).closest('#el').length) { 
     // do what you need to 
    } 
}); 

如果不是,你可以更具体,包括一个例子吗?

PS - 我没有测试片段,对不起,如果它不是你想要的。

+0

不幸的是我不能使用jQuery。此外,单击事件不会在FF中被触发,直到我在文档中单击两次。 – Alex 2009-09-21 03:42:38

1

好的,我仍然不知道你想用这样一个严格脚本的选择框来达到什么目的,但是通常试图改变本地内部工作<select>并不富有成效。没有标准说明事件如何在表单元素内部流动,而实现select作为操作系统级别构件(IE)的浏览器无论如何都无法支持它。

如果你必须有这种行为,我建议使用脚本来替换<select>框与由<div> s制成的JavaScript供电模拟器。然后,您可以精确控制每个鼠标和键盘交互行为的方式。有many libraries这样做已经这样做,但如果你需要非常具体的确切行为,他们可能不适合你。