不使用Element UI库借助jQuery的库也可以实现‘搜索下拉框’的功能噢

本文介绍了如何使用jQuery实现一个搜索下拉框功能,类似于CSDN的搜索交互。通过创建一个动态生成的CSS样式div,实现搜索关键词的实时反馈,并展示分页数据。在用户输入时,会触发后台接口获取新数据。同时,文章提供了优化建议,如使用防抖和节流技术,并给出了完整的jQuery代码示例。
摘要由CSDN通过智能技术生成

搜索下拉框介绍

以CSDN下拉菜单反馈性关键词是用户在搜索时与搜索引擎的第一步互动,在互动过程中,搜索引擎的反馈关键词不断调整来满足用户的个性需求!

下面也可以通过jQuery的库进行实现,后台仅需要提供一个查询的接口给我们前端即可完成,前端也不需要自己再重写令人烦心的样式。如果后台返回的数据没有分页或者固定多少条,我们需要拿到数据后截取10条-15条进行展示!

使用背景

在一个移动端项目需要做一个搜索下拉框的功能,该技术选型是jQuery,而并非Vue,这样有些Vue封装好的第三方库就无法实现了,我这边找到了一个基于jQuery的第三方可以实现搜索下拉框的功能,后台只需要提供一个查询接口即可实现类似CSDN的搜索框功能,设置好分页数据,默认拿到的数据就是第一页的前10条数据,每一次输入搜索关键字均可以再一次返回新的数据。类似csdn这样的效果。(全文需要先引入jQuery才可进行操作,全文需要先引入jQuery才可进行操作,全文需要先引入jQuery才可进行操作)
请添加图片描述

使用的库的代码

可下列代码直接复制到一个空的js文件(文件的命名随意吧),然后引入到数据当中,内部动态生成的CSS样式可根据自己所需要的业务进行修改,比如背景色,字体大小,行间距等!通过本篇博客记录自己在解决’搜索下拉框’问题的办法,也希望能帮助到您噢!(下述代码还可以进行优化,我的项目中并非使用的该代码),项目中的代码最后使用了js的防抖和节流,若有不懂JavaScript的防抖和节流可以浏览完该博客后点击该连接跳转到js的防抖和节流博文进行阅读了解!

该js支持PC端和mobile端!

(function($) {
    $.selectSuggest = function(target, data, itemSelectFunction) {
    		var defaulOption = {
    			suggestMaxHeight: '200px',//弹出框最大高度
    			itemColor : '#000000',//默认字体颜色
    			itemBackgroundColor:'RGB(199,237,204)',//默认背景颜色
    			itemOverColor : '#ffffff',//选中字体颜色
    			itemOverBackgroundColor : '#C9302C',//选中背景颜色
    			itemPadding : 3 ,//item间距
    			fontSize : 12 ,//默认字体大小
    			alwaysShowALL : true //点击input是否展示所有可选项
    			};
        var maxFontNumber = 0;//最大字数
        var currentItem;
        var suggestContainerId = target + "-suggest";
        var suggestContainerWidth = $('#' + target).innerWidth();
        var suggestContainerLeft = $('#' + target).offset().left;
        var suggestContainerTop = $('#' + target).offset().top + $('#' + target).outerHeight();

        var showClickTextFunction = function() {
            $('#' + target).val(this.innerText);
            currentItem = null;
            $('#' + suggestContainerId).hide();
        }
        var suggestContainer;
        if ($('#' + suggestContainerId)[0]) {
            suggestContainer = $('#' + suggestContainerId);
            suggestContainer.empty();
        } else {
            suggestContainer = $('<div></div>'); //创建一个子<div>
        }

        suggestContainer.attr('id', suggestContainerId);
        suggestContainer.attr('tabindex', '0');
        suggestContainer.hide();
        var _initItems = function(items) {
            suggestContainer.empty();
            for (var i = 0; i < items.length; i++) {
            		if(items[i].text.length > maxFontNumber){
            			maxFontNumber = items[i].text.length;
            			}
                var suggestItem = $('<div></div>'); //创建一个子<div>
                suggestItem.attr('id', items[i].id);
                suggestItem.append(items[i].text);
                suggestItem.css({
                		'padding':defaulOption.itemPadding + 'px',
                    'white-space':'nowrap',
                    'cursor': 'pointer',
                    'background-color': defaulOption.itemBackgroundColor,
                    'color': defaulOption.itemColor
                });
                suggestItem.bind("mouseover",
                function() {
                    $(this).css({
                        'background-color': defaulOption.itemOverBackgroundColor,
                        'color': defaulOption.itemOverColor
                    });
                    currentItem = $(this);
                });
                suggestItem.bind("mouseout",
                function() {
                    $(this).css({
                        'background-color': defaulOption.itemBackgroundColor,
                        'color': defaulOption.itemColor
                    });
                    currentItem = null;
                });
                suggestItem.bind("click", showClickTextFunction);
                suggestItem.bind("click", itemSelectFunction);
                suggestItem.appendTo(suggestContainer);
                suggestContainer.appendTo(document.body);
            }
        }

        var inputChange = function() {
            var inputValue = $('#' + target).val();
            inputValue = inputValue.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&");
            var matcher = new RegExp(inputValue, "i");
            return $.grep(data,
            function(value) {
                return matcher.test(value.text);
            });
        }

        $('#' + target).bind("keyup",
        function() {
            _initItems(inputChange());
        });
        $('#' + target).bind("blur",
        function() {
        		if(!$('#' + suggestContainerId).is(":focus")){
        			$('#' + suggestContainerId).hide();
        			if (currentItem) {
                currentItem.trigger("click");
            	}
            	currentItem = null;
        			return;
        			}                       
        });

        $('#' + target).bind("click",
        function() {
            if (defaulOption.alwaysShowALL) {
                _initItems(data);
            } else {
                _initItems(inputChange());
            }
            $('#' + suggestContainerId).removeAttr("style");
            var tempWidth = defaulOption.fontSize*maxFontNumber + 2 * defaulOption.itemPadding + 30;
            var containerWidth = Math.max(tempWidth, suggestContainerWidth);
            $('#' + suggestContainerId).css({
                'border': '1px solid #ccc',
                'max-height': '200px',
                'top': suggestContainerTop,
                'left': suggestContainerLeft,
                'width': containerWidth,
                'position': 'absolute',
                'font-size': defaulOption.fontSize+'px',
                'font-family':'Arial',
                'z-index': 99999,
                'background-color': '#FFFFFF',
                'overflow-y': 'auto',
                'overflow-x': 'hidden',
                'white-space':'nowrap'

            });
            $('#' + suggestContainerId).show();
        });
        _initItems(data);

        $('#' + suggestContainerId).bind("blur",
        function() {
            $('#' + suggestContainerId).hide();
        });

    }
})(jQuery);

使用方式:

只需要定义一个input标签,其标签的id为selectMessage [可以更换id名],然后调用selectSuggest(),该方法有三个参数,分别是input标签的id命,需要搜索的信息(Object),回调函数(function)
html代码

 <input type="text"id="selectMessage"  name="enterpriseName" />

js代码

// 注意:第一个参数是该标签的id值,并不需要加 ‘#’ 
$.selectSuggest('selectMessage',rows,(e) =>{});

可以封装成一个函数,当用户进行点击输入框的时候进行触发该事件;

<input type="text"id="selectMessage" oninput="selectData()"  name="enterpriseName" />

// 用户点击时候触发的函数
function selectData() {
     let val = $('#selectMessage').val();
     let dataVal = {
         enterpriseName: val
     }
     // getData是封装的一个ajax请求
     this.getData('post','/url',dataVal, (res) => {
         let rows = res.rows;
         $.selectSuggest('selectMessage',rows, function (e) {
             eName =  e.target.innerText;
         });
     });
 }
 selectData();
 
// 获取需要渲染的数据
function getDataList() {
     this.getData('post','/url',data11,function (res) {
         var rows = res.rows;
         $.selectSuggest('selectMessage',rows, function (e) {
             eName =  e.target.innerText;
         });
     });
 }
 getDataList();

Ajax请求封装(大佬可跳过)

不会封装ajax的可以参考我封装的ajax请求,大佬就请跳过或可留言更好的封装方法给我们大家参考学习

function getData(type,url,data,callback) {
      $.ajax({
           type: type,
           url: prefix + url,
           data: data,
           //成功否, back, 服务器端响应度信息
           success: function (res) {  
                   callback(res);
           },
           //如果错误则错误信息。
           error: function () {  
           	// 这里使用的是ruoyi的提示框
               $.modal.alertWarning("请求数据失败");
           }
       })
  };
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要使用 Element UI 实现选择下拉框,可以按照以下步骤进行: 1. 首先确保你已经安装了 Element UI 。 2. 在需要使用选择下拉框的组件中,引入 Select 组件。 ```javascript <template> <div> <el-select v-model="selectedValue" placeholder="请选择"> <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"></el-option> </el-select> </div> </template> <script> export default { data() { return { selectedValue: '', options: [ { value: 'option1', label: '选项1' }, { value: 'option2', label: '选项2' }, { value: 'option3', label: '选项3' }, { value: 'option4', label: '选项4' } ] } } } </script> ``` 在上述代码中,我们使用了 `el-select` 和 `el-option` 标签来创建选择下拉框,并通过 `v-model` 实现了双向数据绑定。`options` 数组中存储了下拉框中的选项,`label` 属性用于显示选项的文字描述,`value` 属性用于存储选项的值。 3. 最后,可以根据需要设置选择下拉框的其他属性,例如 `placeholder`、`disabled`、`clearable` 等等,具体可参考 Element UI 官方文档。 以上就是使用 Element UI 实现选择下拉框的基本方法。 ### 回答2: 要使用 Element UI 实现选择下拉框,您可以按照以下步骤进行: 1. 首先,在项目中安装 Element UI。可以通过 npm 或 yarn 进行安装,例如使用以下命令:`npm install element-ui` 或 `yarn add element-ui`。 2. 在使用的文件中引入 Element UI 的选择下拉框组件。可以使用 `import` 语句引入需要的组件,例如:`import { Select, Option } from 'element-ui'`。 3. 在需要使用选择下拉框的地方,使用 `<el-select>` 标签包裹需要的选项。 4. 在 `<el-select>` 标签内部,使用 `<el-option>` 标签定义下拉选择的每个选项,并设置对应的值和标签内容。例如: ```html <el-select v-model="selectedValue"> <el-option label="选项1" value="option1"></el-option> <el-option label="选项2" value="option2"></el-option> <el-option label="选项3" value="option3"></el-option> </el-select> ``` 5. 在对应的 Vue 实例中,定义 `selectedValue` 数据绑定到 `v-model` 上,以便获取用户选择的值。 6. 您还可以根据需要设置更多的属性,例如可搜索属性、禁用状态、多选等。可以参考 Element UI 官方文档中 Select 组件的 API 说明。 7. 最后,确保您的项目中已经正确引入了 Element UI 的样式文件,可以在项目中的入口文件(如 `main.js` 或 `App.vue`)中使用 `import 'element-ui/lib/theme-chalk/index.css'` 进行引入。 通过以上步骤,您就可以成功使用 Element UI 实现选择下拉框了。请根据自己的实际情况进行相应的调整和修改。 ### 回答3: Element UI 是基于 Vue.js 的一套桌面端组件,其中包含了很多常用的 UI 组件,包括选择下拉框。 要实现选择下拉框,首先需要引入 Element UI,并正确配置 Vue.js。 在 HTML 中,可以使用 `<el-select>` 标签来创建一个选择下拉框,通过 `v-model` 属性来绑定选择的值。例如: ``` <el-select v-model="selectedValue"> <el-option label="选项一" value="1"></el-option> <el-option label="选项二" value="2"></el-option> <el-option label="选项三" value="3"></el-option> </el-select> ``` 在 Vue.js 的 `data` 属性中,定义 `selectedValue` 变量来存储选择的值。例如: ``` data() { return { selectedValue: '' } }, ``` 这样就可以在页面中创建一个简单的选择下拉框,其中有三个选项可以选择:选项一、选项二和选项三。当选择一个选项时,`selectedValue` 的值就会自动更新。 如果需要获取选择的值,可以在 Vue.js 的 `methods` 属性中定义一个方法,并在选择下拉框的 `change` 事件中调用该方法。例如: ``` methods: { handleSelectChange(value) { console.log('选择的值是:', value); } } ``` 然后在选择下拉框中添加 `@change` 属性来指定选择变化时调用的方法。例如: ``` <el-select v-model="selectedValue" @change="handleSelectChange"> ``` 这样就能够在选择下拉框实现选择的监听,并获取选择的值。 除了基本的功能外,Element UI 的选择下拉框还提供了很多自定义的属性和事件,可以根据需求进行配置和使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值