Для цього випадаючого списку в 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");
}
Змініть ідентифікатор на фіксоване значення mybe не розумно, але я сподіваюся, ви бачите idee.
Javascript не може "клацнути" по елементу (u може викликати вкладену onclickподію, але ви не можете буквально клацнути на ній)
Щоб переглянути всі елементи у списку, складіть multipleсписок і збільште його розмір, наприклад:
<select id="countries" multiple="multiple" size="10">
<option value="1">Country</option>
</select>
Ні, ти не можеш.
Ви можете змінити розмір, щоб збільшити його ... схоже на ідею 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>
Я спробував використати відповідь 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;
або щось подібне у стилі обраного.
Дуже просто:
var state = false;
$("a").click(function () {
state = !state;
$("select").prop("size", state ? $("option").length : 1);
});
scrollIntoViewна <select>.
Як уже зазначалося, ви не можете програмно відкрити <select>JavaScript за допомогою 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');
}