Для этого раскрывающегося списка в HTML:
<select id="countries">
<option value="1">Country</option>
</select>
Я хочу открыть список (аналогично щелчку по нему левой кнопкой мыши). Возможно ли это с помощью JavaScript (или, точнее, jQuery)?
Для этого раскрывающегося списка в HTML:
<select id="countries">
<option value="1">Country</option>
</select>
Я хочу открыть список (аналогично щелчку по нему левой кнопкой мыши). Возможно ли это с помощью JavaScript (или, точнее, jQuery)?
Ответы:
Вы можете легко имитировать щелчок по элементу , но щелчок по нему <select>
не открывает раскрывающийся список.
Использование множественного выбора может быть проблематичным. Возможно, вам следует рассмотреть радиокнопки внутри элемента контейнера, который вы можете расширять и сжимать по мере необходимости.
Я пытался найти то же самое и разочаровался. Я закончил тем, что изменил размер атрибута для поля выбора, чтобы оно открылось
$('#countries').attr('size',6);
а затем, когда вы закончите
$('#countries').attr('size',1);
size
атрибута в раскрывающийся список фактически преобразует раскрывающийся список в список ... таким образом, он расширяется ..
Я столкнулся с той же проблемой, и у меня есть решение. Функция ExpandSelect (), которая имитирует щелчок мышью по элементу «select», она делает это, создавая другой <select>
элемент, который абсолютно позиционирован и имеет сразу несколько параметров, видимых путем установки size
атрибута. Протестировано во всех основных браузерах: Chrome, Opera, Firefox, Internet Explorer. Объяснение того, как это работает, вместе с кодом здесь:
Редактировать (ссылка не работает) .
Я создал проект в Google Code, найдите там код:
http://code.google.com/p/expandselect/
При эмуляции щелчка есть небольшая разница в графическом интерфейсе пользователя, но это не имеет особого значения, убедитесь сами:
При щелчке мышью:
(источник: googlecode.com )
При эмуляции щелчка:
(источник: googlecode.com )
Больше скриншотов на сайте проекта по ссылке выше.
Это сделано из ответов чуть выше и использует длину / количество вариантов, чтобы соответствовать тому, сколько вариантов на самом деле есть.
Надеюсь, это поможет кому-то получить нужные результаты!
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 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);
});
$('#select_element').get(0).dispatchEvent(event);
Простой легкий способ.
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");
}
Измените идентификатор на фиксированное значение, я не умно, но я надеюсь, что вы понимаете идею.
JavaScript не может «щелкнуть» по элементу (вы можете активировать прикрепленный onclick
событие, но вы не можете щелкнуть его буквально)
Чтобы просмотреть все элементы в списке, сделайте список multiple
списком и увеличьте его размер, например:
<select id="countries" multiple="multiple" size="10">
<option value="1">Country</option>
</select>
Нет, не можешь.
Вы можете изменить размер, чтобы сделать его больше ... похоже на идею Дреаса, но это размер, который вам нужно изменить.
<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>
Я попытался использовать ответ 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;
или что-то в этом роде в стиле избранного.
Супер просто:
var state = false;
$("a").click(function () {
state = !state;
$("select").prop("size", state ? $("option").length : 1);
});
scrollIntoView
файл <select>
.
Как было сказано, вы не можете программно открыть <select>
помощью JavaScript.
Однако вы можете написать свое собственное <select>
управление всем внешним видом и ощущениями. Что-то вроде того, что вы видите для условий поиска с автозаполнением в Google или Yahoo! или поле поиска местоположения в The Weather Network .
Я нашел для JQuery здесь . Я понятия не имею, будет ли он соответствовать вашим потребностям, но даже если он не полностью соответствует вашим потребностям, должна быть возможность изменить его, чтобы он открылся в результате какого-либо другого действия или события. Этот действительно выглядит более многообещающим.
я только что добавил
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)
Может быть, поздно, но я решил это так: 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');
}