Як ви можете програмно сказати HTML SELECT, щоб він вийшов (наприклад, за допомогою миші)?


106

Як ви можете програмно сказати HTML, selectщоб він вийшов (наприклад, за допомогою миші)?


6
Я рекомендую не ганятись за поведінкою за замовчуванням <select>, оскільки люди очікують, що вона поводиться певним чином, і ви будете заважати людям на інших платформах (наприклад, мобільних) використовувати ваш сайт.
Брайан Донован

1
@BrianDonovan Це не так, як ви не можете додати певну обробку для цього.
Морг.

@shasikanth: ваша скрипка не працює ні в Firefox 37
n

Гаразд, я думаю, що скрипка працювала раніше. У будь-якому разі я б видалив тут свій коментар.
shasi kanth

@BrianDonovan Насправді мобільний телефон є гарним випадком використання цього ... програмно генеруючи вибір, а потім автоматично вискакуючи його параметри.
Майкл

Відповіді:


16

Ви не можете зробити це за допомогою тегу вибору HTML, але ви можете це зробити за допомогою JavaScript та HTML. Існує безліч існуючих елементів керування - наприклад, список "запропонувати", доданий до запису SO "цікавий / ігнорований тег", або пошук Gmail для адрес електронної пошти.

Існує багато елементів керування JavaScript + HTML, які забезпечують цю можливість - шукайте елементи автоматичного заповнення ідей.

Дивіться це посилання для контролю автозаповнення ... http://ajaxcontroltoolkit.codeplex.com/


6
це ганьба - мобільні браузери надають специфічний для прокрутки список ОС, і мені це потрібно автоматично, щоб з'явитись.
Майкл

120

Це було реально можливо за допомогою HTML + Javascript, незважаючи на те, що люди говорять, що це не так, але згодом воно було застаріле і не працює зараз.

Однак це працювало лише в Chrome. Читайте більше, якщо вам цікаво.


Відповідно до робочого проекту W3C для HTML5, розділ 3.2.5.1.7. Інтерактивний контент :

Деякі елементи HTML мають поведінку активації, що означає, що користувач може їх активувати. Це запускає послідовність подій, залежних від механізму активації [...], наприклад, за допомогою клавіатури або голосового введення, або за допомогою клацань миші .

Коли користувач запускає елемент із визначеною поведінкою активації іншим способом, ніж натискання на нього, дією події взаємодії за замовчуванням має бути виконання кроків активації синтетичного клацання на елементі.

<select>будучи інтерактивним контентом, я вважав, що можна програмно відображати його <option>s. Після кількох годин розігрування я виявив, що використовує document.createEvent()і .dispatchEvent()працює.

Це, демо-час. Ось робочий Fiddle.


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
Дякую за це! Мені потрібно було наслідувати поведінку IE ALT + СТРІЛКА ВНИЗ саме в Chrome.
Дж. Брайан Ціна

3
Я б хотів, щоб я міг додати вашу суму за це. Дуже дякую.
Адам Таттлл

7
Не працює над: IE10, FF 24. Роботи по: Chrome 30, Safari 6.0.5,Opera 16
hitautodestruct

2
@AdamTuttle Це не працює і на Android 4.4.2
Mirko

42
Зараз це застаріло на Chrome 53+
Вашингтон

47

Відповідь Ксав'є Хо розповідає, як вирішити проблему в більшості браузерів, які зараз там. Але, добре, що "більше не відправляти / змінювати" події через JavaScript . (Як, mousedownу цьому випадку)

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

З метою тестування Фіддл за умови, що відповідь Ксав'є не буде працювати в хромі 53+. (Я не тестую це на FF та IE).

Посилання для довідок:

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

І InitMouseEvent також застарілий


Чи можна це зробити за допомогою MouseEvents? developer.mozilla.org/en-US/docs/Web/API/MouseEvent
Shamal Perera

Я не думаю, що так. ви щось пробували?
Асім КТ

28

Це найближче, що я міг отримати, змінити розмір елемента на миші та відновити розмір 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

Здається, працює. Ширина вибору зменшується, а потім викликає події виведення миші, що перезавантажує вибрану на початкову ширину. Це викликає судомий ефект. Встановлення фіксованої ширини, здається, виправить це. З більш ніж декількома елементами список розширюється поза поданням.
1,21 гігаватта

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-індекс, щоб переконатися, що клікова область є найвищим елементом у деяких макетах.
Мавело

однак, якщо користувач прокручує сторінку вниз, кнопка рухається відповідно, але вибір залишається в тому самому положенні; не дуже, як очікувалося. будь-яке рішення для цього?
Девід Портабелла

Ідеальне рішення. Але краще, можливо, натисніть кнопку обгортання та виберіть на <div style='position:relative'><select> <option>option 1</option> <option>option 2</option> <option>option 3</option> </select> <button>click</button></div>діві, як це @DavidPortabella
Muhammet Can TONBUL

8

Я думаю, що це більше не можливо в Chrome.

Здається, версія 53 хрому вимикає цю функціональність, як заявив Асім К Т.

Відповідно до специфікації http://www.w3.org/TR/DOM-Level-3-Events/#trusted-events

Довірені події не повинні запускати дію за замовчуванням (крім події клацання).

Однак вони включили це у веб-перегляді, але я цього не перевіряв.

Ми виявили, що деякі веб-перегляди використовують швидкий клік всередині них, і через ризик поломки ми дозволимо дозволити вибору на вибір, навіть якщо вони не є довіреними.

І в цій дискусії відміняється ідея дозволити розробникам відкривати спадне програмне меню.


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

Нарешті закінчилося маскування користувацького div (або будь-якого іншого елемента) прозорим елементом вибору, щоб він міг безпосередньо взаємодіяти з користувачем.


1
Плагіни на зразок github.com/HemantNegi/jquery.sumoselect - єдине рішення для крос-браузера, яке насправді виглядає краще, ніж контроль за замовчуванням.
Джастін

iniMouseEventздається, працює, але чому $(select).trigger('mousedown')це не працює?
coding_idiot

3

Ось найкращий спосіб, який я знайшов. ПРИМІТКА. Це працює лише з 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>

3
Це не буде працювати , якщо ви не зробите цього .
Кну

1
@Knu Internet Explorer автоматично додає ідентифікаційні елементи елементів як посилання на елемент до глобальної області.
user2428118

@KlasMellbourn, певно. Зараз вони намагаються зробити свої браузери більш сумісними. Використовуйте згадане рішення "розмір".
sproketboy

2

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

Використовуйте цю функцію JS розширення, створену хлопцем.

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

Включіть цей JS і просто зателефонуйте, що передає параметр, як ідентифікатор вибору, наприклад:

ExpandSelect(MySelect)

2
Щоб було зрозуміло, що JS не спричиняє <SELECT>падіння. Як прямо вказано, "Браузери не дозволяють розширювати <вибір> у чистому javascript, цей контроль можна розширити лише натисканням на нього за допомогою миші". Так що це «неможливо»! Натомість JS заявляє, що "ми імітуємо розширений <select> контроль, створюючи інший вибір із відображенням декількох варіантів одночасно ...". Це зовсім інше, а може і не може бути прийнятним для вашого випадку використання ....
JonBrave

1

Я можу помилятися, але я не вірю, що це можливо за допомогою вибору за замовчуванням. Ви можете зробити щось із JS & CSS, що досягає бажаного результату, але не (наскільки мені відомо) ваніль SELECT.


0

Відкрити "Вибір HTML" можливо через деякі способи вирішення, згадані в цьому питанні, та подібні. Однак більш чіткий спосіб зробити це - додати до свого проекту вибрану бібліотеку, наприклад "select2" або "selected". Наприклад, відкрити програму select2 програмно було б так просто, як:

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

-2

Це не саме те, про що ви просили, але мені подобається це рішення за його простоту. У більшості випадків, коли я хочу ініціювати спадне меню, це тому, що я перевіряю, що користувач фактично зробив вибір. Я змінюю розмір випадаючого меню і фокусую його, що добре підкреслює те, що вони пропустили:

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

Не впевнений, чому ти зголосився, оскільки це не найгірший спосіб зробити це. Я б уникну цього просто тому, що це зміщує компонування навколишніх елементів. Хоча я думаю, що рішення від @CMS легше зрозуміти, якщо події фокусу / розмиття на контролі.
Мавело
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.