实现一个 suggest-input 控件

最近公司碰到一个需求,基于jq 开发一个通用的 带建议 的input 控件;

忙乱中写出了一个通用结构和方法,跟大家分享一下,同时也算做自己的踩坑总结吧。

通用一个模板,不影响原有 input 所在结构;

因为原来的表单中 已经有固定结构的 input 了; 所以不能改html结构;

大概的思路就是,定义一个option 包裹层;然后点击需要带建议的input的时候,去根据自定义属性 suggest-url 拿到对应接口,取数据回来遍历出选项。然后根据 这个input 的top,left 做绝对定位显示出来。

//以下是固有的 form input 结构
<div class="am-input-group am-input-group-sm">
    <span class="am-input-group-label form-title pl42">单位</span>
    <input name="unit" type="text" class="am-form-field suggest-input" suggest-url="xxx" value="吨">
    <span class="am-input-group-label">(默认)</span>
</div>

//随意放一个包裹层
<div class="suggest-option">
    <ul></ul>
</div>

clipboard.png

逐步分解 实现步骤

希望只调用一个函数实现功能

全局 有 suggest-input 类 的input 都实现option 功能;

function initEvent() {
    suggestInput();
})

函数实现与解析 如下:

function suggestInput() {
     //在input focus 的时候做处理。
    $(".suggest-input").focus(function () {
        //获取相关 接口的值
        var url = $(this).attr("suggest-url");
        //缓存操作对象
        var $input = $(this);
        var $suggest = $(".suggest-option");
        var $ul = $suggest.find("ul");
        //通过input 找到 option 应该显示的top 和left
        var top = $input.offset().top + $input.outerHeight()+5;
        var left = $input.offset().left;
        var width = $input.outerWidth();
        
        //如下是基于 url 的ajax请求,此处暂时用静态数据
        /*doAjaxPost(url,'',function (resp) {
            if(resp.status==1){
                var dataObj = resp.data;
                $ul.html('');
                dataObj.forEach(function (p1) {
                    $ul.append("<li id='"+p1.id+"'>"+p1.title+"</li>");
                });
            }else {
                $ul.append("<li>暂无数据</li>")
                return;
            }
        });*/
        var dataObj = [{id:1,title:"吨"},{id:1,title:"克"},{id:1,title:"元"}];
        //先清空 ul;
        $ul.html('');
        //遍历产生 option
        dataObj.forEach(function (p1) {
            $ul.append("<li id='"+p1.id+"'>"+p1.title+"</li>");
        });
        
        //设置 option框 应该显示的位置
        $suggest.css({
            top:top,
            left:left,
            width:width
        }).show();
        
        //找到发生滚动事件的 包裹层,定制滚动时的处理
        $input.parents().each(function (i,o) {
            if($(o).css('overflow-y')=="auto"){
                return $(o);
            }
        }).scroll(function () {
            $suggest.css({
                top:$input.offset().top + $input.outerHeight()+5,
            })
        });
        
        //点击消失相关操作
        $input.click(function (e) {
            e.stopPropagation();
        })
        $("body").click(function () {
            $suggest.hide();
        })
        
        //选中option 时回填数据
        $suggest.find('li').unbind('click').click(function (e) {
            $input.val($(this).text());
            $suggest.hide();
            e.stopPropagation();
        })
        
    })
}

效果如下:

clipboard.png

遇到的坑

整个代码逻辑下来 其实并不难理解,但是有两个需要注意到的地方;

每次为点击li绑定事件的时候,应该先解除之前绑定的相同事件。

$suggest.find('li').unbind('click').click(function (e) {
   
})

如果不解绑,会导致你改变 其中一个 input 的值,其它input都改变; 因为你初始化的时候,为每一个li 都绑定了click 事件。

当表单出现滚动的时候,option 框没有跟着 移动;

$input.parents().each(function (i,o) {
    if($(o).css('overflow-y')=="auto"){
        return $(o);
    }
}).scroll(function () {
    $suggest.css({
        top:$input.offset().top + $input.outerHeight()+5,
    })
});

解决办法就是 检查 发生滚动的box ;发生滚动的时候,重新计算一次 option 的 top;

不过如果手动绑定 scroll 监听,会容易有两个问题。一,可能发生滚动的 box 不是你监听的box; 二,即使你知道发生滚动的div,如果直接写死的话,发生结构变化时,代码不够通用。

因为我通过遍历 input 的父子集,找到最近一个 overflow-y:auto 的父box;这就是发生滚动的父box。
然后绑定事件。
最后效果:

clipboard.png

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
bootstrap-suggest一个基于 Bootstrap 框架的下拉表格插件。它可以帮助我们实现在输入框中输入文字时,自动显示相应的下拉表格供用户选择。 使用 bootstrap-suggest 插件非常简单,首先需要引入相关的 CSS 和 JavaScript 库,然后在输入框中添加相应的属性和事件。 在输入框中,我们可以通过添加 data-toggle="bootstrap-suggest" 属性来启用 bootstrap-suggest 功能。然后,我们还需要设置 data-source 属性来指定下拉表格的数据源。 数据源可以是一个 JavaScript 数组,也可以是一个服务器端的 API 接口。bootstrap-suggest 会根据用户的输入,自动从数据源中过滤出匹配的选项,并将匹配的选项以表格的形式展示给用户。 除了 data-source 属性,我们还可以设置其他一些属性来自定义 bootstrap-suggest 的展示和行为。例如,我们可以设置 data-highlight-class 属性来指定选中的行的 CSS 样式。 在用户输入文字时,bootstrap-suggest 会根据用户的输入自动过滤数据源,并将符合条件的选项以表格的形式展示在输入框下方。用户可以通过键盘上下箭头和回车键来选择某一行,也可以通过鼠标点击来选中某一行。 当用户选择某一行时,bootstrap-suggest 会将选中的行的值填充到输入框中,方便用户进一步操作。 总之,bootstrap-suggest一个非常方便的下拉表格插件,可以帮助我们提供更好的用户输入体验,减少用户的输入错误,提高用户的操作效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值