用HTML写用户界面的好处之一是当页面内容较多时,用户可以通过浏览器的搜索功能快速定位,而不用紧盯着屏幕来回拉动滚动条寻找,但<select>产生的下拉菜单是个例外--浏览器的搜索功能搜索不到菜单里的内容。看这个网页:
在这个网页上进行选择简直是损害健康。我认为<select>里的选项以不超过10项为宜,如果有很多选项怎么办呢?有两种解决办法:
方法-:将选项分类,然后分层选择。比如要让用户选择一个省份,可以先将所有的省份分为“东北”,“华北”,“东南”,“中南”,“西南”,“西北”几片区,放在第一个<select>里,然后用Javascript根据片区的选择,在第二个<select>里产生省份选项。
办法二:用<div>元素和Javascript模拟出一个下拉菜单,让浏览器可以搜索到选项。我的sterilize_select.js就是一个尝试。使用的时候在网页里照常写<select>,只需在<body>的onload里加上这么一句:
sterilize_select(document.getElementById(<<select>元素的id>))
经过无害化处理的下拉菜单是搜索友好的:
sterilize_select.js的无害化处理不会改变<select>在<form>提交时的行为,即<form>提交时,原先<select>产生的内容还是照常的。
下面是代码:
function sterilize_select(sel)
{
// auxillary functions
function make(tag) { return document.createElement(tag); }
// get the position and size of the original <select>
var height = sel.offsetHeight;
var width = sel.offsetWidth;
var left = sel.offsetLeft;
var top= sel.offsetTop;
var dropdown=make("button");
var box=make("div");
var selected=make("span");
box.appendChild(selected);
box.appendChild(dropdown);
document.body.appendChild(box);
// set the new control's bounding box to the original <select>'s position and size
box.style.position = "absolute";
box.style.borderWidth = "1px";
box.style.borderStyle = "solid";
box.style.left = ""+left+"px";
box.style.top = ""+top+"px";
box.style.width = ""+width+"px";
box.style.height = ""+height+"px";
selected.style.position = "absolute";
selected.style.left = "0px";
selected.style.top = "0px";
selected.style.height = box.style.height;
selected.style.width = ""+(box.offsetWidth-dropdown.offsetWidth)+"px";
dropdown.textContent="v";
dropdown.style.paddingLeft="0px";
dropdown.style.paddingRight="0px";
dropdown.style.position = "absolute";
dropdown.style.height = box.style.height;
dropdown.style.left = ""+(box.offsetWidth-dropdown.offsetWidth)+"px";
dropdown.style.top = "0px";
dropdown.onclick = function() {
var select = DoSelect();
var t = dropdown.onclick;
dropdown.onclick = function() {
document.body.removeChild(select);
dropdown.onclick = t;
}
}
// show the select menu
function DoSelect()
{
var divBox = make("div");
var divSelect = make("div");
// enumerate the options
for (var i=0; i<sel.length; i++) {
var s = make("span");
var opt = sel.options[i];
s.textContent = opt.text;
var d = make("div");
if (opt.selected) {
d.style.backgroundColor = "blue";
d.style.color = "white";
}
d.appendChild(s);

d.onclick = (function(idx) {
return function() {
sel.selectedIndex = idx;
Sync();
dropdown.onclick();
}
})(i);
divSelect.appendChild(d);
}
divBox.style.borderStyle="solid";
divBox.style.backgroundColor="#ccc";
divBox.style.borderWidth="1px";
divBox.style.position = "absolute";
divBox.style.left = ""+sel.offsetLeft+"px";
divBox.style.top = ""+(sel.offsetTop+sel.offsetHeight)+"px";
divBox.style.height = ""+sel.clientHeight+"px";
divBox.style.width =""+Math.max(sel.offsetWidth, sel.clientWidth)+"px";
divBox.style.overflow = "auto";
divBox.appendChild(divSelect);
document.body.appendChild(divBox);
return divBox;
}
function Sync()
{
selected.textContent = sel.options[sel.selectedIndex].text;
}
Sync();
sel.style.visibility="hidden";
}
以及测试的网页:
<html>
<header>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<script src="sterilize_select.js"></script>
</header>
<body onload="sterilize_select(document.getElementById('favlang'));">
<form method="post" action="select">
<div>Choose your favorite language:</div>
<select name="favlang" id="favlang">
<option value="fs">F#</option>
<option value="cs">C#</option>
<option value="vb">Visual Basic .NET</option>
<option value="boo">Boo</option>
<option value="java">Java</option>
<option value="js">Javascript</option>
<option value="posh">PowerShell</option>
<option value="ocaml">OCaml</option>
<option value="groovy">Groovy</option>
<option value="actionscript">ActionScript</option>
<option value="es4">Ecma Script 4</option>
<option value="ml">ML</option>
<option value="miranda">Miranda</option>
<option value="lisp">Lisp</option>
<option value="scheme">Scheme</option>
<option value="erlang">Erlang</option>
<option value="perl">Perl</option>
<option value="py">Python</option>
<option value="ruby">Ruby</option>
<option value="smalltalk">SmallTalk</option>
<option value="setl">SETL</option>
<option value="apl">APL</option>
<option value="c">C</option>
<option value="cpp">C++</option>
<option value="fortran">Fortran</option>
<option value="forth">Forth</option>
<option value="asm">Assembly</option>
<option value="z">Z</option>
<option value="e">E</option>
<option value="scala">Scala</option>
<option value="haskell">Haskell</option>
<option value="d">D</option>
<option value="prolog">Prolog</option>
<option value="lua">Lua</option>
<option value="io">Io</option>
<option value="ada">Ada</option>
<option value="squeak">Squeak</option>
<option value="pascal">Pascal</option>
<option value="delphi">Delphi</option>
<option value="php">PHP</option>
</select>
<br />
<input type="submit"></input>
</form>
</body>
<html>

浙公网安备 33010602011771号