DOM 事件下拉菜單實例

實現下圖所示的菜單效果,實現點擊菜單中的向下三角展開菜單,點擊頁面空白處收起菜單,按下鍵盤上的向上、向下方向鍵可以選中對應的選項,鼠標點擊或按下回車鍵將當前高亮的選項內容設爲菜單的標題

這裏寫圖片描述

任務
一、 點擊菜單中的向下三角展開菜單

提示:
點擊三角時需阻止事件冒泡

二、 展開菜單之後,在document對象上綁定keyup事件,按下向下方向鍵,選中下一個選項,按下向上方向鍵,選中上一個選項,按下回車鍵菜單收起,顯示選中項

提示:
1、聲明一個全局的index變量初值爲-1
2、按下向下方向鍵時index遞增,當遞增至大於等於菜單選項的總數時恢復爲0
3、按下向上方向鍵時判斷index,如若小於等於0則設爲菜單選項的總數,之後遞減index
4、根據index值將對應的選項設爲當前(灰色背景)
5、按下回車鍵時將對應選中的選項設爲菜單標題,且將所有選項設爲無背景,index恢復爲-1,菜單收起
注意:沒有任何選項被選中時,按下回車鍵不做任何操作

三、鼠標滑過每個選項時高亮顯示,離開時去掉背景,點擊高亮選項時菜單標題改變

提示:
遍歷所有a標籤,綁定鼠標點擊的事件
注意:要考慮到瀏覽器兼容,使用innerHTML,不要使用innerText

四、點擊頁面空白處收起菜單

提示: 綁定在document對象上

【代碼】

<!doctype html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>下拉菜單</title>
    <style type="text/css">
    body,
    ul,
    li {
        margin: 0;
        padding: 0;
        font-size: 13px;
    }   
    ul,
    li {
        list-style: none;
    }   
    #divselect {
        width: 186px;
        margin: 80px auto;
        position: relative;
        z-index: 10000;
    }   
    #divselect cite {
        width: 150px;
        height: 24px;
        line-height: 24px;
        display: block;
        color: #807a62;
        cursor: pointer;
        font-style: normal;
        padding-left: 4px;
        padding-right: 30px;
        border: 1px solid #333333;
    }  
    cite:before {
        content: '';
        position: absolute;
        right: 7px;
        bottom: 7px;
        width: 0;
        height: 0;
        border-width: 4px;
        border-style: solid;
        border-color: #888 transparent transparent transparent;
        transition: all 0.2s;
        -webkit-transition: all 0.2s;
        -moz-transition: all 0.2s;
        -o-transition: all 0.2s;
        -ms-transition: all 0.2s;
        transform-origin: 50% 25%;
        -ms-transform-origin: 50% 25%;
        -moz-transform-origin: 50% 25%;
        -webkit-transform-origin: 50% 25%;
        -o-transform-origin: 50% 25%;
    }

    .extended cite:before {
        transform: rotate(180deg);
        -webkit-transform: rotate(180deg);
        -moz-transform: rotate(180deg);
        -o-transform: rotate(180deg);
        -ms-transform: rotate(180deg);
    }

    #divselect ul {
        width: 184px;
        border: 1px solid #333333;
        background-color: #ffffff;
        position: absolute;
        z-index: 20000;
        margin-top: -1px;
        display: none;
        overflow: hidden;
    }

    #divselect ul li {
        height: 24px;
        line-height: 24px;
    }

    #divselect ul li a {
        display: block;
        height: 24px;
        color: #333333;
        text-decoration: none;
        padding-left: 10px;
        padding-right: 10px;
    }
    </style>
    <script type="text/javascript">
    window.onload = function() {
        var box = document.getElementById('divselect'),
            title = box.getElementsByTagName('cite')[0],
            menu = box.getElementsByTagName('ul')[0],
            as = box.getElementsByTagName('a'),
            index = -1;
        var asLen = as.length;


        // 點擊三角時
        title.onclick = function(event) {

            // 執行腳本
            menu.style.display = 'block';
            event.stopPropagation();
            document.onkeyup = function(event) {
                event = event || window.event;
                var keyCode = event.keyCode;
                if (event.keyCode === 40) {
                    if (index < asLen - 1) {
                        index++;
                        for (var i = 0; i < asLen; i++) {
                            as[i].style.background = '#fff';
                        }
                        as[index].style.background = '#ccc';
                    } else {
                        index = 0;
                        for (var i = 0; i < asLen; i++) {
                            as[i].style.background = '#fff';
                        }
                        as[index].style.background = "#ccc";
                    }
                } else if (keyCode === 38) {
                    if (index > 0) {
                        for (var i = 0; i < asLen; i++) {
                            as[i].style.background = '#fff';
                        }
                        index--;
                        as[index].style.background = "#ccc";
                    } else {
                        for (var i = 0; i < asLen; i++) {
                            as[i].style.background = '#fff';
                        }
                        index = asLen - 1;
                        as[index].style.background = "#ccc";
                    }
                } else if (keyCode === 13) {
                    var aHtml = as[index].innerHTML;
                    if (index != -1) {
                        title.innerHTML = aHtml;
                        for (var i = 0; i < asLen; i++) {
                            as[i].style.background = '#fff';
                        }
                        menu.style.display = 'none';
                    }
                }
            }
        }

        // 滑過滑過、離開、點擊每個選項時
        // 執行腳本
        for (var j = 0; j < asLen; j++) {
            as[j].onmouseover = function() {
                for (var i = 0; i < asLen; i++) {
                    as[i].style.background = '#fff';
                }
                this.style.background = '#ccc';
            }
            as[j].onclick = function() {
                title.innerHTML = this.innerHTML;
                for (var i = 0; i < asLen; i++) {
                    as[i].style.background = '#fff';
                }
            }
        }
        // 點擊頁面空白處時
        // 執行腳本
        document.onclick = function(event) {
            menu.style.display = 'none';

        }

    }
    </script>
</head>

<body>
    <div id="divselect">
        <cite>請選擇分類</cite>
        <ul>
            <li id="li"><a href="javascript:;" selectid="1">ASP開發</a></li>
            <li><a href="javascript:;" selectid="2">.NET開發</a></li>
            <li><a href="javascript:;" selectid="3">PHP開發</a></li>
            <li><a href="javascript:;" selectid="4">Javascript開發</a></li>
            <li><a href="javascript:;" selectid="5">Java特效(什麼鬼)</a></li>
        </ul>
    </div>
    <script type="text/javascript">
    window.onblur = function() {
        document.title = '(●—●)';
    };
    window.onfocus = function() {
        document.title = "下拉菜單";
    };
    </script>
</body>

</html>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章