Para esta lista suspensa em HTML:
<select id="countries">
<option value="1">Country</option>
</select>
Eu gostaria de abrir a lista (o mesmo que clicar com o botão esquerdo nela). Isso é possível usando JavaScript (ou mais especificamente jQuery)?
jquery
html
drop-down-menu
Jon Tackabury
fonte
fonte
Respostas:
Você pode simular facilmente um clique em um elemento , mas um clique em um
<select>
não abrirá a lista suspensa.Usar várias seleções pode ser problemático. Talvez você deva considerar botões de opção dentro de um elemento de contêiner, que pode expandir e contrair conforme necessário.
fonte
Eu estava tentando encontrar a mesma coisa e fiquei desapontado. Acabei mudando o tamanho do atributo para a caixa de seleção para que ela pareça abrir
$('#countries').attr('size',6);
e então quando você terminar
$('#countries').attr('size',1);
fonte
size
atributo ao menu suspenso, na verdade, converte o menu suspenso em caixa de listagem ... então ele se expande ..Já me deparei com o mesmo problema e tenho uma solução. Uma função chamada ExpandSelect () que emula o clique do mouse no elemento "selecionar", o faz criando um outro
<select>
elemento que está absolutamente posicionado e tem várias opções visíveis ao mesmo tempo definindo osize
atributo. Testado em todos os principais navegadores: Chrome, Opera, Firefox, Internet Explorer. Explicação de como funciona, junto com o código aqui:Editar (o link foi quebrado) .
Eu criei um projeto no Google Code, vá para o código lá:
http://code.google.com/p/expandselect/
Capturas de tela
Há uma pequena diferença na GUI ao emular o clique, mas isso não importa, veja você mesmo:
Ao clicar com o mouse:
(fonte: googlecode.com )
Ao emular clique:
(fonte: googlecode.com )
Mais screenshots no site do projeto, link acima.
fonte
Isso é aprimorado a partir das respostas logo acima e usa o comprimento / número de opções para se conformar com quantas opções realmente existem.
Espero que isso ajude alguém a obter os resultados de que precisam!
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(); }
fonte
Isso deve abranger:
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
Isso pode ser vinculado, por exemplo, a um evento de pressionamento de tecla, então, quando o elemento tem o foco, o usuário pode digitar e ele se expandirá automaticamente ...
--Contexto--
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); });
fonte
$('#select_element').get(0).dispatchEvent(event);
Uma maneira simples e fácil.
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 }
Agora você pode chamar seu DropDown assim
<select onfocus="down(this)" onblur="up(this)">
Funciona perfeitamente para mim.
Talvez seja melhor, porque você não tem problemas com a posição dos outros elementos na página.
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"); }
Altere o ID para um valor fixo mybe não é inteligente, mas espero que você veja o idee.
fonte
Não é possível que o javascript "clique" em um elemento (você pode acionar o
onclick
evento anexado , mas não pode literalmente clicar nele)Para visualizar todos os itens da lista, transforme a lista em uma
multiple
lista e aumente seu tamanho, da seguinte forma:<select id="countries" multiple="multiple" size="10"> <option value="1">Country</option> </select>
fonte
Não, você não pode.
Você pode alterar o tamanho para torná-lo maior ... semelhante à ideia de Dreas, mas é o tamanho que você precisa alterar.
<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>
fonte
Tentei usar a resposta do mrperfect e tive alguns problemas. Com algumas pequenas mudanças, consegui fazê-lo funcionar para mim. Eu apenas mudei para que fosse feito apenas uma vez. Depois de sair do menu suspenso, ele voltaria ao método normal de menus suspensos.
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(); }
fonte
Uma coisa que isso não responde é o que acontece quando você clica em uma das opções na lista de seleção após ter feito seu size = n e feito seu posicionamento absoluto.
Como o evento de desfoque torna seu tamanho = 1 e o altera de volta para sua aparência, você também deve ter algo assim
$("option").click(function(){ $(this).parent().blur(); });
Além disso, se você estiver tendo problemas com a lista de seleção de posição absoluta exibida atrás de outros elementos, basta colocar um
z-index: 100;
ou algo parecido no estilo do select.
fonte
Super simples:
var state = false; $("a").click(function () { state = !state; $("select").prop("size", state ? $("option").length : 1); });
fonte
scrollIntoView
no<select>
.Como já foi dito, você não pode abrir programaticamente um
<select>
usando JavaScript.No entanto, você pode escrever seu próprio
<select>
gerenciando toda a aparência e sensação você mesmo. Algo parecido com o que você vê para os termos de pesquisa de preenchimento automático no Google ou Yahoo! ou a caixa Pesquisar localização na The Weather Network .Encontrei um para jQuery aqui . Não tenho ideia se atenderia às suas necessidades, mas mesmo que não atenda totalmente às suas necessidades, deve ser possível modificá-lo para que seja aberto como resultado de alguma outra ação ou evento. Este realmente parece mais promissor.
fonte
acabei de adicionar
select = $('#' + id); length = $('#' + id + ' > option').length; if (length > 20) length = 20; select.attr('size', length); select.css('position', 'absolute'); select.focus();
e adicionar ao select
onchange="$(this).removeAttr('size');" onblur="$(this).removeAttr('size');"
para fazer a mesma aparência do clássico (sobrepor o resto do html)
fonte
Talvez tarde, mas foi assim que resolvi: 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'); }
fonte