AutoComplete 是指用户在文本框输入前几个字母或是汉字的时候,该控件就能从存放数据的文本或是数据库里将所有以这些字母开头的数据提示给用户,供用户选择,提供方便。效果如下图所示:
data
, 变量 data
表示文本提示的范围数组 // 提示范围数据
var data = ['apple', 'banana', 'carambola', 'grape', 'lemon', 'orange', 'watermelon'];
实现 AutoComplete 的功能逻辑 (可使用 jQuery),具体效果如下:
input
框 focus 事件绑定逻辑,当事件触发时,显示 .autocomplete
提示框和相应的提示内容,并定位到触发事件的输入框的正下方。要求同时只能出现一个 .autocomplete
提示框input
输入框的 keyup 事件绑定逻辑,同时获取输入框内容,修改 .autocomplete
提示框的提示选项内容.autocomplete .item
的 click 事件绑定逻辑,当点击提示框选项时,填充选项文本数据到相应的input框中indexOf()
判断是否是匹配提示的的字符。
截图来源:.asp
截图来源:.asp
参考网址:/
<!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=".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)/*** 1、完善 `input` 框 `focus` 事件绑定逻辑,当事件出发时,设置 `.autocomplete` 提示框显示,并定位到触发事件的输入框的正下方。* 注:要求同时只能出现一个 `.autocomplete` 提示框*/ $('focus', 'input', function() {}); /*** 2、完善 `input` 输入框的 `keyup` 事件绑定逻辑,同时获取输入框内容,修改 `.autocomplete` 提示框的提示选项内容*/ $('keyup', 'input', function() {}); /*** 3、完善 `.autocomplete .item` 的 `click` 事件绑定逻辑,当点击提示框选项时,填充选项文本数据到相应的input框中*/ $('click', '.autocomplete .item', function() {});
首先,输入框 focus
的时候,要显示提示框,这里的难点是计算提示框的位置。
下面是参考代码:
$('focus', 'input', function() {// 获取输入框当前的位置var position = $(this).offset();var value = $(this).val();// 计算 $autocomplete 需要展示的位置 $autocomplete.css({'left': position.left,'top': p + $(this).outerHeight(),'display': 'block'});// 更新当前的 input 对象$curInput = $(this);// 展示autoComplete autoComplete(value); });
我们在浏览器的 keyup
事件回调中,需要做以下几步:
data
(可使用 indexOf() )$('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('')); }
当选项被点击时,需要做以下几步:
focus
的输入框中。$('click', '.autocomplete .item', function() {var itemValue = $(this).text();$curInput.val(itemValue);$autocomplete.hide(); })
到这里,就可以实现题目要求的所有功能了。
本题涉及到 dom 操作,元素定位,数组处理,字符串匹配等多方面的内容,比较复杂,但是只要将问题拆解,一步步实现,其实也不是很难。
完整参考代码如下:
// 提示范围数据 var data = ['apple', 'banana', 'carambola', 'grape', 'lemon', 'orange', 'watermelon'];// 获取所有的inputs var $autocomplete = $('.autocomplete'); var $curInput; var $window = $(window); var $body = $(document.body);/*** 1、完善 `input` 框 `focus` 事件绑定逻辑,当事件出发时,设置 `.autocomplete` 提示框显示,并定位到触发事件的输入框的正下方。* 注:要求同时只能出现一个 `.autocomplete` 提示框*/ $('focus', 'input', function() {// 获取输入框当前的位置var position = $(this).offset();var value = $(this).val();// 计算 $autocomplete 需要展示的位置 $autocomplete.css({'left': position.left,'top': p + $(this).outerHeight(),'display': 'block'});// 更新当前的 input 对象$curInput = $(this);// 展示autoComplete autoComplete(value); }); /*** 2、完善 `input` 输入框的 `keyup` 事件绑定逻辑,同时获取输入框内容,修改 `.autocomplete` 提示框的提示选项内容*/ $('keyup', 'input', function() {var value = $(this).val();autoComplete(value); }); /*** 3、完善 `.autocomplete .item` 的 `click` 事件绑定逻辑,当点击提示框选项时,填充选项文本数据到相应的input框中*/ $('click', '.autocomplete .item', function() {var itemValue = $(this).text();$curInput.val(itemValue);$autocomplete.hide(); });/*** 优化: 点击非input的地方则隐藏 $autocomplete*/ $('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('')); }
练习出处:
转载于:.html
本文发布于:2024-01-29 01:10:16,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170646182111634.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |