IFE第二十八天到第三十天:給愛的人發個郵件吧(郵箱輸入下拉框提示功能)
阿新 • • 發佈:2019-01-10
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>