DropDownList里包含一个ListItemCollection
ListItemCollection集合中包含的ListItem对象只有value、text、Selected属性,更本无法专载图片。而且ListItem对象不支持继承。我想做这样的控件也想不到办法。

解决方案 »

  1.   

    try it
    <html>
    <head>
    <title>无标题文档</title>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    </head><body bgcolor="#FFFFFF" text="#000000">
    <table cellspacing=0 cellpadding=0 width="92%" border=0 dwcopytype="CopyTableRow">
      <tbody> 
      <tr valign=bottom> 
        <td align=middle> 
          <style>.select {
    BORDER-RIGHT: buttonface 0px inset; BORDER-TOP: buttonface 0px inset; FONT: icon; BORDER-LEFT: buttonface 0px inset; WIDTH: 100px; CURSOR: default; LINE-HEIGHT: 10pt; BORDER-BOTTOM: buttonface 0px inset
    }
    .selected {
    BORDER-RIGHT: buttonface 0px inset; PADDING-RIGHT: 0px; BORDER-TOP: buttonface 0px inset; PADDING-LEFT: 0px; BACKGROUND: window; PADDING-BOTTOM: 0px; FONT: icon; BORDER-LEFT: buttonface 0px inset; LINE-HEIGHT: 10pt; PADDING-TOP: 0px; BORDER-BOTTOM: buttonface 0px inset
    }
    .selectTable {
    BORDER-RIGHT: buttonhighlight 2px inset; BORDER-TOP: buttonhighlight 2px inset; BACKGROUND: buttonface; BORDER-LEFT: buttonhighlight 2px inset; WIDTH: 100%; LINE-HEIGHT: 10pt; BORDER-BOTTOM: buttonhighlight 2px inset; HEIGHT: 100%
    }
    .option {
    PADDING-RIGHT: 3px; PADDING-LEFT: 3px; PADDING-BOTTOM: 1px; FONT: icon; WIDTH: 100%; PADDING-TOP: 1px
    }
    .dropDown {
    BORDER-RIGHT: windowtext 1px solid; PADDING-RIGHT: 0px; BORDER-TOP: windowtext 1px solid; PADDING-LEFT: 0px; BACKGROUND: window; VISIBILITY: hidden; PADDING-BOTTOM: 0px; BORDER-LEFT: windowtext 1px solid; WIDTH: 100%; LINE-HEIGHT: 10pt; PADDING-TOP: 0px; BORDER-BOTTOM: windowtext 1px solid; POSITION: absolute
    }
    .select .button {
    BORDER-RIGHT: buttonhighlight 2px outset; PADDING-RIGHT: 0px; BORDER-TOP: buttonhighlight 2px outset; PADDING-LEFT: 0px; FONT-SIZE: 11px; PADDING-BOTTOM: 0px; BORDER-LEFT: buttonhighlight 2px outset; WIDTH: 16px; LINE-HEIGHT: 10pt; PADDING-TOP: 0px; BORDER-BOTTOM: buttonhighlight 2px outset; FONT-FAMILY: webdings; HEIGHT: 5px
    }
    </style>
          <table cellspacing=0 cellpadding=0 width=80 align=center 
                bgcolor=#ffffff border=0>
            <tbody> 
            <tr> 
              <td class=t> 
                <script language=JavaScript>var overOptionCss = "background: highlight; color: highlighttext"; 
    var sizedBorderCss = "2 inset buttonhighlight"; var globalSelect; //This is used when calling an unnamed selectbox with onclick="this.PROPERTY" var ie4 = (document.all != null); var q = 0; 
    function initSelectBox(el) { 
    copySelected(el); var size = el.getAttribute("size"); // These two lines combined with execution in optionClick() allow you to write: 
    // onchange="alert(this.options[this.selectedIndex].value)" 
    el.options = el.children[1].children; 
    el.selectedIndex = findSelected(el); //Set the index now! 
    // Some methods that are supported on the real SELECT box 
    el.remove = new Function("i", "int_remove(this,i)"); 
    el.item = new Function("i", "return this.options[i]"); 
    el.add = new Function("e", "i", "int_add(this, e, i)"); 
    // The real select box let you have lot of options with the same NAME. In that case the item 
    // needs two arguments. When using DIVs you can't have two with the same NAME (or ID) and 
    // then there is no need for the second argument el.options[el.selectedIndex].selected = true; dropdown = el.children[1]; if (size != null) { 
    if (size > 1) { 
    el.size = size; 
    dropdown.style.zIndex = 0; 
    initSized(el); 

    else { 
    el.size = 1; 
    dropdown.style.zIndex = 99; 
    if (dropdown.offsetHeight > 400) { 
    dropdown.style.height = "400"; 
    dropdown.style.overflow = "auto"; 


    } highlightSelected(el,true); 
    } function int_remove(el,i) { 
    if (el.options[i] != null) 
    el.options[i].outerHTML = ""; 
    } function int_add(el, e, i) { 
    var html = "<div class='option' noWrap"; 
    if (e.value != null) 
    html += " value='" + e.value + "'"; 
    if (e.style.cssText != null) 
    html += " style='" + e.style.cssText + "'"; 
    html += ">"; 
    if (e.text != null) 
    html += e.text; 
    html += "</div>" if ((i == null) || (i >= el.options.length)) 
    i = el.options.length-1; el.options[i].insertAdjacentHTML("AfterEnd", html); 
    } function initSized(el) { 
    //alert("initSized -------->"); 
    var h = 0; 
    el.children[0].style.display = "none"; dropdown = el.children[1]; 
    dropdown.style.visibility = "visible"; if (dropdown.children.length > el.size) { 
    dropdown.style.overflow = "auto"; 
    for (var i=0; i<el.size; i++) { 
    h += dropdown.children[i].offsetHeight; 
    } if (dropdown.style.borderWidth != null) { 
    dropdown.style.pixelHeight = h + 4; //2 * parseInt(dropdown.style.borderWidth); 
    } else 
    dropdown.style.height = h; } dropdown.style.border = sizedBorderCss; 
    el.style.height = dropdown.style.pixelHeight; 
    } function copySelected(el) { 
    var selectedIndex = findSelected(el); selectedCell = el.children[0].rows[0].cells[0]; 
    selectedDiv = el.children[1].children[selectedIndex]; selectedCell.innerHTML = selectedDiv.outerHTML; 
    } // This function returns the first selected option and resets the rest 
    // in case some idiot has set more than one to selcted :-) 
    function findSelected(el) { 
    var selected = null; 
    ec = el.children[1].children; //the table is the first child 
    var ecl = ec.length; for (var i=0; i<ecl; i++) { 
    if (ec[i].getAttribute("selected") != null) { 
    if (selected == null) { // Found first selected 
    selected = i; 

    else 
    ec[i].removeAttribute("selected"); //Like I said. Only one selected! 


    if (selected == null) 
    selected = 0; //When starting this is the most logic start value if none is present return selected; 
    } function toggleDropDown(el) { 
    if (el.size == 1) { 
    dropDown = el.children[1]; if (dropDown.style.visibility == "") 
    dropDown.style.visibility = "hidden"; if (dropDown.style.visibility == "hidden") 
    showDropDown(dropDown); 
    else 
    hideDropDown(dropDown); 

    }
      

  2.   

    ...and...
    _________________________________function optionClick() { 
    el = getReal(window.event.srcElement, "className", "option"); if (el.className == "option") { 
    dropdown = el.parentElement; 
    selectBox = dropdown.parentElement; oldSelected = dropdown.children[findSelected(selectBox)] if(oldSelected != el) { 
    oldSelected.removeAttribute("selected"); 
    el.setAttribute("selected", 1); 
    selectBox.selectedIndex = findSelected(selectBox); 
    } if (selectBox.onchange != null) { // This executes the onchange when you chnage the option 
    if (selectBox.id != "") { // For this to work you need to replace this with an ID or name 
    eval(selectBox.onchange.replace(/this/g, selectBox.id)); 

    else { 
    globalSelect = selectBox; 
    eval(selectBox.onchange.replace(/this/g, "globalSelect")); 

    } if (el.backupCss != null) 
    el.style.cssText = el.backupCss; 
    copySelected(selectBox); 
    toggleDropDown(selectBox); 
    highlightSelected(selectBox, true); 

    } function optionOver() { 
    var toEl = getReal(window.event.toElement, "className", "option"); 
    var fromEl = getReal(window.event.fromElement, "className", "option"); 
    if (toEl == fromEl) return; 
    var el = toEl; if (el.className == "option") { 
    if (el.backupCss == null) 
    el.backupCss = el.style.cssText; 
    highlightSelected(el.parentElement.parentElement, false); 
    el.style.cssText = el.backupCss + "; " + overOptionCss; 
    this.highlighted = true; 

    } function optionOut() { 
    var toEl = getReal(window.event.toElement, "className", "option"); 
    var fromEl = getReal(window.event.fromElement, "className", "option"); if (fromEl == fromEl.parentElement.children[findSelected(fromEl.parentElement.parentElement)]) { 
    if (toEl == null) 
    return; 
    if (toEl.className != "option") 
    return; 
    } if (toEl != null) { 
    if (toEl.className != "option") { 
    if (fromEl.className == "option") 
    highlightSelected(fromEl.parentElement.parentElement, true); 

    } if (toEl == fromEl) return; 
    var el = fromEl; if (el.className == "option") { 
    if (el.backupCss != null) 
    el.style.cssText = el.backupCss; 
    } } function highlightSelected(el,add) { 
    var selectedIndex = findSelected(el); selected = el.children[1].children[selectedIndex]; if (add) { 
    if (selected.backupCss == null) 
    selected.backupCss = selected.style.cssText; 
    selected.style.cssText = selected.backupCss + "; " + overOptionCss; 

    else if (!add) { 
    if (selected.backupCss != null) 
    selected.style.cssText = selected.backupCss; 


      

  3.   

    ...and...
    _______________________________________________________---function hideShownDropDowns() { 
    var el = getReal(window.event.srcElement, "className", "select"); var spans = document.all.tags("SPAN"); 
    var selects = new Array(); 
    var index = 0; for (var i=0; i<spans.length; i++) { 
    if ((spans[i].className == "select") && (spans[i] != el)) { 
    dropdown = spans[i].children[1]; 
    if ((spans[i].size == 1) && (dropdown.style.visibility == "visible")) 
    selects[index++] = dropdown; 

    } for (var j=0; j<selects.length; j++) { 
    hideDropDown(selects[j]); 
    } } function hideDropDown(el) { 
    if (typeof(fade) == "function") 
    fade(el, false); 
    else 
    el.style.visibility = "hidden"; 
    } function showDropDown(el) { 
    if (typeof(fade) == "function") 
    fade(el, true); 
    else if (typeof(swipe) == "function") 
    swipe(el, 2); 
    else 
    el.style.visibility = "visible"; 
    } function initSelectBoxes() { 
    var spans = document.all.tags("SPAN"); 
    var selects = new Array(); 
    var index = 0; for (var i=0; i<spans.length; i++) { 
    if (spans[i].className == "select") 
    selects[index++] = spans[i]; 
    } for (var j=0; j<selects.length; j++) { 
    initSelectBox(selects[j]); 

    } function getReal(el, type, value) { 
    temp = el; 
    while ((temp != null) && (temp.tagName != "BODY")) { 
    if (eval("temp." + type) == value) { 
    el = temp; 
    return el; 

    temp = temp.parentElement; 

    return el; 
    } if (ie4) { 
    window.onload = initSelectBoxes; 
    document.onclick = hideShownDropDowns; 
    } function writeSelectBox(matrix, id, size, onchange, css) { 
    var d = window.document; var ie4 = (document.all != null); if (ie4) { 
    // alert("Before!"); 
    var s = createIEString(matrix, id, size, onchange, css); 
    document.write(s); 
    // alert("After!"); 
    // alert(s); 
    } else { 
    document.write(createXString(matrix, id, size, onchange, css)); 

    } function createIEString(matrix, id, size, onchange, css) { 
    var str = ""; 
    // Span startTag 
    str += '<span class="select"'; 
    if (size == null) 
    size = 1; 
    str += ' size="' + size + '"'; 
    if (id != null) 
    str += ' id="' + id + '"'; 
    if (onchange != null) 
    str += ' onchange="' + onchange + '"'; 
    if (css != null) 
    str += ' style="' + css + '"'; 
    str += '>\n'; // Table Tag 
    str += '<table class="selectTable" cellspacing="0" cellpadding="0"\n'; 
    str += ' onclick="toggleDropDown(this.parentElement)">\n'; 
    str += '<tr>\n'; 
    str += '<td class="selected"> </td>\n'; 
    str += '<td align="CENTER" valign="MIDDLE" class="Button"\n'; 
    str += ' onmousedown="this.style.border=\'2 inset buttonhighlight\'"\n'; 
    str += ' onmouseup="this.style.border=\'2 outset buttonhighlight\'">\n'; 
    str += '<div style="position: relative; left: 0; top: -2; width: 100%;">6</div></td>\n'; 
    str += '</tr>\n'; 
    str += '</table>\n'; // DropDown startTag 
    str += '<div class="dropDown" onclick="optionClick()" onmouseover="optionOver()" onmouseout="optionOut()">\n'; for (var i=0; i<matrix.length; i++) { 
    html = matrix[i].html; 
    value = matrix[i].value; 
    css = matrix[i].css; 
    selected = matrix[i].selected; // Write option starttag 
    str += '<div class="option"'; 
    if (value != null) 
    str += ' value="' + value + '"'; 
    if (css != null) 
    str += ' style="' + css + '"'; 
    if (selected != null) 
    str += ' selected'; 
    str += '>\n'; // Write HTML contents 
    str += html; 
    // Write end tag 
    str += '</div>\n'; 
    } //DropDown endtag 
    str += '</div>\n'; // Span endTag 
    str += '</span>\n'; 
    //alert(str);
    return str; 
    } function createXString(matrix, id, size, onchange, css) { 
    // var str = "\n"; 
    // form startTag 
    var str = '<form>\n'; 
    // Select startTag 
    str += '<select'; 
    if (size == null) 
    size = 1; 
    str += ' size="' + size + '"'; 
    if (id != null) 
    str += ' id="' + id + '"'; 
    if (onchange != null) 
    str += ' onchange="' + onchange + '"'; 
    // if (css != null) 
    // str += ' style="' + css + '"'; 
    str += '>\n'; 
    // write options 
    for (var i=0; i<matrix.length; i++) { 
    html = matrix[i].html; 
    value = matrix[i].value; 
    css = matrix[i].css; 
    selected = matrix[i].selected; // Write option starttag 
    str += '\n<option'; 
    if (value != null) 
    str += ' value="' + value + '"'; 
    // if (css != null) 
    // str += ' style="' + css + '"'; 
    if (selected != null) 
    str += ' selected'; 
    str += '>'; // Write HTML contents 
    str += stripTags(html); 
    // Write end tag 
    str += '</option>\n'; 

    str += '\n</select>\n'; 
    str += '</form>\n'; return str; 
    } function stripTags(str) { 
    var s = 0; 
    var e = -1; 
    var r = ""; s = str.indexOf("<",e); do { 
    r += str.substring(e + 1,s); 
    e = str.indexOf(">",s); 
    s = str.indexOf("<",e); 

    while ((s != -1) && (e != -1)) r += str.substring(e + 1,str.length); return r; 
    } function Option(html, value, css, selected) { 
    this.html = html; 
    this.value = value; 
    this.css = css; 
    this.selected = selected; 
    } topArray = new Array(); 
    topArray[0] = new Option('<nobr title="选择地点">选择地点</nobr>', "#"); 
    topArray[1] = new Option('<nobr title="全国">全国</nobr>', "/default-qz.aspx"); 
    topArray[2] = new Option('<nobr title="北京">北京</nobr>', "/default-bj.aspx"); 
    topArray[3] = new Option('<nobr title="上海">上海</nobr>', "/default-sh.aspx"); 
    topArray[4] = new Option('<nobr title="广州">广州</nobr>', "/default-gz.aspx"); 
    topArray[5] = new Option('<nobr title="深圳">深圳</nobr>', "/default-sz.aspx"); 
    topArray[6] = new Option('<nobr title="西安">西安</nobr>', "/default-xa.aspx"); 
    topArray[7] = new Option('<nobr title="武汉">武汉</nobr>', "/default-wh.aspx"); 
    topArray[8] = new Option('<nobr title="杭州">杭州</nobr>', "/default-hz.aspx"); 
    topArray[9] = new Option('<nobr title="成都">成都</nobr>', "/default-cd.aspx"); 
    topArray[10] = new Option('<nobr title="南京">南京</nobr>', "/default-nj.aspx"); 
    topArray[11] = new Option('<nobr title="昆明">昆明</nobr>', "/default-km.aspx"); 
    topArray[12] = new Option('<nobr title="济南">济南</nobr>', "/default-jn.aspx"); 
    topArray[13] = new Option('<nobr title="大连"><img border=0 src=http://expert.csdn.net/expert/images/rank/user1.gif>大连</nobr>', "/default-dl.aspx"); writeSelectBox(topArray, "select2", 1, "window.open(this.options[this.selectedIndex].value, '_top')", "margin-left: 1; width: 80;"); 
    </script>
              </td>
            </tr>
            </tbody> 
          </table>
        </td>
        <form name=form2>
        </form>
      </tr>
      </tbody> 
    </table> 
     
    </body>
    </html>