1. 程式人生 > >IFE第二十八天到第三十天:給愛的人發個郵件吧(郵箱輸入下拉框提示功能)

IFE第二十八天到第三十天:給愛的人發個郵件吧(郵箱輸入下拉框提示功能)

task1

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>IFE ECMAScript</title>
    <style>
        .email-sug {
            list-style-type: none;
            margin: 0px;
            padding: 0px;
            width: 150px;
            height: 22px;
            line-height: 22px;
            font-size: 14px;
        }

        li:hover {
            background-color: antiquewhite;
        }
    </style>
</head>

<body>
    <div class="wrapper">
        <input id="email-input" type="text">
        <ul id="email-sug-wrapper" class="email-sug"></ul>
    </div>

    <script>
        var postfixList = ['163.com', 'gmail.com', '126.com', 'qq.com', '263.net'];
        var input = document.getElementById("email-input");
        var ul = document.getElementById("email-sug-wrapper");

        input.oninput = function () {
            getInput();
            addPrompt();
            displayOrHide();
        };

        ul.onclick = function (e) {
            var ev = e || window.event;    
            var target = ev.target || ev.srcElement;
            if (target.nodeName.toUpperCase() == 'LI') {
                input.value = target.innerText;
                hide();
            }
        }

        function getInput() {
            //拿到input輸入框的輸入內容trim後返回
            var input1 = input.value;
            return input1.trim();
        }

        //生成提示框中的提示內容
        function setPrompt() {
            var input1 = getInput();
            var input2, input3;
            var flag = 0; //“@”後的字串能否在postfixList中找到匹配
            if (input1.indexOf("@") == -1) {
                input2 = input1;
            } else {
                input2 = input1.slice(0, input1.indexOf("@"));
                input3 = input1.slice(input1.indexOf("@") + 1);
                console.log(input3)
            }
            var res = new Array();
            for (var i = 0; i < postfixList.length; i++) {
                if (postfixList[i].indexOf(input3) == 0) {
                    res[i] = input2 + '@' + postfixList[i];
                    flag = 1;
                    console.log(res)
                }
            }
            if (flag == 0) {
                for (var i = 0; i < postfixList.length; i++) {
                    res[i] = input2 + '@' + postfixList[i];
                }
            }
            //去除res陣列中的空值
            for (var i = 0; i < res.length; i++) {
                if (typeof res[i] == "undefined" || res[i] == "") {
                    res.splice(i, 1);
                    i--;
                }
            }
            return res;
        }

        function addPrompt() {
            var prompt = setPrompt();
            var len = ul.childNodes.length;
            //removechild()正常的刪除全部節點,應該從後面往前刪除。
            //原因是當你把索引為0的子節點刪除後,那麼原來索引為1節點此時它的索引變成0了,而這時變數i已經變成1了,程式繼續走時就會刪除原先索引為2的現在為1的節點,這樣程式執行的結果就是隻刪除了一半的子節點。
            for (var i = len - 1; i >= 0; i--) {
                ul.removeChild(ul.childNodes[i]);
            }
            for (var i = 0; i < prompt.length; i++) {
                var li = document.createElement('li');
                li.innerHTML = prompt[i];
                ul.appendChild(li);
            }
        }

        function displayOrHide() {
            var input1 = getInput();
            if (input1 == "") {
                hide();
            } else {
                display();
            }
        }

        function hide() {
            ul.style.display = "none";
        }

        function display() {
            ul.style.display = "block";
        }
    </script>
</body>

</html>

task2(加上鍵盤——基於DOM的思路)

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>IFE ECMAScript</title>
    <style>
        .email-sug {
            list-style-type: none;
            margin: 0px;
            padding: 0px;
            width: 150px;
            height: 22px;
            line-height: 22px;
            font-size: 14px;
        }

        li:hover {
            background-color: antiquewhite;
        }

        .selected {
            background-color: lightgray;
        }
    </style>
</head>

<body>
    <div class="wrapper">
        <input id="email-input" type="text">
        <ul id="email-sug-wrapper" class="email-sug"></ul>
    </div>

    <script>
        var postfixList = ['163.com', 'gmail.com', '126.com', 'qq.com', '263.net'];
        var input = document.getElementById("email-input");
        var ul = document.getElementById("email-sug-wrapper");

        var selected = 0;
        var selectedLi = null;

        input.onkeyup = function (event) {
            var event = event || window.event;
            addPrompt();
            displayOrHide();
            if (event.keyCode != 13 && event.keyCode != 108 && event.keyCode != 38 && event.keyCode != 40) {
                resetState();
            }
            var list = ul.querySelectorAll('li');
            if (selectedLi == null) {
                selectedLi = ul.querySelector('li:first-child');
                selectedLi.classList.add('selected');
            }
            for (var i = 0; i < list.length; i++) {
                if (list[i].getAttribute("class") == 'selected') { 
                    selected = i; 
                    selectedLi = list[i];
                }
            }
            // 按的是上鍵
            if (event.keyCode == 38) {
                // 找到的Li不是第一個
                selectedLi.classList.remove('selected');
                if (selected != 0) {
                    // 將它的前一個Li設為選中
                    selectedLi = list[--selected];
                    selectedLi.classList.add('selected');
                } else {
                    // 將最後一個Li設為選中
                    selectedLi = list[list.length - 1];
                    selectedLi.classList.add('selected');
                    selected = list.length - 1;
                }
            }
            // 按的是下鍵
            if (event.keyCode == 40) {
                selectedLi.classList.remove('selected');
                // 找到的Li不是最後一個
                if (selected != list.length - 1) {
                    // 將它的下一個Li設為選中
                    selectedLi = list[++selected];
                    selectedLi.classList.add('selected');
                } else {
                    // 將第一個Li設為選中
                    selectedLi = list[0];
                    selectedLi.classList.add('selected');
                    selected = 0;
                }
            }
            // 按的是回車
            if (event.keyCode === 13) {
                // 將找到的Li的HTML內容解碼後填到input中
                // 隱藏提示框
                input.value = selectedLi.textContent;
                hide();
            }
        };

        ul.onclick = function (e) {
            var ev = e || window.event;    
            var target = ev.target || ev.srcElement;
            if (target.nodeName.toUpperCase() == 'LI') {
                input.value = target.innerText;
                hide();
            }
        }

        function resetState() {
            var firstLi = ul.querySelector('li:first-child');
            var selectedLi = ul.querySelector('li.selected');
            if (selectedLi != null) {
                if (firstLi != selectedLi) {
                    selectedLi.classList.remove('selected');
                    firstLi.classList.add('selected');
                }
            } else {
                firstLi.classList.add('selected');
            }
        }

        function getInput() {
            //拿到input輸入框的輸入內容trim後返回
            var input1 = input.value;
            return input1.trim();
        }

        //生成提示框中的提示內容
        function setPrompt() {
            var input1 = getInput();
            var input2, input3;
            var flag = 0; //“@”後的字串能否在postfixList中找到匹配
            if (input1.indexOf("@") == -1) {
                input2 = input1;
            } else {
                input2 = input1.slice(0, input1.indexOf("@"));
                input3 = input1.slice(input1.indexOf("@") + 1);
            }
            var res = new Array();
            for (var i = 0; i < postfixList.length; i++) {
                if (postfixList[i].indexOf(input3) == 0) {
                    res[i] = document.createElement('li');
                    res[i].innerText = input2 + '@' + postfixList[i];
                    flag = 1;
                }
            }
            if (flag == 0) {
                for (var i = 0; i < postfixList.length; i++) {
                    res[i] = document.createElement('li');
                    res[i].innerText = input2 + '@' + postfixList[i];
                }
            }
            //去除res陣列中的空值
            for (var i = 0; i < res.length; i++) {
                if (typeof res[i] == "undefined" || res[i].innerText == "") {
                    res.splice(i, 1);
                    i--;
                }
            }
            return res;
        }

        function addPrompt() {
            var prompt = setPrompt();
            var len = ul.childNodes.length;
            //removechild()正常的刪除全部節點,應該從後面往前刪除。
            //原因是當你把索引為0的子節點刪除後,那麼原來索引為1節點此時它的索引變成0了,而這時變數i已經變成1了,程式繼續走時就會刪除原先索引為2的現在為1的節點,這樣程式執行的結果就是隻刪除了一半的子節點。
            for (var i = len - 1; i >= 0; i--) {
                ul.removeChild(ul.childNodes[i]);
            }
            for (var i = 0; i < prompt.length; i++) {
                ul.appendChild(prompt[i]);
            }
        }

        function displayOrHide() {
            var input1 = getInput();
            if (input1 == "") {
                hide();
            } else {
                display();
            }
        }

        function hide() {
            ul.style.display = "none";
        }

        function display() {
            ul.style.display = "block";
        }
    </script>
</body>

</html>

task3(加上鍵盤——基於資料的思路)

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>IFE ECMAScript</title>
    <style>
        .email-sug {
            list-style-type: none;
            margin: 0px;
            padding: 0px;
            width: 150px;
            height: 22px;
            line-height: 22px;
            font-size: 14px;
        }

        li:hover {
            background-color: antiquewhite;
        }

        .selected {
            background-color: lightgray;
        }
    </style>
</head>

<body>
    <div class="wrapper">
        <input id="email-input" type="text">
        <ul id="email-sug-wrapper" class="email-sug"></ul>
    </div>

    <script>
        // 增加一個變數,用於儲存當前選中的提示Li的序號
        var nowSelectTipIndex = 0;
        var postfixList = ['163.com', 'gmail.com', '126.com', 'qq.com', '263.net'];
        var input = document.getElementById("email-input");
        var ul = document.getElementById("email-sug-wrapper");

        input.addEventListener("keyup", function (event) {
            var event = event || window.event; 
            //如果按鍵不是上下及回車重置選中狀態
            if (event.keyCode != 13 && event.keyCode != 108 && event.keyCode != 38 && event.keyCode != 40) {
                resetIndex();
            }
            if (event.keyCode == 38) {
                if (nowSelectTipIndex == 0) {
                    nowSelectTipIndex = ul.childNodes.length - 1;
                } else {
                    nowSelectTipIndex--;
                }
            }
            if (event.keyCode == 40) {
                if (nowSelectTipIndex >= ul.childNodes.length - 1) {
                    nowSelectTipIndex = 0;
                } else {
                    nowSelectTipIndex++;
                }
            }
            addPrompt();
            displayOrHide();
            if (event.keyCode == 13 || event.keyCode == 108) {
                // 從當前提示框中選第 nowSelectTipIndex 個Li,將其HTML內容解碼後填到input中
                input.value = ul.childNodes[nowSelectTipIndex].innerText;
                hide();
            }
        });

        ul.onclick = function (e) {
            var ev = e || window.event;    
            var target = ev.target || ev.srcElement;
            if (target.nodeName.toUpperCase() == 'LI') {
                input.value = target.innerText;
                hide();
            }
        }

        function resetIndex() {
            nowSelectTipIndex = 0;
        }

        function getInput() {
            //拿到input輸入框的輸入內容trim後返回
            var input1 = input.value;
            return input1.trim();
        }

        //生成提示框中的提示內容
        function setPrompt() {
            var input1 = getInput();
            var input2, input3;
            var flag = 0; //“@”後的字串能否在postfixList中找到匹配
            if (input1.indexOf("@") == -1) {
                input2 = input1;
            } else {
                input2 = input1.slice(0, input1.indexOf("@"));
                input3 = input1.slice(input1.indexOf("@") + 1);
            }
            var res = new Array();
            for (var i = 0; i < postfixList.length; i++) {
                if (postfixList[i].indexOf(input3) == 0) {
                    res[i] = document.createElement('li');
                    res[i].innerText = input2 + '@' + postfixList[i];
                    flag = 1;
                }
            }
            if (flag == 0) {
                for (var i = 0; i < postfixList.length; i++) {
                    res[i] = document.createElement('li');
                    res[i].innerText = input2 + '@' + postfixList[i];
                }
            }
            //去除res陣列中的空值
            for (var i = 0; i < res.length; i++) {
                if (typeof res[i] == "undefined" || res[i].innerText == "") {
                    res.splice(i, 1);
                    i--;
                }
            }
            //將第nowSelectTipIndex個Li的樣式設定為被選樣式
            res[nowSelectTipIndex].className = 'selected';
            console.log(res);
            console.log(nowSelectTipIndex);
            return res;
        }

        function addPrompt() {
            var prompt = setPrompt();
            var len = ul.childNodes.length;
            //removechild()正常的刪除全部節點,應該從後面往前刪除。
            //原因是當你把索引為0的子節點刪除後,那麼原來索引為1節點此時它的索引變成0了,而這時變數i已經變成1了,程式繼續走時就會刪除原先索引為2的現在為1的節點,這樣程式執行的結果就是隻刪除了一半的子節點。
            for (var i = len - 1; i >= 0; i--) {
                ul.removeChild(ul.childNodes[i]);
            }
            for (var i = 0; i < prompt.length; i++) {
                ul.appendChild(prompt[i]);
            }
        }

        function displayOrHide() {
            var input1 = getInput();
            if (input1 == "") {
                hide();
            } else {
                display();
            }
        }

        function hide() {
            ul.style.display = "none";
        }

        function display() {
            ul.style.display = "block";
        }
    </script>
</body>

</html>