HTMLのこのドロップダウンリストの場合:
<select id="countries">
<option value="1">Country</option>
</select>
リストを開きたい(左クリックと同じ)。これはJavaScript(またはより具体的にはjQuery)を使用して可能ですか?
HTMLのこのドロップダウンリストの場合:
<select id="countries">
<option value="1">Country</option>
</select>
リストを開きたい(左クリックと同じ)。これはJavaScript(またはより具体的にはjQuery)を使用して可能ですか?
回答:
私は同じものを見つけようとしていてがっかりしました。選択ボックスの属性サイズを変更して、開いているように見えるようにしました
$('#countries').attr('size',6);
そして、あなたが終わったとき
$('#countries').attr('size',1);
size
ドロップダウンに属性を追加すると、実際にはドロップダウンがリストボックスに変換されます。したがって、展開されます
私は同じ問題に遭遇し、解決策があります。「select」要素のマウスクリックをエミュレートするExpandSelect()と呼ばれる関数<select>
は、絶対に配置され、size
属性を設定することで一度に複数のオプションが表示される別の要素を作成することで実現します。Chrome、Opera、Firefox、InternetExplorerのすべての主要なブラウザでテスト済み。それがどのように機能するかの説明と、ここのコード:
編集(リンクが壊れていた)。
私はGoogleCodeでプロジェクトを作成しました、そこでコードを探してください:
http://code.google.com/p/expandselect/
クリックをエミュレートするときのGUIには少し違いがありますが、それは実際には重要ではありません。自分で確認してください。
マウスクリック時:
(ソース:googlecode.com)
クリックをエミュレートする場合:
(ソース:googlecode.com)
プロジェクトのウェブサイトにあるその他のスクリーンショット、上記のリンク。
これはそれをカバーする必要があります:
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);
});
$('#select_element').get(0).dispatchEvent(event);
これは、上記の回答から作成され、オプションの長さ/数を使用して、実際に存在するオプションの数に一致します。
これが誰かが必要な結果を得るのに役立つことを願っています!
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();
}
シンプルで簡単な方法。
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を修正値に変更してください。賢くはありませんが、アイデアが表示されることを願っています。
javascriptが要素を「クリック」onclick
することはできません(uは添付されたイベントをトリガーできますが、文字通りクリックすることはできません)
リスト内のすべてのアイテムを表示するには、リストを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();
}
これが答えないことの1つは、size = nを実行して絶対配置にした後、選択リストのオプションの1つをクリックするとどうなるかということです。
ぼかしイベントによってサイズが1になり、外観に戻るため、次のようなものも必要です。
$("option").click(function(){
$(this).parent().blur();
});
また、絶対位置の選択リストが他の要素の後ろに表示されることに問題がある場合は、
z-index: 100;
またはselectのスタイルでそのようなもの。
超シンプル:
var state = false;
$("a").click(function () {
state = !state;
$("select").prop("size", state ? $("option").length : 1);
});
scrollIntoView
することで簡単に修正できます<select>
。
すでに述べたように、<select>
JavaScriptを使用してプログラムで開くことはできません。
ただし、<select>
ルックアンドフィール全体を管理する独自の記述を作成することもできます。GoogleやYahoo!のオートコンプリート検索用語に表示されるようなものです。または、The WeatherNetworkの[SearchforLocation]ボックス。
ここで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');
}