<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont

本文涉及的产品
转发路由器TR,750小时连接 100GB跨地域
简介: 不少时候在页面中为了布局的需要,下拉列表的宽度需要设成比较小的值,这时如果恰巧它包含的选择项的内容比较长,那么超出select宽度的部分将会被截断,如果option显示的内容又比较重要,必须完整地展现出来,或者你是个完美主义者,那这就成了一个不大不小的问题了。
不少时候在页面中为了布局的需要,下拉列表<select>的宽度需要设成比较小的值,这时如果恰巧它包含的选择项<option>的内容比较长,那么超出select宽度的部分将会被截断,如果option显示的内容又比较重要,必须完整地展现出来,或者你是个完美主义者,那这就成了一个不大不小的问题了。

在IE7+、Firefox中,由于支持了<option>的title属性,我们可以想办法给option标记设置title属性(内容可以与显示的值相同或者不同)。如果是已经做好的页面,不想再做太多改动,可以用下面的脚本,自动遍历页面上的所有<select>,给所有的option加上与text相同的title。
function  SetOptionTitle()
{
    
var selects = document.getElementsByTagName("select");
    
if (selects.length > 0)
    
{
        
for (var i = 0; i < selects.length; i++)
        
{
            
var options = selects[i].options;
            
if (selects[i].options.length > 0)
            
{
                
for (var j = 0; j < options.length; j++)
                
{
                    
if (options[j].title == "")
                        options[j].title 
= options[j].text;
                }

            }

        }

    }

}
很不幸的是,IE6并不支持<option>的title属性,这一方法在IE6下完全无效!鉴于目前的浏览器市场状况,我们还不得不尽力兼容IE6,所以只能另想其它办法。

我目前想到的办法是:当鼠标悬停到<select>时,创建一个这个下拉列表的副本,同时把焦点移到这个副本上,把副本的样式设成绝对定位,而且盖在原来的下拉列表上,宽度根据option的显示内容自动拉伸,当这个副本失去焦点,或者用户对它进行了选择操作后,获取副本的selectedIndex,赋给原来的select对象。具体代码如下:
复制代码
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
< html  xmlns ="http://www.w3.org/1999/xhtml" >

< head >
< meta  http-equiv ="Content-Type"  content ="text/html; charset=utf-8"   />
< title ></ title >
< script  type ="text/javascript" >
function  FixWidth(selectObj)
{
    
var  newSelectObj  =  document.createElement( " select " );
    newSelectObj 
=  selectObj.cloneNode( true );
    newSelectObj.selectedIndex 
=  selectObj.selectedIndex;
    newSelectObj.onmouseover 
=   null ;
    
    
var  e  =  selectObj;
    
var  absTop  =  e.offsetTop;
    
var  absLeft  =  e.offsetLeft;
    
while (e  =  e.offsetParent)
    {
        absTop 
+=  e.offsetTop;
        absLeft 
+=  e.offsetLeft;
    }
    
with  (newSelectObj.style)
    {
        position 
=   " absolute " ;
        top 
=  absTop  +   " px " ;
        left 
=  absLeft  +   " px " ;
        width 
=   "auto" ;
    }
    
    
var  rollback  =   function (){ RollbackWidth(selectObj, newSelectObj); };
    
if (window.addEventListener)
    {
        newSelectObj.addEventListener(
" blur " , rollback,  false );
        newSelectObj.addEventListener(
" change " , rollback,  false );
    }
    
else
    {
        newSelectObj.attachEvent(
" onblur " , rollback);
        newSelectObj.attachEvent(
" onchange " , rollback);
    }
    
    selectObj.style.visibility 
=   " hidden " ;
    document.body.appendChild(newSelectObj);
    newSelectObj.focus();
}

function  RollbackWidth(selectObj, newSelectObj)
{
    selectObj.selectedIndex 
=  newSelectObj.selectedIndex;
    selectObj.style.visibility 
=   " visible " ;
    document.body.removeChild(newSelectObj);
}
</ script >
</ head >

< body >

< form  method ="post" >
    
< div  style ="width:100px; height:100px; margin:100px; padding:10px; background:gray;" >
        
< select  name ="Select1"  style ="width:80px;"  onmouseover ="FixWidth(this)" >
            
< option  id ="A"  title ="this is A" > AAAAAAAAAAAAAAA </ option >
            
< option  id ="B"  title ="this is B" > BBBBBBBBBBBBBBB </ option >
            
< option  id ="C"  title ="this is C" > CCCCCCCCCCCCCCC </ option >
        
</ select >
    
</ div >
</ form >

</ body >

</ html >
复制代码

有了这个demo,我们就可以把其中的js提取出来,应用到项目中需要的地方了。

目前这种方式是给select注册了onmouseover,对于鼠标操作是没什么问题,如果用户是按tab键移动焦点就无效了。估计实际应用中这样的情形不会很多,所以暂不考虑,有兴趣的朋友可以再完善一下,或者看看有没有更好的解决方法。


转自:http://www.cnblogs.com/key/archive/2008/05/17/1201274.html


相关文章
|
Web App开发 前端开发 Java
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
 Connection reset by peer的常见原因: 1)服务器的并发连接数超过了其承载量,服务器会将其中一些连接关闭;    如果知道实际连接服务器的并发客户数没有超过服务器的承载量,看下有没有网络流量异常。
857 0
|
Web App开发 存储 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
NoSuchObjectException(message:There is no database named cloudera_manager_metastore_canary_test_db_hive_hivemetastore_df61080e04cd7eb36c4336f71b5a8bc4) at org.
1079 0
|
Web App开发 前端开发 数据库
|
Web App开发 前端开发 关系型数据库
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
mysql修改表、字段、库的字符集 修改数据库字符集: ALTER DATABASE db_name DEFAULT CHARACTER SET character_name [COLLATE .
708 0
|
Web App开发 前端开发 Java
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
Changing Hive Dynamic Partition Limits Symptoms: Hive enforces limits on the number of dynamic partitions that it creates.
1025 0
|
Web App开发 前端开发 大数据
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
一、概述   多维数据模型是最流行的数据仓库的数据模型,多维数据模型最典型的数据模式包括星型模式、雪花模式和事实星座模式,本文以实例方式展示三者的模式和区别。
759 0
|
Web App开发 监控 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
Spark Streaming 的一些问题,做选型前关注这些问题可以有效的降低使用风险。 checkpoint checkpoint 是个很好的恢复机制。
935 0
|
Web App开发 前端开发 Linux
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
nproc是操作系统级别对每个用户创建的进程数的限制,在Linux下运行多线程时,每个线程的实现其实是一个轻量级的进程,对应的术语是:light weight process(LWP)。
1152 0
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
关于reduce边join,其最重要的是使用MultipleInputs.addInputPath这个api对不同的表使用不同的Map,然后在每个Map里做一下该表的标识,最后到了Reduce端再根据标识区分对应的表! ...
784 0
|
Web App开发 Java
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
                                                                                序列化对单例的破坏 本文将通过实例+阅读Java源码的方式介绍序列化是如何破坏单例模式的,以及如何避免序列化对单例的破坏。
930 0