Javascript(およびjQuery)を使用して選択ボックスを開く方法はありますか?
<select style="width:150px;">
<option value="1">1</option>
<option value="2">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc arcu nunc, rhoncus ac dignissim at, rhoncus ac tellus.</option>
<option value="3">3</option>
</select>
つまり、バグの原因を選択して開く必要があります。 IE(6,7,8)のすべてのバージョンがオプションを削減しました。私が知る限り、これに対するcssバグ修正はありません。現時点では、以下を実行しようとしています。
var original_width = 0;
var selected_val = false;
if (jQuery.browser.msie) {
$('select').click(function(){
if (selected_val == false){
if(original_width == 0)
original_width = $(this).width();
$(this).css({
'position' : 'absolute',
'width' : 'auto'
});
}else{
$(this).css({
'position' : 'relative',
'width' : original_width
});
selected_val = false;
}
});
$('select').blur(function(){
$(this).css({
'position' : 'relative',
'width' : original_width
});
});
$('select').blur(function(){
$(this).css({
'position' : 'relative',
'width' : original_width
});
});
$('select').change(function(){
$(this).css({
'position' : 'relative',
'width' : original_width
});
});
$('select option').click(function(){
$(this).css({
'position' : 'relative',
'width' : original_width
});
selected_val = true;
});
}
しかし、最初に選択をクリックすると、選択の幅が変更されますが、もう一度クリックして開く必要があります。
さて、この問題を解決する別の方法を見つけました。修正方法は次のとおりです。
フィードバックをお願いします!私は自分自身に誇りを持っています;)
$(document).ready(function() {
if (jQuery.browser.msie) {
select_init();
}
});
function select_init () {
var selects = $('select');
for (var i = 0; i < selects.length; i++) {
_resizeselect.init(selects[i]);
}
}
var _resizeselect = {
obj : new Array(),
init : function (el) {
this.obj[el] = new resizeselect (el);
}
}
function resizeselect (el) {
this.el = el;
this.p = el.parentNode;
this.ht = el.parentNode.offsetHeight;
var obj = this;
this.set = false;
el.onmousedown = function () {
obj.set_select("mousedown");
}
el.onblur = function () {
obj.reset_select("blur");
}
el.onchange = function () {
obj.reset_select("change");
}
}
resizeselect.prototype.set_select = function (str) {
if (this.set) {
this.set = false;
return;
}
this.el.style.width = "auto";
this.el.style.position = "absolute";
this.p.style.height = this.ht + "px";
this.p.style.zIndex = 100;
this.set = true;
this.el.focus();
}
resizeselect.prototype.reset_select = function (str) {
this.el.style.width = "";
this.el.style.position = "";
this.p.style.height = "";
this.p.style.zIndex = 1;
this.set = false;
window.focus();
}
click
を使用する代わりに、mousedown
ハンドラーを使用してmousedown
イベントをキャプチャできます。 mousedown
はclick
の前に起動するため、stopPropogation
を呼び出してイベントキューを解除できます。
私はこれがかなり古くて回答されていることを知っていますが、これはSafariとiOS UIWebViewでうまくいきました-私はそれを隠していますが、別のボタンがクリックされたときに表示して開きたいです。
$('#select-id').show().focus().click();
これを試して:
dropDown = function (elementId) {
var dropdown = document.getElementById(elementId);
try {
showDropdown(dropdown);
} catch(e) {
}
return false;
};
showDropdown = function (element) {
var event;
event = document.createEvent('MouseEvents');
event.initMouseEvent('mousedown', true, true, window);
element.dispatchEvent(event);
};
次に、関数を呼び出します。
dropDown('elementId');
[〜#〜] no [〜#〜]jQueryソリューション。
<SCRIPT>
function toggleDropdown(element){
if(element.size == 0) element.size = element.length;
else element.size = 0;
}
</SCRIPT>
これを見つけました here 。
これを試して:
var myDropDown=$("#myDropDown");
var length = $('#myDropDown> option').length;
//open dropdown
myDropDown.attr('size',length);
そしてこれは閉じます:
//close dropdown
myDropDown.attr('size',0);
イベントハンドラー(クリック、ぼかしなど)からtrueを返す必要があると思うので、ハンドラーの実行後、ブラウザーは引き続きイベントを伝達し、選択を開きます。
Hrefリンクについても同様です。onclickハンドラーがあり、ハンドラーがfalseを返す場合、リンクは追跡されません(ハンドラーの実行後にブラウザーがイベントを停止します)。
編集:コメントと回答に基づいて、ブラウザーがボックスを開くことを決定した後にのみ、ハンドラーが最初に実行される可能性があるようです。focus
イベントハンドラーを試すことをお勧めします。click
ハンドラーよりも早く、おそらくブラウザーが実際にボックスを開く前に実行される可能性があります。また、より一貫性があります(マウスとキーボードの両方のナビゲーションに適用されます)。
まず、IEでこの制限の痛みを感じます。それは私のために働いているようだので、私もこれを共有すると思った。私はほとんど同じアプローチをとりましたが、選択要素ごとです。私の場合、どのリストに長いデータが含まれているかがわかります。
選択要素を絶対にするのではなく、外観を一貫させる必要があるため、それらをインラインに保持し、DIVで非表示のオーバーフローでラップします。また、IEおよび幅が現在の幅よりも大きい。
これをすべての選択ボックスに使用するには、次のようなものを使用できます。
$("select").each(function(){
$(this).IELongDropDown();
});
または明らかに、IDごとの要素ごとに。 jqueryプラグインは次のとおりです。
(function($) {
$.fn.IELongDropDown = function(cln) {
if (jQuery.browser.msie) { //only IE has problems with long select boxes
var el = this;
var previousWidth = el.width();
var divWrapper = "<div style='padding:0;margin:0;overflow:hidden;width:"+ previousWidth +"px'></div>";
el.wrap(divWrapper);
var newWidth = el.width("auto").width();
el.width(previousWidth);
if(newWidth > previousWidth) {
el.bind("mousedown", function(){ return el.width("auto").focus(); });
el.bind("blur", function(){ return el.width(previousWidth); });
el.bind("change", function(){ return el.width(previousWidth); });
}
}
return this;
};
})(jQuery);
これが誰かを助けることを願って
選択リストを開くことはできませんが、クリックまたは選択したいその他のイベントで選択リストのサイズを変更することにより、選択リストを開くことができます
$("#drpdwn").mousedown(bodyevent);
function bodyevent()
{
console.log("size changed");
$(this).attr('size',3);
}
$("#drpdwn").focus(function()
{
//alert("txt clicked from ");
var $el = $("#drpdwn");
var offset = $el.offset();
var event = jQuery.Event( "mousedown", {
which: 1,
pageX: offset.left,
pageY: offset.top
});
$el.trigger(event);
});
Mousedownイベントは、クリックイベントの前に発生します。
ユーザーがドロップダウンの外側をクリックした場合、ドロップダウンを閉じるにはblurイベントとchangeイベントが必要です。
ここで、ブレンダンのコードを使用した完全なソリューション:
(function ($) {
var open = {}
$.fn.IELongDropDown = function (cln) {
if (jQuery.browser.msie) { //only IE has problems with long select boxes
var el = this;
var id = el.attr('id');
var margin = 2; //Need to set a margin however the arrow is cut
var previousWidth = el.width() + margin;
var divWrapper = "<div style='padding:0;margin:0;overflow:hidden;width:" + previousWidth + "px'></div>";
el.wrap(divWrapper);
var newWidth = el.width("auto").width();
el.width(previousWidth);
if (newWidth > previousWidth) {
el.mousedown(function () {
if (!open[id]) {
el.width("auto");
el.focus();
}
});
el.click(function () {
if (!open[id])
open[id] = true;
else {
open[id] = false;
return el.width(previousWidth);
}
});
el.blur(function () {
open[id] = false;
return el.width(previousWidth);
});
el.change(function () {
open[id] = false;
return el.width(previousWidth);
});
}
}
return this;
};
})(jQuery);
関数を呼び出します:
<script type="text/javascript" language="javascript">
$(document).ready(function () {
$('#mydropdownlist').IELongDropDown();
});
</script>
CSSをCSSファイルに設定してから「addClass」を設定したいのですが、それでもコード(部分)は
$('select').blur(function(){
$(this).css({
'position' : 'relative',
'width' : original_width
});
});
$('select').blur(function(){
$(this).css({
'position' : 'relative',
'width' : original_width
});
});
重複しているようです
私はそれを作ります:
$('select').blur().css({
'position' : 'relative',
'width' : original_width
});
.change()イベントで.blur()が本当に必要かどうかわからない(問題を解決できるかどうかを確認してみてください... IE問題はないようです。