我可以使用jQuery打开下拉列表吗


85

对于HTML中的此下拉列表:

<select id="countries">
<option value="1">Country</option>
</select>

我想打开列表(与单击鼠标左键相同)。使用JavaScript(或更具体地说是jQuery)是否可能?



4
谁能解释为什么这是如此不可能?
SpaceBeers 2014年


Answers:


18

您可以轻松模拟对元素的单击,但是单击对<select>不会打开下拉菜单。

使用多个选择可能会有问题。也许您应该考虑容器元素内部的单选按钮,您可以根据需要展开和收缩。


69

我试图找到同样的东西,但感到失望。我最终更改了选择框的属性大小,因此它似乎可以打开

$('#countries').attr('size',6);

然后当你完成

$('#countries').attr('size',1);

12
size下拉列表添加属性实际上将下拉列表转换为列表框。因此它扩展了。–
Mayank Pathak

很好的解决方案。您只需要处理以下事实:列表框会占用页面上的更多空间(而不是像下拉菜单一样扩展内容),从而将内容下推。
2014年

对于那些只能想象外观的人,使用此方法后外观是一个多选框(但不是多选),我个人认为比打开下拉列表更稳定。
Siwei 2014年

从技术上讲这是可行的,但是1)您现在在侧面有一个丑陋的滚动条,并且2)z-index固定在原始选择上,因此也不太像弹出式下拉菜单。
BoB3K

谢谢你。。。我花了2个小时尝试各种弹出窗口等,以提醒用户他们必须选择一些东西。没有任何事情运作良好...这是一个微妙但坚定的提醒。而且它可以工作(不同于其他解决方案)。
11teenth

15

我遇到了同样的问题,并且有解决方案。名为ExpandSelect()的函数可模拟鼠标在“选择”元素上的点击,它通过创建另一个<select>绝对位置正确的元素并通过设置size属性一次显示多个选项来实现。已在所有主要浏览器上测试:Chrome,Opera,Firefox,Internet Explorer。解释其工作原理以及此处的代码:

编辑(链接断开)

我已经在Google Code中创建了一个项目,请在此处查找代码:

http://code.google.com/p/expandselect/

屏幕截图

在模拟点击时,GUI略有不同,但这并不重要,请亲自查看:

当鼠标单击时:

鼠标点击
(来源:googlecode.com

模拟时单击:

模拟点击
(来源:googlecode.com

该项目网站上的更多屏幕截图,上方链接。


2
您可以为此发布jsfiddle吗?
杰伊·沙利文

10

这应该覆盖它:

 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

例如,这可能绑定到keypress事件,因此当元素具有焦点时,用户可以键入并且它将自动展开...

-上下文-

  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);
 });

为我工作!其他所有答案都表明,您还没有找到触发选择的方法,这种方法是否有缺点?
kittyminky

是的-它会干扰制表事件(I Think!),这取决于您的需求-但它按预期方式工作-但不符合我们的其他需求。
Stuart.Sklinar,2015年

为我工作。如果从其他事件处理程序进行调用,请记住将dom元素取出$('#select_element').get(0).dispatchEvent(event);
BoB3K

这对我不起作用。在OSX上的Chrome 56.0.2924上运行
ekkis

9

这是从上面的答案中得出的,并使用选项的长度/数量来符合实际有多少个选项。

希望这可以帮助某人获得所需的结果!

    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();
    }

5

简单易行。

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");
}

将ID更改为固定值,可能不明智,但我希望您能看到这个想法。


4

javascript无法“单击”元素(u可以触发附加onclick事件,但您不能从字面上单击它)

要查看列表中的所有项目,请将列表设为multiple列表并增加其大小,例如:

<select id="countries" multiple="multiple" size="10">
<option value="1">Country</option>
</select>

在IE6、7和8b2和Opera 9.62中的4个项目之后添加滚动条。在Safari for Windows和Google Chrome浏览器中的10个项目之后添加滚动条。
格兰特·瓦格纳

2

不,你不能。

您可以更改大小以使其更大...类似于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>

2

我尝试使用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();
}

2

做不到的一件事是,在您将size = n设置为绝对位置后,单击选择列表中的一个选项会发生什么。

因为模糊事件使它的大小= 1并将其更改回外观,所以您也应该有类似的东西

$("option").click(function(){
    $(this).parent().blur();
});

另外,如果您对显示在其他元素后面的绝对位置选择列表有疑问,只需在

z-index: 100;

或类似风格的选择。


2

超级简单:

var state = false;
$("a").click(function () {
    state = !state;
    $("select").prop("size", state ? $("option").length : 1);
});

1
这与打开它不同。当列表框位于页面底部时,如果我打开它,它就会向上打开。如果更改尺寸,它会向下“打开”,在我可以单击的位置下方。不好
ekkis

@ekkis解释的行为可能在不同的设备和浏览器上有所不同。我已经在桌面上的Firefox,Google Chrome和Opera以及在移动设备上的Safari上测试了我提出的解决方案,该解决方案可以按预期工作。通过在打开/关闭时保存/恢复滚动偏移量,或者scrollIntoView在上使用,可以轻松地解决滚动跳跃问题<select>
yckart '17

1

如前所述,您无法以编程方式打开<select>使用JavaScript的。

但是,您可以编写自己的文件来<select>管理整个外观。就像您在GoogleYahoo!上看到的自动完成搜索字词一样 或“天气网络”中的“搜索位置”框。

我在这里为jQuery找到了一个。我不知道它是否可以满足您的需求,但是即使它不能完全满足您的需求,也应该可以对其进行修改,以便由于其他操作或事件而将其打开。实际上看起来更有希望。


0

我刚刚添加

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的其余部分重叠)


-1

也许迟了,但这就是我解决的方法: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');

                  }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.