プログラムでHTML SELECTにドロップダウンを指示するにはどうすればよいですか(たとえば、マウスオーバーのため)。


105

プログラムでHTML selectにドロップダウンを指示するにはどうすればよいですか(たとえば、マウスオーバーのため)。


6
デフォルトの<select>動作を気にしないでください。特定の動作が期待され、他のプラットフォーム(モバイルなど)のユーザーがサイトを使用できないようにするためです。
Brian Donovan、

1
@BrianDonovanそのためにいくつかの処理を追加できないようではありません。
モルグ。

@shasikanth:フィドルがChrome 37のFirefox 37でも機能しない
rubo77

さて、フィドルは以前に機能したと思います。とにかく、ここでコメントを削除します。
shasi kanth 2015

@BrianDonovan実際、モバイルはこれの良いユースケースです...プログラムで選択を生成し、そのオプションを自動的にポップアップさせます。
マイケル

回答:


15

HTML選択タグを使用してこれを行うことはできませんが、JavaScript HTML を使用して行うことができます。これを行うさまざまな既存のコントロールがあります。たとえば、SOの「興味深い/無視されたタグ」エントリに添付された「提案」リストや、メールアドレスのGmailの検索などです。

この機能を提供する多くのJavaScript + HTMLコントロールがあります。アイデアのオートコンプリートコントロールを探してください。

オートコンプリートコントロールについては、このリンクを参照してください... http://ajaxcontroltoolkit.codeplex.com/


6
これは非常に残念なことです。モバイルブラウザはOS固有のスクロールリストを提供します。これを自動的にポップアップする必要があります。
マイケル

120

これは実際にはHTML + Javascriptで実際に可能でしたが、他の地域では不可能と言われていますが、後で非推奨になり、現在は機能していません。

ただし、これはChromeでのみ機能しました。興味があればもっと読んでください。


よるHTML5、セクション3.2.5.1.7のためのW3Cワーキングドラフト。インタラクティブコンテンツ

HTMLの特定の要素にはアクティブ化動作があります。つまり、ユーザーはそれらをアクティブ化できます。これにより、たとえばキーボードまたは音声入力を使用したり、マウスをクリックしたりするなど、アクティブ化メカニズムに依存する一連のイベントがトリガーされます

ユーザーがクリック以外の方法でアクティブ化動作が定義された要素をトリガーする場合、相互作用イベントのデフォルトアクションは、要素で合成クリックアクティブ化手順を実行することです。

<select>インタラクティブコンテンツであるため、プログラムでその<option>sを表示することが可能であると考えました。数時間遊んでみたところ、を使用document.createEvent()して.dispatchEvent()機能することがわかりました。

とはいえ、デモ時間。 これが動作するフィドルです。


HTML:

<select id="dropdown">
    <option value="Red">Red</option>
    <option value="Green">Green</option>
    <option value="Blue">Blue</option>
</select>
<br>
<button id="fire" type="button" onclick="runThis()">Show dropdown items</button>​

JavaScript:

// <select> element displays its options on mousedown, not click.
showDropdown = function (element) {
    var event;
    event = document.createEvent('MouseEvents');
    event.initMouseEvent('mousedown', true, true, window);
    element.dispatchEvent(event);
};

// This isn't magic.
window.runThis = function () { 
    var dropdown = document.getElementById('dropdown');
    showDropdown(dropdown);
};

同じことをする方法がChromeにない場合は、このフィドルを自由に変更してください


2
これありがとう!ChromeでIEのAlt +下矢印の動作を正確にエミュレートする必要がありました。
Jブライアンプライス

3
私はあなたの報奨金にこれを追加できればいいのにと思います。どうもありがとうございます。
Adam Tuttle 2013

7
作業していません:IE10FF 24。上の作品は:Chrome 30Safari 6.0.5Opera 16
hitautodestruct

2
@AdamTuttle Android 4.4.2でも機能しない
Mirko


47

Xavier Hoの答えは、現在出回っているほとんどのブラウザーで問題を解決する方法をカバーしています。しかし、JavaScriptでイベントを「ディスパッチ/変更」しないことは、良い習慣です。(mousedownこの場合も同様です)

バージョン53以降、Google Chrome は信頼できないイベントに対してデフォルトのアクションを実行しません。スクリプトによって作成または変更された、またはdispatchEventメソッドを介してディスパッチされたイベントなど。この変更は、FirefoxとIEに合わせるためのものであり、すでにアクションを実行していないと思います。

テスト目的で、FiddleはXavierの回答をChrome 53以降では機能しないとしています。(FFとIEはテストしていません)。

参照用リンク:

https://www.chromestatus.com/features/57188​​03933560832 https://www.chromestatus.com/features/6461137440735232

また、initMouseEventも非推奨になりました


MouseEventsを使用して実行できますか?developer.mozilla.org/en-US/docs/Web/API/MouseEvent
Shamal Perera

私はそうは思いません。何かやってみましたか
Asim KT

28

これは私が得ることができる最も近いものであり、要素onmouseoverのサイズを変更し、サイズをonmouseoutに復元します。

       <select onMouseOut="this.size=1;" onMouseOver="this.size=this.length;">
        <option>1</option>
        <option>2</option>
        <option>3</option>
        <option>4</option>
        <option>5</option>
      </select>


13
または<SELECT onMouseOut = "this.size = 1;" onMouseOver = "this.size = this.length;"> ... </ SELECT>
RealHowTo 2008年

1
また、選択が行われるとすぐにメニューが折りたたまれるように、onchange = "this.size = 1"を追加する必要があります。要素のCSSルールも設定する必要があります。
gm2008

動作するようです。選択幅が縮小すると、マウスアウトイベントが発生し、選択が元の幅にリセットされます。これは発作の影響を引き起こします。固定幅を設定すると修正されるようです。いくつかのアイテムがあると、リストはビューを超えて展開されます。
1.21ギガワット

16

私はこれと同じ問題を抱えており、これを解決するための簡単な方法はhtmlとcssを使用することでした。

select{
  opacity: 0;
  position: absolute;
}
<select>
  <option>option 1</option>
  <option>option 2</option>
  <option>option 3</option>
</select>
<button>click</button>


2
このアプローチを見てから長い間経ちましたが、私が探していたリファレンスです。トリガーする非表示の選択のサイズ(ボタン、img、divなど)に一致する追加のCSSを使用する方が良い... 注:一部のレイアウトでは、クリック可能な領域が一番上の要素になるように、z-indexを追加する必要がある場合もあります。
Mavelo 2018

ただし、ユーザーがページを下にスクロールすると、ボタンはそれに応じて移動しますが、選択は同じ位置に保持されます。本当に期待どおりではありません。これに対する解決策はありますか?
David Portabella、

完璧なソリューション。しかし、ボタンをラップして、この<div style='position:relative'><select> <option>option 1</option> <option>option 2</option> <option>option 3</option> </select> <button>click</button></div>@DavidPortabellaのようにdivを選択する方がよいかもしれません
Muhammet Can TONBUL

8

これはChromeではもう不可能だと思います。

Asim K Tによると、Chromeのバージョン53ではこの機能が無効になっているようです。

仕様によると http://www.w3.org/TR/DOM-Level-3-Events/#trusted-events

信頼できるイベントは、デフォルトのアクション(クリックイベントを除く)を起動しないでください。

ただし、webviewで有効にしていますが、これはテストしていません。

一部のWebビューは内部でfastclickを使用していることがわかりました。破損のリスクがあるため、信頼されていなくてもマウスを選択できるようにします。

そしてこの議論では、開発者にプログラムでドロップダウンを開かせるという考えは放棄されています。


7

まだ誰かがこれを探しているなら:

<select id="dropdown">
    <option value="Red">Red</option>
    <option value="Green">Green</option>
    <option value="Blue">Blue</option>
</select>
<br>
<button id="fire" type="button" >Show dropdown items</button>

JavaScript:

var is_visible=false; 

$(document).ready(function(){

    $('#fire').click(function (e) { 
    var element = document.getElementById('dropdown');


    if(is_visible){is_visible=false; return;}
    is_visible = true;

    var event;
    event = document.createEvent('MouseEvents');
    event.initMouseEvent('mousedown', true, true, window);
    element.dispatchEvent(event);

    /* can be added for i.e. compatiblity.
      optionsSelect.focus();
       var WshShell = new ActiveXObject("WScript.Shell");
       WshShell.SendKeys("%{DOWN}");
    */
    e.stopPropagation();
    return false;
});


$(document).click(function(){is_visible=false; });
});

更新:

この問題に対する完璧な解決策がなくなるまでは、このシナリオを回避することができます。なぜこれをしたいのですか?私は数ヶ月前にモバイルデバイス用の選択したプラグインを作成するための解決策を考えていました

https://github.com/HemantNegi/jquery.sumoselect

最後に、カスタムdiv(またはその他の要素)を透明な選択要素でマスクして、ユーザーと直接対話できるようにしました。


1
github.com/HemantNegi/jquery.sumoselectのようなプラグインは、デフォルトのコントロールよりも実際によく見える唯一のクロスブラウザーソリューションです。
ジャスティン

iniMouseEvent動作するようですが、なぜ動作$(select).trigger('mousedown')しないのですか?
coding_idiot

3

これが私が見つけた最良の方法です。注これはWindows上のIEでのみ機能し、シェルにアクセスするため、おそらくWebは安全なゾーンにある必要があります。トリックは、ALT-下矢印が選択ドロップダウンを開くためのショートカットキーであることです。

<button id="optionsButton" style="position:absolute;top:10px;left:10px;height:22px;width:100px;z-index:10" onclick="doClick()">OPTIONS</button>
<select id="optionsSelect" style="position:absolute;top:10px;left:10px;height:20px;width:100px;z-index:9">
    <option>ABC</option>
    <option>DEF</option>
    <option>GHI</option>
    <option>JKL</option>
</select>
<script type="text/javascript">
   function doClick() {
       optionsSelect.focus();
       var WshShell = new ActiveXObject("WScript.Shell");
       WshShell.SendKeys("%{DOWN}");
   }
</script>

3
あなたがない限り、それは動作しません、これを
Knu

1
@Knu Internet Explorerは、要素のIDを要素への参照としてグローバルスコープに自動的に追加します。
user2428118 2014年

@KlasMellbournでしょう。彼らは現在、彼らのブラウザをより準拠させようとしている。上記の「サイズ」ソリューションを使用してください。
sproketboy 2014年

2

あなたがしたいときに、一つのことは不可能であると考えるのをやめてください。

男が作成したこの拡張JS関数を使用します。

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

このJSを含めて、次のようにparamを選択IDとして渡して呼び出すだけです。

ExpandSelect(MySelect)

2
明確に言うと、JSはa をドロップダウンさせませ<SELECT>。「ブラウザは純粋なJavaScriptで<select>を展開することを許可していないため、そのコントロールは、マウスを使用して直接クリックすることによってのみ展開できます」と明示的に述べています。だから、ある「不可能」!代わりに、JSは、「我々が展開真似別を作成することによって、コントロールが複数のオプションが一度に表示された状態で選択し、<選択> ...」かなり異なっている、としてもしなくてもよい....あなたの使用状況のケースのために許容されることができると述べ
JonBrave

1

私は間違っているかもしれませんが、デフォルトの選択ボックスでそれが可能であるとは思いません。JSとCSSを使用して目的の結果を達成できますが、(私の知る限り)バニラSELECTはできません。


0

「HTMLセレクト」を開くには、この質問で述べたいくつかの回避策と同様の回避策を使用します。ただし、これを行うよりきれいな方法は、「select2」や「chosen」などの選択ライブラリをプロジェクトに追加することです。たとえば、select2をプログラムで開くのは次のように簡単です。

$('#target-select').select2('open');

-2

これは正確にはあなたが求めたものではありませんが、私はこのソリューションが単純であることを気に入っています。ドロップダウンを開始したいほとんどの場合、それはユーザーが実際に選択を行ったことを検証しているためです。ドロップダウンのサイズを変更してフォーカスします。これにより、スキップした項目が適切に強調表示されます。

$('#cboSomething')[0].size = 3;
$('#cboSomething')[0].focus();

それが「最悪の」方法ではないので、なぜあなたが反対票を投じたのかわからない。周囲の要素のレイアウトがずれるので、これは避けます。@CMSのソリューションは、コントロールでフォーカス/ブラーイベントを使用するとより簡単に理解できると思います。
Mavelo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.