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

Cor*_*ger 95 html javascript

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

Xav*_* Ho 122

这实际上可以使用HTML + Javascript,尽管其他人都说它不是.

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


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

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

当用户以非点击方式触发具有已定义激活行为的元素时,交互事件的默认操作必须是对元素执行合成点击激活步骤.

<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>?
Run Code Online (Sandbox Code Playgroud)

使用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);
};
Run Code Online (Sandbox Code Playgroud)

如果有人找到了相同但不在Chrome中的方法,请随时修改此小提琴.

  • 它已在[Chrome 53+]上弃用(https://www.chromestatus.com/features/57188​​03933560832) (34认同)
  • 不工作:`IE10`,`FF 24`.适用于:`Chrome 30`,`Safari 6.0.5`,`Opera 16` (7认同)
  • 希望我没有浪费 15 分钟试图让它工作,然后再进一步阅读以了解它已被弃用 (5认同)
  • 我希望我可以为此加上你的赏金.非常感谢. (3认同)
  • 这次真是万分感谢!我需要在Chrome中精确模仿IE的ALT +向下箭头行为. (2认同)
  • @AdamTuttle它在Android 4.4.2上也不起作用 (2认同)
  • 不适用于Firefox和IE.怎么解决? (2认同)
  • 正如其他人所说,不适用于较新的浏览器。 (2认同)
  • 您应该更新答案,因为这在较新版本的浏览器中不起作用。 (2认同)

Asi*_*K T 46

Xavier Ho的答案是如何解决当前大多数浏览器中的问题.但是,"不再通过JavaScript发送/修改"事件是一种很好的做法.(就像mousedown在这种情况下)

从版本53+开始,Google Chrome 不会对不受信任的事件执行默认操作.例如由脚本创建或修改的事件,或通过dispatchEvent方法调度的事件.这个更改是为了与Firefox和IE对齐,我认为已经没有执行该操作.

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

参考链接:

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

并且不推荐使用 initMouseEvent

  • 这需要投票,因为它现在是正确的答案! (2认同)

CMS*_*CMS 26

这是我能得到的最接近的,更改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>
Run Code Online (Sandbox Code Playgroud)

  • 或<SELECT onMouseOut ="this.size = 1;" onMouseOver ="this.size = this.length;"> ... </ SELECT> (13认同)

rp.*_*rp. 14

您不能使用HTML select标记执行此操作,但可以使用JavaScript HTML执行此操作.有各种各样的现有控件执行此操作 - 例如,附加到SO"有趣/忽略标记"条目的"建议"列表,或Gmail查找电子邮件地址.

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

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

  • 这真是令人遗憾的遗憾-移动浏览器提供了特定于操作系统的滚动列表,我需要自动弹出该列表。 (2认同)

Raf*_*ino 12

我有同样的问题,我发现解决这个问题的简单方法是使用html和css.

select{
  opacity: 0;
  position: absolute;
}
Run Code Online (Sandbox Code Playgroud)
<select>
  <option>option 1</option>
  <option>option 2</option>
  <option>option 3</option>
</select>
<button>click</button>
Run Code Online (Sandbox Code Playgroud)

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

Und*_*tic 8

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

似乎版本53的chrome禁用了Asim K T所述的功能.

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

受信任事件不应触发默认操作(单击事件除外).

然而,他们已经在webview中启用了它,但我没有对此进行测试.

我们发现一些网页浏览器正在使用其中的快速点击,并且由于存在破损的风险,即使它们不受信任,我们也会允许选择mousedown.

在这个讨论中,让开发人员以编程方式打开下拉列表的想法被放弃了.


Hem*_*egi 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>
Run Code Online (Sandbox Code Playgroud)

使用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; });
});
Run Code Online (Sandbox Code Playgroud)

更新:

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

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

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