Могу ли я открыть выпадающий список с помощью jQuery
для этого выпадающего списка в HTML:
<select id="countries">
<option value="1">Country</option>
</select>
Я хотел бы открыть список (то же самое, что и щелчок левой кнопкой мыши на нем). Возможно ли это с помощью JavaScript (или более конкретно jQuery)?
14 ответов:
вы можете легко имитировать щелчок по элементу, но нажмите на
<select>не откроет выпадающий список.использование нескольких вариантов выбора может быть проблематичным. Возможно, вам следует рассмотреть переключатели внутри элемента контейнера, который вы можете расширять и сжимать по мере необходимости.
Я пытался найти то же самое и разочаровался. Я закончил тем, что изменил размер атрибута для поля выбора, чтобы он открывался
$('#countries').attr('size',6);а потом, когда вы закончите
$('#countries').attr('size',1);
я столкнулся с той же проблемой и у меня есть решение. Функция ExpandSelect (), которая эмулирует щелчок мыши на элементе "select", делает это путем создания другого
<select>элемент, который абсолютно позиционируется и имеет несколько вариантов, видимых сразу, установив
Это должно покрыть его:
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); });
Это приукрашено из ответов чуть выше и использует длину/количество вариантов, чтобы соответствовать тому, сколько вариантов на самом деле есть.
надеюсь, что это поможет кому-то получить результаты, которые им нужны!
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(); }
простой, легкий путь.
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 }Теперь вы можете назвать свой выпадающий список так же, как это
<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"); }измените идентификатор на фиксированное значение mybe не умный, но я надеюсь, что вы видите idee.
Нет, ты не можешь.
вы можете изменить размер, чтобы сделать его больше... похоже на идею Dreas, но это размер, который вам нужно изменить.
<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>
невозможно, чтобы javascript "щелкнул" по элементу (u может вызвать прикрепленный
onclickсобытие, но вы не можете просто нажимать на него)чтобы просмотреть все элементы в списке, сделайте список a
multipleсписок и увеличить его размер, например:<select id="countries" multiple="multiple" size="10"> <option value="1">Country</option> </select>
Я попытался использовать ответ 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(); }
одна вещь, на которую это не отвечает, - Это то, что происходит, когда вы нажимаете на один из параметров в списке выбора после того, как вы сделали свой размер = n и сделали его абсолютным позиционированием.
потому что размытие событие делает его размер = 1 и изменяет его обратно, как это выглядит, вы должны иметь что-то вроде этого, а также
$("option").click(function(){ $(this).parent().blur(); });кроме того, если у вас возникли проблемы с абсолютным позиционированным списком выбора, показывающим за другими элементами, просто поставьте
z-index: 100;или что-то вроде этого в стиле select.
супер просто:
var state = false; $("a").click(function () { state = !state; $("select").prop("size", state ? $("option").length : 1); });
Как уже было сказано, вы не можете программно открыть
<select>с помощью JavaScript.однако, вы могли бы написать свой собственный
<select>управление весь внешний вид и чувствовать себя. Что-то вроде того, что вы видите для условий поиска автозаполнения на Google или Yahoo! или поле поиска местоположения в Сеть Погоды.Я нашел один для jQuery здесь. Я понятия не имею, будет ли он встречаться ваши потребности, но даже если он не полностью отвечает вашим потребностям, его можно изменить, чтобы он открылся в результате какого-либо другого действия или события. этот на самом деле выглядит более перспективным.
может быть, поздно, но вот как я решил это: 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'); }
Я только что добавил
select = $('#' + id); length = $('#' + id + ' > option').length; if (length > 20) length = 20; select.attr('size', length); select.css('position', 'absolute'); select.focus();и добавить в select
onchange="$(this).removeAttr('size');" onblur="$(this).removeAttr('size');"сделать такой же внешний вид как классический, (перекрытие остальной части html)
Comments