js+CSS 实现可以编辑的下拉列表框

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>可以编辑的下拉列表框实现 - 分享JavaScript</title>
    <style type="text/css">
    
    .selectBoxArrow{
        margin-top:1px;
        float:left;
        position:absolute;
        right:1px;
        

    }    
    .selectBoxInput{
        border:0px;
        padding-left:1px;
        height:16px;
        position:absolute;
        top:0px;
        left:0px;
    }

    .selectBox{
        border:1px solid #7f9db9;
        height:20px;    
    
    }
    .selectBoxOptionContainer{
        position:absolute;
        border:1px solid #7f9db9;
        height:100px;
        background-color:#FFF;
        left:-1px;
        top:20px;
        visibility:hidden;
        overflow:auto;
    }
    .selectBoxAnOption{
        font-family:arial;
        font-size:12px;
        cursor:default;
        margin:1px;
        overflow:hidden;
        white-space:nowrap;
    }
    .selectBoxIframe{
        position:absolute;
        background-color:#FFF;
        border:0px;
        z-index:999;
    }    
    </style>
    <script type="text/javascript">
    /************************************************************************************************************
    Editable select
    Copyright (C) September 2005  DTHMLGoodies.com, Alf Magne Kalleland
    
    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.
    
    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.
    
    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
    
    Dhtmlgoodies.com., hereby disclaims all copyright interest in this script
    written by Alf Magne Kalleland.
    
    Alf Magne Kalleland, 2006
    Owner of DHTMLgoodies.com
        
    ************************************************************************************************************/    

    
    // Path to arrow images
    var arrowImage = 'images/select_arrow.gif';    // Regular arrow
    var arrowImageOver = 'images/select_arrow_over.gif';    // Mouse over
    var arrowImageDown = 'images/select_arrow_down.gif';    // Mouse down

    
    var selectBoxIds = 0;
    var currentlyOpenedOptionBox = false;
    var editableSelect_activeArrow = false;
    

    
    function selectBox_switchImageUrl()
    {
        if(this.src.indexOf(arrowImage)>=0){
            this.src = this.src.replace(arrowImage,arrowImageOver);    
        }else{
            this.src = this.src.replace(arrowImageOver,arrowImage);
        }
        
        
    }
    
    function selectBox_showOptions()
    {
        if(editableSelect_activeArrow && editableSelect_activeArrow!=this){
            editableSelect_activeArrow.src = arrowImage;
            
        }
        editableSelect_activeArrow = this;
        
        var numId = this.id.replace(/[^d]/g,'');
        var optionDiv = document.getElementById('selectBoxOptions' + numId);
        if(optionDiv.style.display=='block'){
            optionDiv.style.display='none';
            if(navigator.userAgent.indexOf('MSIE')>=0)document.getElementById('selectBoxIframe' + numId).style.display='none';
            this.src = arrowImageOver;    
        }else{            
            optionDiv.style.display='block';
            if(navigator.userAgent.indexOf('MSIE')>=0)document.getElementById('selectBoxIframe' + numId).style.display='block';
            this.src = arrowImageDown;    
            if(currentlyOpenedOptionBox && currentlyOpenedOptionBox!=optionDiv)currentlyOpenedOptionBox.style.display='none';    
            currentlyOpenedOptionBox= optionDiv;            
        }
    }
    
    function selectOptionValue()
    {
        var parentNode = this.parentNode.parentNode;
        var textInput = parentNode.getElementsByTagName('INPUT')[0];
        textInput.value = this.innerHTML;    
        this.parentNode.style.display='none';    
        document.getElementById('arrowSelectBox' + parentNode.id.replace(/[^d]/g,'')).src = arrowImageOver;
        
        if(navigator.userAgent.indexOf('MSIE')>=0)document.getElementById('selectBoxIframe' + parentNode.id.replace(/[^d]/g,'')).style.display='none';
        
    }
    var activeOption;
    function highlightSelectBoxOption()
    {
        if(this.style.backgroundColor=='#316AC5'){
            this.style.backgroundColor='';
            this.style.color='';
        }else{
            this.style.backgroundColor='#316AC5';
            this.style.color='#FFF';            
        }    
        
        if(activeOption){
            activeOption.style.backgroundColor='';
            activeOption.style.color='';            
        }
        activeOption = this;
        
    }
    
    function createEditableSelect(dest)
    {

        dest.className='selectBoxInput';        
        var div = document.createElement('DIV');
        div.style.styleFloat = 'left';
        div.style.width = dest.offsetWidth + 16 + 'px';
        div.style.position = 'relative';
        div.id = 'selectBox' + selectBoxIds;
        var parent = dest.parentNode;
        parent.insertBefore(div,dest);
        div.appendChild(dest);    
        div.className='selectBox';
        div.style.zIndex = 10000 - selectBoxIds;

        var img = document.createElement('IMG');
        img.src = arrowImage;
        img.className = 'selectBoxArrow';
        
        img.onmouseover = selectBox_switchImageUrl;
        img.onmouseout = selectBox_switchImageUrl;
        img.onclick = selectBox_showOptions;
        img.id = 'arrowSelectBox' + selectBoxIds;

        div.appendChild(img);
        
        var optionDiv = document.createElement('DIV');
        optionDiv.id = 'selectBoxOptions' + selectBoxIds;
        optionDiv.className='selectBoxOptionContainer';
        optionDiv.style.width = div.offsetWidth-2 + 'px';
        div.appendChild(optionDiv);
        
        if(navigator.userAgent.indexOf('MSIE')>=0){
            var iframe = document.createElement('<IFRAME src="about:blank" frameborder=0>');
            iframe.style.width = optionDiv.style.width;
            iframe.style.height = optionDiv.offsetHeight + 'px';
            iframe.style.display='none';
            iframe.id = 'selectBoxIframe' + selectBoxIds;
            div.appendChild(iframe);
        }
        
        if(dest.getAttribute('selectBoxOptions')){
            var options = dest.getAttribute('selectBoxOptions').split(';');
            var optionsTotalHeight = 0;
            var optionArray = new Array();
            for(var no=0;no<options.length;no++){
                var anOption = document.createElement('DIV');
                anOption.innerHTML = options[no];
                anOption.className='selectBoxAnOption';
                anOption.onclick = selectOptionValue;
                anOption.style.width = optionDiv.style.width.replace('px','') - 2 + 'px'; 
                anOption.onmouseover = highlightSelectBoxOption;
                optionDiv.appendChild(anOption);    
                optionsTotalHeight = optionsTotalHeight + anOption.offsetHeight;
                optionArray.push(anOption);
            }
            if(optionsTotalHeight > optionDiv.offsetHeight){                
                for(var no=0;no<optionArray.length;no++){
                    optionArray[no].style.width = optionDiv.style.width.replace('px','') - 22 + 'px';     
                }    
            }        
            optionDiv.style.display='none';
            optionDiv.style.visibility='visible';
        }
        
        selectBoxIds = selectBoxIds + 1;
    }    
    
    </script>

</head>
<body>
<form>
<table border="0">
    <tr>
        <td>Where do you come from?</td>
        <td><input type="text" name="myText" value="Norway" selectBoxOptions="Canada;Denmark;Finland;Germany;Mexico;Norway;Sweden;United Kingdom;United States"></td>
    </tr>
    <tr>
        <td>What is your name?</td>
        <td><input type="text" name="myText2" value="" selectBoxOptions="Amy;Andrew;Carol;Jennifer;Jim;Tim;Tommy;Vince"></td>
    </tr>
</table>
<p>I.e.: A combination of text- and selectbox. You can type in a value or choose from the list</p>
</form>

<script type="text/javascript">
createEditableSelect(document.forms[0].myText);
createEditableSelect(document.forms[0].myText2);
</script>

</body>
</html>
View Code
原文地址:https://www.cnblogs.com/lltse/p/3246224.html