AutoComplete 是指用戶在文本框輸入前幾個字母或是漢字的時候,該控件就能從存放數據的文本或是數據庫裏將全部以這些字母開頭的數據提示給用戶,供用戶選擇,提供方便。效果以下圖所示:css
data
, 變量 data
表示文本提示的範圍數組 // 提示範圍數據 var data = ['apple', 'banana', 'carambola', 'grape', 'lemon', 'orange', 'watermelon'];
實現 AutoComplete 的功能邏輯 (可以使用 jQuery),具體效果以下:html
input
框 focus 事件綁定邏輯,當事件觸發時,顯示 .autocomplete
提示框和相應的提示內容,並定位到觸發事件的輸入框的正下方。要求同時只能出現一個 .autocomplete
提示框input
輸入框的 keyup 事件綁定邏輯,同時獲取輸入框內容,修改 .autocomplete
提示框的提示選項內容.autocomplete .item
的 click 事件綁定邏輯,當點擊提示框選項時,填充選項文本數據到相應的input框中indexOf()
判斷是不是匹配提示的的字符。
截圖來源:http://www.w3school.com.cn/jsref/jsref_indexOf.aspjquery
截圖來源:http://www.w3school.com.cn/jquery/css_offset.asp數據庫
參考網址:http://api.jquery.com/outerHeight/api
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>實現 autocomplete</title> </head> <body> <!-- 請在index.js文件中完成練習 --> <input type="text"> <input type="text"> <ul class="autocomplete"> <!--提示內容結構以下:<li class="item">apple</li>--> </ul> <!-- 引入jQuery--> <script src="https://7.url.cn/edu/jslib/jquery/1.9.1/jquery.min.js"></script> </body> </html>
// 提示範圍數據 var data = ['apple', 'banana', 'carambola', 'grape', 'lemon', 'orange', 'watermelon']; // 獲取全部的inputs var $autocomplete = $('.autocomplete'); var $curInput; var $window = $(window); var $body = $(document.body) /** * 一、完善 `input` 框 `focus` 事件綁定邏輯,當事件出發時,設置 `.autocomplete` 提示框顯示,並定位到觸發事件的輸入框的正下方。 * 注:要求同時只能出現一個 `.autocomplete` 提示框 */ $body.on('focus', 'input', function() { }); /** * 二、完善 `input` 輸入框的 `keyup` 事件綁定邏輯,同時獲取輸入框內容,修改 `.autocomplete` 提示框的提示選項內容 */ $body.on('keyup', 'input', function() { }); /** * 三、完善 `.autocomplete .item` 的 `click` 事件綁定邏輯,當點擊提示框選項時,填充選項文本數據到相應的input框中 */ $body.on('click', '.autocomplete .item', function() { });
首先,輸入框 focus
的時候,要顯示提示框,這裏的難點是計算提示框的位置。數組
下面是參考代碼:瀏覽器
$body.on('focus', 'input', function() { // 獲取輸入框當前的位置 var position = $(this).offset(); var value = $(this).val(); // 計算 $autocomplete 須要展現的位置 $autocomplete.css({ 'left': position.left, 'top': position.top + $(this).outerHeight(), 'display': 'block' }); // 更新當前的 input 對象 $curInput = $(this); // 展現autoComplete autoComplete(value); });
咱們在瀏覽器的 keyup
事件回調中,須要作如下幾步:app
data
(可以使用 indexOf() )$body.on('keyup', 'input', function() { // 獲取輸入框的值 var value = $(this).val(); // 將輸入框的值傳入 autoComplete 函數 autoComplete(value); }) /** * 根據輸入展現匹配的提示內容 */ function autoComplete(value) { var itemsArr = []; // 遍歷數據篩選數據 data.forEach(function (item) { // 使用 indexOf 判斷輸入內容與提示內容是否匹配 if (item.indexOf(value) > -1) { itemsArr.push('<li class="item">' + item +'</li>'); } }); $autocomplete.html(itemsArr.join('')); }
當選項被點擊時,須要作如下幾步:dom
focus
的輸入框中。$body.on('click', '.autocomplete .item', function() { var itemValue = $(this).text(); $curInput.val(itemValue); $autocomplete.hide(); })
到這裏,就能夠實現題目要求的全部功能了。ide
本題涉及到 dom 操做,元素定位,數組處理,字符串匹配等多方面的內容,比較複雜,可是隻要將問題拆解,一步步實現,其實也不是很難。
完整參考代碼以下:
// 提示範圍數據 var data = ['apple', 'banana', 'carambola', 'grape', 'lemon', 'orange', 'watermelon']; // 獲取全部的inputs var $autocomplete = $('.autocomplete'); var $curInput; var $window = $(window); var $body = $(document.body); /** * 一、完善 `input` 框 `focus` 事件綁定邏輯,當事件出發時,設置 `.autocomplete` 提示框顯示,並定位到觸發事件的輸入框的正下方。 * 注:要求同時只能出現一個 `.autocomplete` 提示框 */ $body.on('focus', 'input', function() { // 獲取輸入框當前的位置 var position = $(this).offset(); var value = $(this).val(); // 計算 $autocomplete 須要展現的位置 $autocomplete.css({ 'left': position.left, 'top': position.top + $(this).outerHeight(), 'display': 'block' }); // 更新當前的 input 對象 $curInput = $(this); // 展現autoComplete autoComplete(value); }); /** * 二、完善 `input` 輸入框的 `keyup` 事件綁定邏輯,同時獲取輸入框內容,修改 `.autocomplete` 提示框的提示選項內容 */ $body.on('keyup', 'input', function() { var value = $(this).val(); autoComplete(value); }); /** * 三、完善 `.autocomplete .item` 的 `click` 事件綁定邏輯,當點擊提示框選項時,填充選項文本數據到相應的input框中 */ $body.on('click', '.autocomplete .item', function() { var itemValue = $(this).text(); $curInput.val(itemValue); $autocomplete.hide(); }); /** * 優化: 點擊非input的地方則隱藏 $autocomplete */ $window.on('click', function(event) { var target = event.target; if (target.tagName !== 'INPUT') { $autocomplete.hide(); } }); /** * 展現提示框 * @param [String] value 判斷提示的文本 */ function autoComplete(value) { var itemsArr = []; // 遍歷數據篩選數據 data.forEach(function (item) { if (item.indexOf(value) > -1) { itemsArr.push('<li class="item">' + item +'</li>'); } }); $autocomplete.html(itemsArr.join('')); }
練習出處:https://ke.qq.com