您如何以编程方式告诉HTML SELECT下拉列表(例如,由于鼠标悬停)?


106

您如何以编程方式告诉HTML select下拉列表(例如,由于鼠标悬停所致)?


6
我建议您不要<select>破坏默认行为,因为人们期望默认行为以某种方式运行,并且您将阻止其他平台(例如移动设备)上的人们使用您的网站。
Brian Donovan 2010年

1
@BrianDonovan不是您不能为此添加一些处理。
Morg。

@shasikanth:您的小提琴在Chrome的Firefox 37 nr中都
不起作用

好的,我认为小提琴以前是可行的。无论如何,我将在这里删除我的评论。
shasi kanth 2015年

@BrianDonovan实际上,移动是此的一个很好的用例...以编程方式生成一个选择,然后自动弹出其选项。
迈克尔(Michael 19)2005年

Answers:


16

您不能使用HTML select标签来做到这一点,但是可以使用JavaScript HTML 来做到这一点。有各种各样的现有控件可以执行此操作-例如,附加到SO“有趣/忽略标签”条目的“建议”列表,或Gmail的电子邮件地址查询。

有许多提供此功能的JavaScript + HTML控件-寻找想法的自动完成控件。

请参阅此链接以获取自动完成控件... http://ajaxcontroltoolkit.codeplex.com/


6
这真令人遗憾-移动浏览器提供了特定于OS的滚动列表,我需要自动弹出该列表。
迈克尔·迈克尔(Michael

120

尽管人们在其他地方都说不是,但过去使用HTML + Javascript确实可以做到这一点,但后来不推荐使用,现在不起作用。

但是,这仅在Chrome中有效。如果您有兴趣,请阅读更多内容。


根据W3C HTML5工作草案第3.2.5.1.7节。互动内容

HTML中的某些元素具有激活行为,这意味着用户可以激活它们。daccess-ods.un.org daccess-ods.un.org这会根据激活机制触发一系列事件,例如使用键盘或语音输入,或通过单击鼠标

当用户以不同于单击的方式触发具有定义的激活行为的元素时,交互事件的默认操作必须是运行在元素上合成的单击激活步骤。

<select>作为交互式内容,我相信可以以编程方式显示其内容<option>。玩了几个小时后,我发现document.createEvent().dispatchEvent()可以工作。

就是说,演示时间。 这是工作中的小提琴。


HTML:

<select id="dropdown">
    <option value="Red">Red</option>
    <option value="Green">Green</option>
    <option value="Blue">Blue</option>
</select>
<br>
<button id="fire" type="button" onclick="runThis()">Show dropdown items</button>​

Javascript:

// <select> element displays its options on mousedown, not click.
showDropdown = function (element) {
    var event;
    event = document.createEvent('MouseEvents');
    event.initMouseEvent('mousedown', true, true, window);
    element.dispatchEvent(event);
};

// This isn't magic.
window.runThis = function () { 
    var dropdown = document.getElementById('dropdown');
    showDropdown(dropdown);
};

如果有人找到了一种方法,但在Chrome中却找不到,请随时修改此小提琴


2
这次真是万分感谢!我需要精确地在Chrome中模拟IE的ALT +向下键行为。
J布赖恩·普莱斯

3
希望我能为此增加您的赏金。非常感谢。
亚当·塔特尔

7
无法处理:IE10FF 24。在作品:Chrome 30Safari 6.0.5Opera 16
hitautodestruct

2
@AdamTuttle它也不能在Android 4.4.2上运行
Mirko

42
它现在已经过时的浏览器53+
华盛顿古埃德斯

47

Xavier Ho的答案涵盖了如何解决当前大多数浏览器中的问题。但是,优良作法是“不再通过JavaScript调度/修改”事件。(mousedown在这种情况下)

从版本53+开始,Google Chrome 将不会对不受信任的事件执行默认操作。例如通过脚本创建或修改的事件,或者通过dispatchEvent方法。此更改是为了与Firefox和IE保持一致,我认为它们尚未执行该操作。

出于测试目的,小提琴提供了Xavier的答案不适用于chrome 53+。(我不测试FF和IE)。

参考链接:

https://www.chromestatus.com/features/57188​​03933560832 https://www.chromestatus.com/features/6461137440735232

而且不建议使用 initMouseEvent



我不这么认为。你有尝试过吗?
阿西姆KT

28

这是我能得到的最接近的值,更改元素onmouseover的大小,并恢复onmouseout的大小:

       <select onMouseOut="this.size=1;" onMouseOver="this.size=this.length;">
        <option>1</option>
        <option>2</option>
        <option>3</option>
        <option>4</option>
        <option>5</option>
      </select>


13
或<SELECT onMouseOut =“ this.size = 1;” onMouseOver =“ this.size = this.length;”> ... </ SELECT>
RealHowTo

1
还需要添加onchange =“ this.size = 1”,以便在选择后立即折叠菜单。元素的CSS规则也需要配置。
gm2008 '16

似乎有效。选择宽度缩小,然后导致鼠标事件将选择重置为其原始宽度。这引起癫痫发作作用。设置固定宽度似乎可以解决问题。包含多个项目的列表会扩展到视图之外。
吉瓦

16

我有同样的问题,找到解决这个问题的简单方法是使用html和css。

select{
  opacity: 0;
  position: absolute;
}
<select>
  <option>option 1</option>
  <option>option 2</option>
  <option>option 3</option>
</select>
<button>click</button>


2
自从我看过这种方法已有很长时间了,这也是我希望找到的参考。最好使用额外的CSS,以匹配隐藏选择的大小来触发(按钮,img,div等)... 1)确保可点击区域填充触发器2)菜单直接在触发器下方打开。注意:可能还需要添加z-index以确保可点击区域是某些布局中的最顶层元素。
Mavelo

但是,如果用户向下滚动页面,则按钮会相应移动,但选择内容会保持在同一位置;确实不符合预期。有什么解决办法吗?
David Portabella

完美的解决方案。但是最好是<div style='position:relative'><select> <option>option 1</option> <option>option 2</option> <option>option 3</option> </select> <button>click</button></div>换个按钮,然后在div上进行选择,就像这样@DavidPortabella
Muhammet Can TONBUL

8

我认为这在Chrome中不再可行。

如Asim K T所述,Chrome版本53似乎禁用了此功能。

根据规格 http://www.w3.org/TR/DOM-Level-3-Events/#trusted-events

可信事件不应触发默认操作(单击事件除外)。

但是他们已经在webview中启用了它,但是我还没有测试过。

我们发现某些Web视图在其中使用了fastclick,由于存在损坏的风险,即使它们不受信任,我们也将允许在选择上进行鼠标按下。

在此讨论中,放弃了让开发人员以编程方式打开下拉菜单的想法。


7

如果仍然有人在寻找这个:

<select id="dropdown">
    <option value="Red">Red</option>
    <option value="Green">Green</option>
    <option value="Blue">Blue</option>
</select>
<br>
<button id="fire" type="button" >Show dropdown items</button>

Javascript:

var is_visible=false; 

$(document).ready(function(){

    $('#fire').click(function (e) { 
    var element = document.getElementById('dropdown');


    if(is_visible){is_visible=false; return;}
    is_visible = true;

    var event;
    event = document.createEvent('MouseEvents');
    event.initMouseEvent('mousedown', true, true, window);
    element.dispatchEvent(event);

    /* can be added for i.e. compatiblity.
      optionsSelect.focus();
       var WshShell = new ActiveXObject("WScript.Shell");
       WshShell.SendKeys("%{DOWN}");
    */
    e.stopPropagation();
    return false;
});


$(document).click(function(){is_visible=false; });
});

更新:

直到没有一个完美的解决方案来解决这个问题,但是您可以尝试避免这种情况。你为什么要这样做。我想知道几个月前的解决方案,以便为移动设备制作一个精选插件

https://github.com/HemantNegi/jquery.sumoselect

最后,使用透明的select元素屏蔽了自定义div(或其他任何元素),以便它可以直接与用户交互。


1
github.com/HemantNegi/jquery.sumoselect这样的插件是唯一看起来比默认控件更好的跨浏览器解决方案。
贾斯汀

iniMouseEvent似乎有效,但是为什么不起作用$(select).trigger('mousedown')
coding_idiot

3

这是我发现的最好方法。注意它仅适用于Windows上的IE,并且您的网络可能需要位于安全区域中-因为我们访问外壳程序。诀窍是ALT向下箭头是打开选择下拉菜单的快捷键。

<button id="optionsButton" style="position:absolute;top:10px;left:10px;height:22px;width:100px;z-index:10" onclick="doClick()">OPTIONS</button>
<select id="optionsSelect" style="position:absolute;top:10px;left:10px;height:20px;width:100px;z-index:9">
    <option>ABC</option>
    <option>DEF</option>
    <option>GHI</option>
    <option>JKL</option>
</select>
<script type="text/javascript">
   function doClick() {
       optionsSelect.focus();
       var WshShell = new ActiveXObject("WScript.Shell");
       WshShell.SendKeys("%{DOWN}");
   }
</script>

3
除非你做它不会工作
2011年

1
@Knu Internet Explorer会自动将元素ID作为对元素的引用添加到全局范围。
user2428118 2014年

@KlasMellbourn。他们正在尝试使他们的浏览器更加兼容。使用提到的“大小”解决方案。
sproketboy 2014年

2

当您想做的事情时,不要以为一件事情是不可能的,没有什么事情是不可能做的。

使用这个家伙创建的扩展JS函数。

http://code.google.com/p/expandselect/

包括此JS,然后只需将传递参数的参数作为您的选择ID即可,如下所示:

ExpandSelect(MySelect)

2
需要明确的是,那JS并不会导致<SELECT>地掉了下来。正如它明确指出的那样:“浏览器不允许在纯JavaScript中扩展<select>,该控件只能通过使用鼠标直接单击来扩展”。所以这 “不可能的”!相反,JS声明“我们通过创建同时显示多个选项的另一个select来模仿扩展的<select>控件...”这是完全不同的,对于您的使用情况可能还是不可接受....
JonBrave

1

我可能是错的,但是我不相信默认选择框可以做到。您可以使用JS和CSS来实现所需的结果,但(据我所知)不能执行普通的SELECT。


0

通过此问题中提到的一些解决方法以及类似的解决方法,可以打开“ HTML选择”。但是,更干净的方法是将选择库添加到项目中,例如“ select2”或“ chosen”。例如,以编程方式打开select2将很容易:

$('#target-select').select2('open');

-2

这并不是您所要的,但我喜欢此解决方案的简单性。在大多数情况下,我想启动下拉菜单,这是因为我正在验证用户实际上已经做出选择。我更改下拉菜单的大小并将其聚焦,这很好地突出了他们跳过的内容:

$('#cboSomething')[0].size = 3;
$('#cboSomething')[0].focus();

不知道为什么投票失败,因为这不是“最糟糕”的方式。我之所以避免这种情况仅仅是因为它改变了周围元素的布局。虽然我认为@CMS的解决方案通过控件的焦点/模糊事件更容易理解。
Mavelo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.