Как вы можете программно сказать HTML SELECT, чтобы он выпал (например, из-за наведения мыши)? - PullRequest
89 голосов
/ 30 октября 2008

Как программно указать, что HTML select должен выпасть (например, из-за наведения мыши)?

Ответы [ 11 ]

123 голосов
/ 13 апреля 2012

Это на самом деле возможно с HTML + Javascript, несмотря на то, что везде люди говорят, что это не так.

Однако это работает только в Chrome. Читайте больше, если вам интересно.


Согласно W3C Working Draft для 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, , пожалуйста, не стесняйтесь изменить эту скрипку .

37 голосов
/ 22 сентября 2016

Ксавье Хо отвечает на вопрос, как решить проблему в большинстве браузеров, существующих в настоящее время. Но, это хорошая практика - больше не «отправлять / изменять» события с помощью JavaScript . (Например, mousedown в данном случае)

Начиная с версии 53+, Google Chrome не будет выполнять действия по умолчанию для ненадежных событий . Например, события, созданные или измененные сценарием или отправленные методом dispatchEvent. Это изменение для согласования с Firefox и IE, которые, я думаю, уже не выполняют действия.

В целях тестирования Fiddle при условии, что ответ Ксавьера не будет работать в Chrome 53+. (Я не проверяю это FF и IE).

Ссылки для справки:

https://www.chromestatus.com/features/5718803933560832 https://www.chromestatus.com/features/6461137440735232

И initMouseEvent также устарел

25 голосов
/ 30 октября 2008

Это самое близкое, что я мог получить, изменить размер элемента 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>
16 голосов
/ 30 октября 2008

Вы не можете сделать это с помощью HTML-тега выбора, но вы можете сделать это с помощью JavaScript и HTML. Существует множество существующих элементов управления, которые делают это - например, список «предложить», прикрепленный к записи SO «интересный / игнорируемый тег», или поиск в Gmail адресов электронной почты.

Существует множество элементов управления JavaScript + HTML, которые предоставляют эту возможность - ищите идеи для автозаполнения идей.

См. Эту ссылку для управления автозаполнением ... http://ajaxcontroltoolkit.codeplex.com/

9 голосов
/ 16 мая 2018

У меня такая же проблема, и я нашел более простой способ ее решения с помощью html и css.

select{
  opacity: 0;
  position: absolute;
}
<select>
  <option>option 1</option>
  <option>option 2</option>
  <option>option 3</option>
</select>
<button>click</button>
7 голосов
/ 27 сентября 2016

Я думаю, что это больше невозможно в Chrome.

Похоже, версия 53 Chrome отключает эту функцию, как заявлено Asim K T.

Согласно спецификации http://www.w3.org/TR/DOM-Level-3-Events/#trusted-events

Доверенные события не должны запускать действие по умолчанию (кроме щелчка событие).

Однако они включили его в веб-обозрении, но я не проверял это.

Мы обнаружили, что некоторые веб-представления используют внутри них fastclick и из-за риска поломки мы собираемся разрешить mousedown на выбор даже если они не заслуживают доверия.

И в этом обсуждении идея позволить разработчикам открывать выпадающее меню программным путем отброшена.

7 голосов
/ 07 апреля 2014

Если кто-то еще ищет это:

<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

В итоге получилось замаскировать пользовательский div (или любой другой элемент) прозрачным элементом select, чтобы он мог напрямую взаимодействовать с пользователем.

3 голосов
/ 23 февраля 2011

Вот лучший способ, который я нашел. ПРИМЕЧАНИЕ. Он работает только с IE в Windows, и ваш Интернет, вероятно, должен находиться в безопасной зоне - потому что мы обращаемся к оболочке. Хитрость в том, что 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>
2 голосов
/ 11 ноября 2013

Перестаньте думать, что одна вещь невозможна, нет ничего невозможного, когда вы хотите это сделать.

Используйте эту функцию расширения JS, созданную парнем.

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

Включите этот JS и просто вызовите этот параметр, передавая параметр в качестве выбранного идентификатора, например:

ExpandSelect(MySelect)
1 голос
/ 30 октября 2008

Я могу ошибаться, но я не верю, что это возможно с полем выбора по умолчанию. Вы могли бы сделать что-то с JS & CSS, чтобы достичь желаемого результата, но не (насколько мне известно) ванильный SELECT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...