Для этого раскрывающегося списка в HTML:
<select id = "countries">
<option value = "1">Country</option>
</select>
Я хочу открыть список (аналогично щелчку по нему левой кнопкой мыши). Возможно ли это с помощью JavaScript (или, точнее, jQuery)?
Кто-нибудь может объяснить, почему это так невозможно?
касса api.jqueryui.com/selectmenu/#method-open
Возможный дубликат Как можно программно указать HTML SELECT, чтобы он выпал (например, при наведении курсора мыши)?

JavaScript не может "щелкнуть" элемент (вы можете вызвать прикрепленное событие onclick, но вы не можете щелкнуть его буквально)
Чтобы просмотреть все элементы в списке, сделайте список списком multiple и увеличьте его размер, например:
<select id = "countries" multiple = "multiple" size = "10">
<option value = "1">Country</option>
</select>
Добавляет полосу прокрутки после 4 элементов в IE6, 7 и 8b2 и Opera 9.62. Добавляет полосу прокрутки после 10 элементов в Safari для Windows и Google Chrome.
Вы можете легко имитировать щелчок по элементу, но щелчок по <select> не откроет раскрывающийся список.
Использование множественного выбора может быть проблематичным. Возможно, вам следует рассмотреть радиокнопки внутри элемента контейнера, который вы можете расширять и сжимать по мере необходимости.
Как было сказано, вы не можете программно открыть <select> с помощью JavaScript.
Однако вы можете написать свой собственный <select>, управляя всем внешним видом и ощущениями самостоятельно. Что-то вроде того, что вы видите для условий поиска с автозаполнением на Google или Yahoo! или в поле поиска местоположения на Сеть погоды.
Я нашел один для jQuery здесь. Я понятия не имею, будет ли он соответствовать вашим потребностям, но даже если он не полностью соответствует вашим потребностям, его можно изменить, чтобы он открывался в результате какого-либо другого действия или события. Этот на самом деле выглядит более многообещающим.
Нет, не можешь.
Вы можете изменить размер, чтобы сделать его больше ... похоже на идею Дреаса, но это размер, который вам нужно изменить.
<select id = "countries" size = "6">
<option value = "1">Country 1</option>
<option value = "2">Country 2</option>
<option value = "3">Country 3</option>
<option value = "4">Country 4</option>
<option value = "5">Country 5</option>
<option value = "6">Country 6</option>
</select>
Я пытался найти то же самое и разочаровался. Я закончил тем, что изменил размер атрибута для поля выбора, чтобы оно открылось
$('#countries').attr('size',6);
а затем, когда вы закончите
$('#countries').attr('size',1);
добавление атрибута size в раскрывающийся список фактически преобразует раскрывающийся список в список ... таким образом, он расширяется ..
Отличное решение. Вам просто нужно иметь дело с тем фактом, что список занимает больше места на странице (а не расширяется по содержимому, как раскрывающийся список) и, таким образом, выталкивает содержимое вниз.
Для тех, кто может только представить, как это выглядит, внешний вид представляет собой поле с множественным выбором после использования этого подхода (но не с множественным выбором), что я лично считаю более стабильным, чем раскрывающееся раскрывающееся меню.
Технически это работает, но 1) теперь у вас есть уродливая полоса прокрутки сбоку и 2) z-index зафиксирован на исходном выборе, поэтому он не совсем действует как раскрывающееся всплывающее окно.
Спасибо за это ... Я потратил 2 часа, пробуя различные всплывающие окна и т. д., Чтобы предупредить пользователей, что им нужно что-то выбрать. Ничего не получалось ... это тонкое, но твердое напоминание. И это работает (в отличие от других нестандартных решений).
Я столкнулся с той же проблемой, и у меня есть решение. Функция под названием ExpandSelect (), которая имитирует щелчок мышью по элементу «select», она делает это, создавая другой элемент <select>, который абсолютно позиционирован и имеет сразу несколько вариантов, видимых путем установки атрибута size. Протестировано во всех основных браузерах: Chrome, Opera, Firefox, Internet Explorer. Объяснение того, как это работает, вместе с кодом здесь:
Редактировать (ссылка не работает).
Я создал проект в Google Code, найдите там код:
http://code.google.com/p/expandselect/
При эмуляции щелчка есть небольшая разница в графическом интерфейсе пользователя, но это не имеет особого значения, убедитесь сами:
При щелчке мышью:

(source: googlecode.com)
При эмуляции щелчка:

(source: googlecode.com)
Больше скриншотов на сайте проекта по ссылке выше.
Можете ли вы опубликовать для этого jsfiddle?
Простой легкий способ.
function down(what) {
pos = $(what).offset(); // remember position
$(what).css("position","absolute");
$(what).offset(pos); // reset position
$(what).attr("size","10"); // open dropdown
}
function up(what) {
$(what).css("position","static");
$(what).attr("size","1"); // close dropdown
}
Теперь вы можете вызвать DropDown вот так
<select onfocus = "down(this)" onblur = "up(this)">
Идеально подходит для меня.
Может быть, лучше, потому что у вас нет проблем с положением других элементов на странице.
function down(was) {
a = $(was).clone().attr('id','down_man').attr('disabled',true).insertAfter(was);
$(was).css("position","absolute").attr("size","10");
}
function up(was) {
$('#down_man').remove();
$(was).css("position","static");
$(was).attr("size","1");
}
Измените идентификатор на фиксированное значение, я не умно, но я надеюсь, что вы понимаете идею.
Я попытался использовать ответ mrperfect, и у меня было несколько сбоев. С парой небольших изменений я смог заставить его работать на меня. Я просто изменил его так, чтобы он делал это только один раз. Как только вы выйдете из раскрывающегося списка, он вернется к обычному методу раскрывающихся списков.
function down() {
var pos = $(this).offset(); // remember position
$(this).css("position", "absolute");
$(this).offset(pos); // reset position
$(this).attr("size", "15"); // open dropdown
$(this).unbind("focus", down);
}
function up() {
$(this).css("position", "static");
$(this).attr("size", "1"); // close dropdown
$(this).unbind("change", up);
}
function openDropdown(elementId) {
$('#' + elementId).focus(down).blur(up).focus();
}
Одна вещь, на которую это не отвечает, - это то, что происходит, когда вы нажимаете один из вариантов в списке выбора после того, как вы выполнили свой size = n и установили абсолютное позиционирование.
Поскольку событие размытия делает его size = 1 и меняет его обратно на то, как он выглядит, у вас также должно быть что-то вроде этого
$("option").click(function(){
$(this).parent().blur();
});
Кроме того, если у вас возникли проблемы с отображением списка выбора с абсолютным позиционированием за другими элементами, просто поставьте
z-index: 100;
или что-то в этом роде в стиле select.
Это основано на ответах чуть выше и использует длину / количество вариантов, чтобы соответствовать тому, сколько вариантов на самом деле есть.
Надеюсь, это поможет кому-то получить нужные результаты!
function openDropdown(elementId) {
function down() {
var pos = $(this).offset(); // remember position
var len = $(this).find("option").length;
if (len > 20) {
len = 20;
}
$(this).css("position", "absolute");
$(this).css("zIndex", 9999);
$(this).offset(pos); // reset position
$(this).attr("size", len); // open dropdown
$(this).unbind("focus", down);
$(this).focus();
}
function up() {
$(this).css("position", "static");
$(this).attr("size", "1"); // close dropdown
$(this).unbind("change", up);
$(this).focus();
}
$("#" + elementId).focus(down).blur(up).focus();
}
Супер просто:
var state = false;
$("a").click(function () {
state = !state;
$("select").prop("size", state ? $("option").length : 1);
});
это не то же самое, что открыть его. когда список находится внизу страницы, если я его открою, он откроется вверх. если я изменю его размер, он «откроется» вниз, ниже, где я могу щелкнуть. не хорошо
@ekkis Объясненное поведение может отличаться на разных устройствах и в разных браузерах. Я протестировал предложенное мной решение с Firefox, Google Chrome и Opera на компьютере и Safari на мобильном устройстве, где оно работает должным образом. Скачок прокрутки можно легко исправить, сохранив / восстановив смещение прокрутки при открытии / закрытии или, возможно, используя scrollIntoView на <select>.
Может быть, поздно, но вот как я решил это: http://jsfiddle.net/KqsK2/18/
$(document).ready(function() {
fixSelect(document.getElementsByTagName("select"));
});
function fixSelect(selectList)
{
for (var i = 0; i != selectList.length; i++)
{
setActions(selectList[i]);
}
}
function setActions(select)
{
$(select).click(function() {
if (select.getElementsByTagName("option").length == 1)
{
active(select);
}
});
$(select).focus(function() {
active(select);
});
$(select).blur(function() {
inaktiv(select);
});
$(select).keypress(function(e) {
if (e.which == 13) {
inaktiv(select);
}
});
var optionList = select.getElementsByTagName("option");
for (var i = 0; i != optionList.length; i++)
{
setActionOnOption(optionList[i], select);
}
}
function setActionOnOption(option, select)
{
$(option).click(function() {
inaktiv(select);
});
}
function active(select)
{
var temp = $('<select/>');
$('<option />', {value: 1,text:$(select).find(':selected').text()}).appendTo(temp);
$(temp).insertBefore($(select));
$(select).attr('size', select.getElementsByTagName('option').length);
$(select).css('position', 'absolute');
$(select).css('margin-top', '-6px');
$(select).css({boxShadow: '2px 3px 4px #888888'});
}
function inaktiv(select)
{
if ($(select).parent().children('select').length!=1)
{
select.parentNode.removeChild($(select).parent().children('select').get(0));
}
$(select).attr('size', 1);
$(select).css('position', 'static');
$(select).css({boxShadow: ''});
$(select).css('margin-top', '0px');
}
Это должно покрыть это:
var event;
event = document.createEvent('MouseEvents');
event.initMouseEvent('mousedown', true, true, window);
countries.dispatchEvent(event); //we use countries as it's referred to by ID - but this could be any JS element var
Это может быть связано, например, с событием нажатия клавиши, поэтому, когда элемент находится в фокусе, пользователь может вводить текст, и он автоматически расширяется ...
--Контекст--
modal.find("select").not("[readonly]").on("keypress", function(e) {
if (e.keyCode == 13) {
e.preventDefault();
return false;
}
var event;
event = document.createEvent('MouseEvents');
event.initMouseEvent('mousedown', true, true, window);
this.dispatchEvent(event);
});
у меня сработало! каждый другой ответ предполагал, что существует способ нет для запуска выбора, но вы его нашли, есть ли у этого подхода какие-либо недостатки?
Ага - это мешает событиям табуляции (я думаю!). Это зависит от ваших потребностей - но это сработало, как ожидалось, - но не соответствовало нашим другим потребностям.
Работал у меня. При вызове из другого обработчика событий не забудьте получить элемент dom - $('#select_element').get(0).dispatchEvent(event);
это не работает для меня. работает в Chrome 56.0.2924 на OS X
это не работает для меня. Хотя выглядело многообещающе.
я только что добавил
select = $('#' + id);
length = $('#' + id + ' > option').length;
if (length > 20)
length = 20;
select.attr('size', length);
select.css('position', 'absolute');
select.focus();
и добавить в выбор
onchange = "$(this).removeAttr('size');"
onblur = "$(this).removeAttr('size');"
Сделать такой же внешний вид, как и классический (перекрывают остальную часть HTML)
возможный дубликат Как можно программно указать HTML SELECT, чтобы он выпал (например, при наведении курсора мыши)?