对于HTML中的此下拉列表:
<select id="countries">
<option value="1">Country</option>
</select>
我想打开列表(与单击鼠标左键相同)。使用JavaScript(或更具体地说是jQuery)是否可能?
对于HTML中的此下拉列表:
<select id="countries">
<option value="1">Country</option>
</select>
我想打开列表(与单击鼠标左键相同)。使用JavaScript(或更具体地说是jQuery)是否可能?
Answers:
我试图找到同样的东西,但感到失望。我最终更改了选择框的属性大小,因此它似乎可以打开
$('#countries').attr('size',6);
然后当你完成
$('#countries').attr('size',1);
size
下拉列表添加属性实际上将下拉列表转换为列表框。因此它扩展了。–
我遇到了同样的问题,并且有解决方案。名为ExpandSelect()的函数可模拟鼠标在“选择”元素上的点击,它通过创建另一个<select>
绝对位置正确的元素并通过设置size
属性一次显示多个选项来实现。已在所有主要浏览器上测试:Chrome,Opera,Firefox,Internet Explorer。解释其工作原理以及此处的代码:
编辑(链接断开)。
我已经在Google Code中创建了一个项目,请在此处查找代码:
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
}
现在您可以像这样调用您的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无法“单击”元素(u可以触发附加onclick
事件,但您不能从字面上单击它)
要查看列表中的所有项目,请将列表设为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();
}
超级简单:
var state = false;
$("a").click(function () {
state = !state;
$("select").prop("size", state ? $("option").length : 1);
});
scrollIntoView
在上使用,可以轻松地解决滚动跳跃问题<select>
。
我刚刚添加
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');
}