2018

自己写的一个用js把select换成div与span与ul的东西

<!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" xml:lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title></title>
</head>
<style type="text/css" media="screen">
.none {
    display: none;
}
.seled {
    background: red;
}
ul,li {
    margin: 0;
    padding: 0;
    list-style: none;
}
div.selectDiv {
    position: relative;
    display: inline-block;
    border: 1px solid #ccc;
    width: 78px;
    font-size: 12px;
    /*line-height: 22px;*/
}
div#sel-div-sex {
    width: 200px;
}
div.selectDiv span {
    display: block;
    width: 100%;
    background: #fff url(data:image/gif;base64,R0lGODlhEQA7AMQAAPL2+c/h7bvQ3uTs8sXe5vb4+vr8/Yinu+Tr79rk6sPX5cTW43aasKS8y8jW3+3x9JKuwMnc6bbN3G2Tq////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAEQA7AAAFeiAljmRpnqgYSGzLBijhskRqKK5ipBQgsAIATwRgCYeiwQDJbDqf0KhUNKtar9eJdsvter/eqXhMLjNXVtgp4o3wFtzF0KcNIh+sR1Np7vv/U2CCg4SFhl2AiYqLJQ4OTQlaCUgIDFoMCDwFB1wHBSkQXhAoDWANjGIhADs=) scroll no-repeat right 4px;
    cursor: default;
    white-space: nowrap;
    word-break: keep-all;
    height: 16px;
    line-height: 16px;
}
div.selectDiv span:hover {
     background: #fff url(data:image/gif;base64,R0lGODlhEQA7AMQAAPL2+c/h7bvQ3uTs8sXe5vb4+vr8/Yinu+Tr79rk6sPX5cTW43aasKS8y8jW3+3x9JKuwMnc6bbN3G2Tq////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAEQA7AAAFeiAljmRpnqgYSGzLBijhskRqKK5ipBQgsAIATwRgCYeiwQDJbDqf0KhUNKtar9eJdsvter/eqXhMLjNXVtgp4o3wFtzF0KcNIh+sR1Np7vv/U2CCg4SFhl2AiYqLJQ4OTQlaCUgIDFoMCDwFB1wHBSkQXhAoDWANjGIhADs=) scroll no-repeat right -20px;
}
div.selectDiv span.open {
     background: #fff url(data:image/gif;base64,R0lGODlhEQA7AMQAAPL2+c/h7bvQ3uTs8sXe5vb4+vr8/Yinu+Tr79rk6sPX5cTW43aasKS8y8jW3+3x9JKuwMnc6bbN3G2Tq////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAEQA7AAAFeiAljmRpnqgYSGzLBijhskRqKK5ipBQgsAIATwRgCYeiwQDJbDqf0KhUNKtar9eJdsvter/eqXhMLjNXVtgp4o3wFtzF0KcNIh+sR1Np7vv/U2CCg4SFhl2AiYqLJQ4OTQlaCUgIDFoMCDwFB1wHBSkQXhAoDWANjGIhADs=) scroll no-repeat right -46px;
}
div.selectDiv ul {
    position: absolute;
    background: #fff;
    width: 100%;
    /*top: 1.2em;*/
    border: 1px solid #efcdab;
    left: -1px;
    /*z-index: 999;*/
}
div.selectDiv li {
    cursor: pointer;
    white-space: nowrap;
    word-break: keep-all;
}
div.selectDiv li:hover {
    background: #0f0;
}
</style>
<body>
<div style="z-index: 1;">
    <select name="birthday" id="birthday">
        <option>请选择</option>
        <option>1986</option>
        <option>1987</option>
        <option selected="selected">1988</option>
        <option>1989</option>
        <option>1990</option>
    </select>
    <select name="sex" id="sex">
        <option>性别</option>
        <option>男</option>
        <option selected="selected">女</option>
        <option>不是男,也不是女,也不是女</option>
    </select>
</div>


<script type="text/javascript">

//先把select弄成个div,然后在div里面加入span放当前选择项span后面加入ul放option们
var _yl={};

_yl.initSelects = function () {
    var sels = document.getElementsByTagName("select");
    for(var i = 0, len = sels.length; i < len; i++) {
        _yl.resetSel(sels[i]);
        _yl.ctlClsName(sels[i], "none", 1);
    }
    //给body一个事件,为了在别的地方点击时关掉ul
    //var bdy = document.getElementsByTagName("body").item(0);
    _yl.EventUtil.addHandler(document, "click", function(event) {
        //alert("hehe");
        for (var i = 0, len = sels.length; i < len; i++) {
            if (sels[i].id !== "") {
                var tmpUlBox = document.getElementById("sel-div-" + sels[i].id).getElementsByTagName("ul")[0],
                    tmpSpan = document.getElementById("sel-div-" + sels[i].id).getElementsByTagName("span")[0];
                _yl.ctlClsName(tmpUlBox, "none", 1);
                _yl.ctlClsName(tmpSpan, "open");
            }
        }
    });
};

//把一个select换成一个div
//div = selectDiv   相当于select标签
//span = optSpan    最上面的已经选择了的值
//ul = optBoxUl     放option的box
//li = optLi        对应每一项option
_yl.resetSel = function (sltEle) {
    var selectDiv = document.createElement("div"),
        optSpan = document.createElement("span"),
        optBoxUl = document.createElement("ul"),
        opts = sltEle.getElementsByTagName("option");
    selectDiv.id = "sel-div-"+sltEle.id;
    _yl.ctlClsName(selectDiv, "selectDiv", 1);
    //循环一个select下的option们。每个的text放入li
    for (var i = 0, len = opts.length; i < len; i++) {
        var opt = opts[i];
        var optLi = document.createElement("li");
        optLi.appendChild(document.createTextNode(opt.text));
        //给li绑定事件
        _yl.bindLiEvent(optLi, opt, optSpan);
        optBoxUl.appendChild(optLi);
        //当被选中的时候,给span里面给值
        if (opt.selected) {
            //给li是当前已选择的时候加入不同的样式。
            //optLi.className += "seled ";
            _yl.ctlClsName(optLi, "seled", 1);
            optSpan.appendChild(document.createTextNode(opt.text));
        }
    }
    //到了这里,dom对象有了。加入事件。
    //span点击事件需要显示后面的ul
    //li点击事件加入改span值与不显示ul,
    //最重要,需要更改对应的select的selected的option
    //把当前opt对象值给bind函数

    //optBoxUl.className += "seled ";

    selectDiv.appendChild(optSpan);
    //给span绑定事件
    _yl.bindSpanEvent(optSpan, optBoxUl);
    _yl.ctlClsName(optBoxUl, "none", 1);
    selectDiv.appendChild(optBoxUl);
    sltEle.parentNode.insertBefore(selectDiv, sltEle);

};

//给一个li绑定事件
_yl.bindLiEvent = function (liEle, optEle, spanEle) {
    _yl.EventUtil.addHandler(liEle, "click", function (event) {
        event = _yl.EventUtil.getEvent(event);
        //var target = _yl.EventUtil.getTarget(event);
        //alert(new Date()+target.innerHTML+"\n"+liEle.innerHTML);
        spanEle.innerHTML = optEle.text;
        optEle.selected = true;
        var ulEle = liEle.parentNode.getElementsByTagName("li");
        //清除li们的类名
        for (var i = 0,len = ulEle.length; i < len; i++) {
            var tmpLi = ulEle[i];
            _yl.ctlClsName(tmpLi, "seled");
        }
        //加入已选的类名
        _yl.ctlClsName(liEle, "seled", 1);
        //给ul加入none
        _yl.ctlClsName(liEle.parentNode, "none", 1);
        //取掉span的open类名
        _yl.ctlClsName(spanEle, "open");
        _yl.EventUtil.stopPropagation(event);
    });
};

_yl.bindSpanEvent = function (spEle, ulEle) {
    _yl.EventUtil.addHandler(spEle, "click", function (event) {
        if (/none/.test(ulEle.className)) {
            _yl.ctlClsName(ulEle, "none");
            _yl.ctlClsName(spEle, "open", 1);
        } else {
            _yl.ctlClsName(ulEle, "none", 1);
            _yl.ctlClsName(spEle, "open");
        }
        _yl.EventUtil.stopPropagation(event);
    });
};

/**
 *  增删类名
 *  当前element有指定类名时,不加,返回1
 *  没有指定的时候加。
 *  调用方式:
 *  var hehe = document.getElementById("hehe");
 *  _yl.ctlClsName(hehe, "none", 1); //为id为hehe的节点加入值为none的class值。
 *  if (_yl.ctlClsName(hehe, "none", 1)) {
        _yl.ctrlClsName(hehe, "none");
    }           //如果有none,就取掉
*/
_yl.ctlClsName = function (ele, clsName, flag) {
    var clN = ele.className;
    if (clN === undefined) {
        return;
    }
    //增
    if (flag) {
        if (clN !== "") {
            if (new RegExp(clsName).test(clN)) {
                return 1;
            }
            ele.className = clN.replace(/\s$/, " "+clsName+" ");
        } else {
            ele.className = clsName + " ";
        }
    //删 
    } else {
        if (clN !== "") {
            ele.className = clN.replace(clsName+" ","");
        }
    }
};

/**
 *  EventUtils
*/
_yl.EventUtil= {
    addHandler: function (element, type, handler) {
        if (element.addEventListener) {
            element.addEventListener(type, handler, false);
        } else if (element.attachEvent) {
            element.attachEvent("on"+type, handler);
        } else {
            element["on" + type] = handler;
        }
    },
    removeHandler: function (element, type, handler) {
        if (element.addEventListener) {
            element.removeEventListener(type, handler, false);
        } else if (element.attachEvent) {
            element.detachEvent("on"+type, handler);
        } else {
            element["on" + type] = null;
        }
    },
    getEvent: function (event) {
        return event ? event : window.event;
    },
    getTarget: function (event) {
        return event.target || event.srcElement;
    },
    preventDefault: function (event) {
        if (event.preventDefault) {
            event.preventDefault();
        } else {
            event.returnValue = false;
        }
    },
    stopPropagation: function (event) {
        if (event.stopPropagation) {
            event.stopPropagation();
        } else {
            event.cancelBubble = true;
        }
    }
};
_yl.initSelects();
</script>

</body>
posted @ 2013-12-22 19:33  尼枚哉  阅读(866)  评论(0编辑  收藏  举报

一件事,坚持做下去,会让你看得到方向。