jQueryを使用してドロップダウンリストを開くことはできますか?


85

HTMLのこのドロップダウンリストの場合:

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

リストを開きたい(左クリックと同じ)。これはJavaScript(またはより具体的にはjQuery)を使用して可能ですか?



4
なぜこれが不可能なのか誰かが説明できますか?
SpaceBeers 2014


回答:


18

要素のクリックを簡単にシミュレートできますが、クリックし<select>てもドロップダウンは開きません。

複数の選択を使用すると、問題が発生する可能性があります。おそらく、必要に応じて拡大および縮小できるコンテナ要素内のラジオボタンを検討する必要があります。


70

私は同じものを見つけようとしていてがっかりしました。選択ボックスの属性サイズを変更して、開いているように見えるようにしました

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

そして、あなたが終わったとき

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

12
sizeドロップダウンに属性を追加すると、実際にはドロップダウンがリストボックスに変換されます。したがって、展開されます
。– Mayank Pathak 2012

素晴らしいソリューション。リストボックスが(ドロップダウンのようにコンテンツを拡張するのではなく)ページ上でより多くのスペースを占めるため、コンテンツが押し下げられるという事実に対処する必要があります。
zkent 2014年

見た目しか想像できない人にとっては、このアプローチを使用した後の外観は複数選択ボックスです(ただし、複数選択可能ではありません)。個人的には、ドロップダウンを開くよりも安定していると思います。
Siwei 2014

これは技術的には機能しますが、1)横に醜いスクロールバーがあり、2)z-indexが元の選択に固定されているため、ポップアッププルダウンのようにも機能しません。
BoB3K 2016年

これをありがとう...私はユーザーに何かを選ばなければならないことを警告するために様々なポップオーバーなどを試すのに2時間を費やしました。何もうまく機能していませんでした...これは微妙ですがしっかりしたリマインダーです。そしてそれは機能します(不安定な他のソリューションとは異なります)。
2017

15

私は同じ問題に遭遇し、解決策があります。「select」要素のマウスクリックをエミュレートするExpandSelect()と呼ばれる関数<select>は、絶対に配置され、size属性を設定することで一度に複数のオプションが表示される別の要素を作成することで実現します。Chrome、Opera、Firefox、InternetExplorerのすべての主要なブラウザでテスト済み。それがどのように機能するかの説明と、ここのコード:

編集(リンクが壊れていた)

私はGoogleCodeでプロジェクトを作成しました、そこでコードを探してください:

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

スクリーンショット

クリックをエミュレートするときのGUIには少し違いがありますが、それは実際には重要ではありません。自分で確認してください。

マウスクリック時:

MouseClicking
(ソース:googlecode.com

クリックをエミュレートする場合:

EmulatingClicking
(ソース: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 2015

うん-それはタブイベントを妨害します(私は思う!)、それはあなたのニーズに依存します-しかしそれは期待通りに機能しました-しかし私たちの他のニーズに合いませんでした。
Stuart.Sklinar 2015

私のために働いた。別のイベントハンドラから呼び出すと、DOM要素を取得するために覚えていれば-$('#select_element').get(0).dispatchEvent(event);
BoB3K

これは私にはうまくいきません。OSX上のChrome56.0.2924で実行
ekkis 2017

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
}

これで、このようにドロップダウンを呼び出すことができます

<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が要素を「クリック」onclickすることはできません(uは添付されたイベントをトリガーできますが、文字通りクリックすることはできません)

リスト内のすべてのアイテムを表示するには、リストをmultipleリストにして、次のようにサイズを大きくします。

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

IE6、7、8b2およびOpera9.62の4つの項目の後にスクロールバーを追加します。Safari forWindowsおよびGoogleChromeで10個のアイテムの後にスクロールバーを追加します。
Grant Wagner

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

これが答えないことの1つは、size = nを実行して絶対配置にした後、選択リストのオプションの1つをクリックするとどうなるかということです。

ぼかしイベントによってサイズが1になり、外観に戻るため、次のようなものも必要です。

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

また、絶対位置の選択リストが他の要素の後ろに表示されることに問題がある場合は、

z-index: 100;

またはselectのスタイルでそのようなもの。


2

超シンプル:

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

1
それはそれを開くことと同じではありません。リストボックスがページの下部にある場合、それを開くと、上向きに開きます。サイズを変更すると、下に「開き」、クリックできる場所の下に表示されます。良くない
ekkis 2017

@ekkis説明されている動作は、デバイスやブラウザによって異なる場合があります。提案したソリューションをデスクトップのFirefox、Google Chrome、Opera、モバイルのSafariでテストしましたが、期待どおりに機能します。スクロールジャンプは、開閉時にスクロールオフセットを保存/復元するか、でを使用scrollIntoViewすることで簡単に修正できます<select>
yckart 2017

1

すでに述べたように、<select>JavaScriptを使用してプログラムで開くことはできません。

ただし、<select>ルックアンドフィール全体を管理する独自の記述を作成することもできます。GoogleYahoo!のオートコンプリート検索用語に表示されるようなものです。または、The WeatherNetworkの[SearchforLocation]ボックス。

ここで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');

                  }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.