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

IT技术 javascript html
2021-02-05 06:31:35

如何以编程方式告诉 HTMLselect下拉(例如,由于鼠标悬停)?

6个回答

这曾经实际上可以通过 HTML+Javascript 实现,尽管其他地方的人都说它不是,但它后来被弃用,现在不起作用。

但是,这只适用于 Chrome。如果您有兴趣,请阅读更多内容。


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

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

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

<select>作为交互式内容,我相信可以以编程方式显示其<option>s。玩了几个小时后,我发现使用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 中,请随时修改这个 fiddle

您应该更新您的答案,因为这在较新版本的浏览器中不起作用。
2021-03-13 06:31:35
希望我没有浪费 15 分钟试图让它工作,然后再进一步阅读以了解它已被弃用
2021-03-26 06:31:35
现在已在Chrome 53+弃用
2021-03-27 06:31:35
我希望我能为此增加你的赏金。非常感谢。
2021-03-29 06:31:35
不工作:IE10FF 24适用于:Chrome 30, Safari 6.0.5,Opera 16
2021-04-09 06:31:35

Xavier Ho 的回答涵盖了如何解决目前大多数浏览器中的问题。但是,“不再通过 JavaScript 分派/修改”事件是一种很好的做法(比如,mousedown在这种情况下)

从 53+ 版本开始,谷歌浏览器不会对不受信任的事件执行默认操作例如由脚本创建或修改的事件,或通过dispatchEvent方法调度的事件此更改是为了与我认为已经没有执行此操作的 Firefox 和 IE 保持一致。

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

参考链接:

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

并且 initMouseEvent 也已弃用

我不这么认为。你尝试过什么吗?
2021-03-22 06:31:35
可以使用 MouseEvents 来完成吗?developer.mozilla.org/en-US/docs/Web/API/MouseEvent
2021-03-29 06:31:35

这是我能得到的最接近的方法,在mouseover 上更改元素的大小,并在mouseout 上恢复大小:

<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>

还需要添加 onchange="this.size=1" 以便菜单在选择后立即折叠。元素的 CSS 规则也需要配置。
2021-03-14 06:31:35
它似乎工作。选择宽度缩小,然后导致鼠标移出事件将选择重置为其原始宽度。这会导致癫痫发作。设置固定宽度似乎可以解决它。有多个项目时,列表会扩展到视图之外。
2021-03-17 06:31:35
或 <SELECT onMouseOut="this.size=1;" onMouseOver="this.size=this.length;"> ... </SELECT>
2021-03-29 06:31:35

我有同样的问题,我发现解决这个问题的更简单的方法是使用 HTML 和 CSS。

首先,让你<select>透明 ( opacity: 0;)。然后,将按钮放在<select>. 按钮上的点击将被<select>组件捕获

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

完美的解决方案。但更好的是包装按钮并像这样在 div 上选择<div style='position:relative'><select> <option>option 1</option> <option>option 2</option> <option>option 3</option> </select> <button>click</button></div>@DavidPortabella
2021-03-10 06:31:35
但是,如果用户向下滚动页面,则按钮会相应移动但选择保持在同一位置;并不像预期的那样。有什么解决办法吗?
2021-03-17 06:31:35
我已经很久没有看到这种方法了,这是我希望找到的参考。使用额外的 CSS 更好地匹配隐藏选择的大小以触发(按钮、img、div 等)... 1) 确保可点击区域填充触发器 2) 菜单直接在触发器下方打开。注意:可能还需要添加 z-index 以确保可点击区域是某些布局中的最顶部元素。
2021-03-23 06:31:35
迄今为止的最佳解决方案,即使在 2021 年也是如此。
2021-04-01 06:31:35

您不能使用 HTML 选择标记来执行此操作,但可以使用 JavaScriptHTML来执行此操作有多种现有控件可以执行此操作 - 例如,附加到 SO“interesting/ignored tag”条目的“suggest”列表,或 Gmail 对电子邮件地址的查找。

有许多 JavaScript+HTML 控件提供此功能——寻找自动完成控件以获得想法。

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

这是一种耻辱——移动浏览器提供了一个特定于操作系统的滚动列表,我需要它自动弹出。
2021-03-19 06:31:35