jQuery中的自定义自动完成功能

塞内什·马姆甘

更新

@Ziv Weissman@Fribu的帮助和建议下,我重新编写了整个自动完成功能。

如果有人需要,他/她可以从这里下载

感谢StackOverFlow社区。


我正在创建一个jQuery自动完成功能。我创建的函数可以在单个文本框中正常工作。但是,一旦我在同一页面上的另一个文本框中实现它,它的行为就会出乎意料。它将打开和关闭自动完成列表。

这是我的autofill.js代码:

function setUl(result) {
    var $ul = $('<ul>');
    if (result !== undefined) {
        $.each(result, function (k, v) {
            $ul.append('<li data-value="' + v.value + '">' + v.label + '</li>');
        });
    }
    return $ul;
}
$.fn.autofill = function (options) {
    if (options == undefined) {
        options = {};
    }
    var $currentInput = $(this);
    var autoCompleteData = $currentInput.data('autofill');
    var listId='autofill-' + (new Date().getTime()).toString(16);
    $currentInput.on('keyup focus', function (e) {

        var query = $(this).val();
        var result = $.grep(autoCompleteData, function (v) {
            return v.label.search(new RegExp(query, 'i')) !== -1;
        });
        $ul = setUl(result, $currentInput);
        $ul.attr('id', listId);
        $ul.addClass('autofill-show');
        $ul.attr('data-target',$currentInput.attr('id'));
        var position = $currentInput.position();
        $ul.css({
            width: $currentInput.width() + parseInt($currentInput.css('padding-left'), 10) + parseInt($currentInput.css('padding-right'), 10),
            position: 'absolute',
            top: position.top + $currentInput.outerHeight(),
            left: position.left
        });
        if ($ul.find('li').length >= 6) {
            $ul.css({
                height: '130px',
                'overflow-y': 'scroll'
            });
        }
        if (result !== undefined) {
            if ($(e.target).attr('id') !== $currentInput.attr('id') && $($(e.target).parent()[0]).attr('id') !== listId) {
                destroy($ul);
            }
            $currentInput.after($ul);
        }
        $currentInput.trigger('onChange', [query, result]);
    });
    $(document).on('click', '.autofill-show li', function (e) {
        if($ul!==undefined && $($(this).parent()[0]).attr('id')==$ul.attr('id')){
            $ul.trigger('onSelect', [$(this).text(), $(this).data('value')]);
        }
        e.stopImmediatePropagation();
    });
    $(document).on('onSelect', '#'+listId,function (e, label, value) {
        $currentInput.val(label);
        if ($.isFunction(options.onSelect)) {
            options.onSelect(label, value);
        }
        if ($(e.target).attr('id') !== $currentInput.attr('id') && $($(e.target).parent()[0]).attr('id') !== listId) {
            destroy($ul);
        }
        e.stopImmediatePropagation();
    });
    $(document).on('onChange', '#'+$currentInput.attr('id'), function (e, query, result) {
        if($ul!==undefined && $($(this).parent()[0]).attr('id')==$ul.attr('id')) {
            result = $.grep(autoCompleteData, function (v) {
                return v.label.search(new RegExp('\^' + query + '\$', "gi")) !== -1;
            });
            if ($.isFunction(options.onChange)) {
                options.onChange(query, result[0]);
            }
        }
        e.stopImmediatePropagation();
    });
    $(document).on('click', function (e) {
        console.log($(e.target));
        if ($(e.target).attr('id') !== $currentInput.attr('id') && $($(e.target).parent()[0]).attr('id') !== listId) {
            destroy($ul);
        }
        e.stopImmediatePropagation();
    });
};
function destroy($ul) {
    $ul.remove();
}

这是我的CSS:

.autofill-show{
    list-style: outside none none;
    padding: 0;
    border: 1px solid #ccc;
    margin:0;
    z-index: 9999999;
}
.autofill-show li{
    border: 1px solid #ccc;
    text-align: center;
    background: #fff;
}

.autofill-show li:hover{
    background: #9bcea3;
    cursor: pointer;
}

这就是我调用函数的方式:

$('#autofill').autofill();
$('#autofill_2').autofill();

这是小提琴的链接。https://jsfiddle.net/saineshmamgain/cs6g13q9/2/

齐夫·魏斯曼(Ziv Weissman)

正如我提到的,其他人都提供了帮助,这是您的事件和选择器的问题。

一种解决方案是将唯一的ID添加到创建的UL中,而不是“基于日期时间”。每次您将销毁一个特定的ID并重新创建它。这些事件将通过HTML触发(添加onclick = ...),并通过jQUERY处理当前/父级。

我已经更新了这个小提琴

它可能有您小提琴遗留下来的东西,我没有时间完善...我会把它留给您。

解决方案如下所示:

function setUl(result) {
    var $ul = $('<ul>');
    if (result !== undefined) {
        $.each(result, function (k, v) {
            $ul.append('<li data-value="' + v.value + '" onclick="clickHandle(this)">' + v.label + '</li>');
        });
    }
    return $ul;
}

function clickHandle(ele){
var label = $(ele).text();
var value = $(ele).data('value');
var inputId = $(ele).parent("ul").attr("data-target");
$('#'+inputId).val(label);
        if ($.isFunction(options.onSelect)) {
            options.onSelect(label, value);
        }
}

$.fn.autofill = function (options) {
    if (options == undefined) {
        options = {};
    }
    var $currentInput = $(this);
    console.log($($currentInput).attr('id'));
    var autoCompleteData = $currentInput.data('autofill');
    var listId='autofill_' + $currentInput.attr('id');
    $currentInput.on('keyup focus', function (e) {

        var query = $(this).val();
        var result = $.grep(autoCompleteData, function (v) {
            return v.label.search(new RegExp(query, 'i')) !== -1;
        });
        if($('#'+listId)){
          $('#'+listId).remove();
        }
        $ul = setUl(result, $currentInput);
        $ul.attr('id',listId);
        $ul.addClass('autofill-show');
        $ul.attr('data-target',$currentInput.attr('id'));
        var position = $currentInput.position();
        $ul.css({
            width: $currentInput.width() + parseInt($currentInput.css('padding-left'), 10) + parseInt($currentInput.css('padding-right'), 10),
            position: 'absolute',
            top: position.top + $currentInput.outerHeight(),
            left: position.left
        });
        if ($ul.find('li').length >= 6) {
            $ul.css({
                height: '130px',
                'overflow-y': 'scroll'
            });
        }
        if (result !== undefined) {
            destroy($ul);
            $currentInput.after($ul);
        }
        $currentInput.trigger('onChange', [query, result]);
    });  
    //end key up 

    $('#'+listId).on('onSelect',function (e, label, value) {
        $currentInput.val(label);
        if ($.isFunction(options.onSelect)) {
            options.onSelect(label, value);
        }
        destroy($ul);
        e.stopImmediatePropagation();
    });
    $(document).on('onChange', '#'+$currentInput.attr('id'), function (e, query, result) {
        if($ul!==undefined && $($(this).parent()[0]).attr('id')==$ul.attr('id')) {
            result = $.grep(autoCompleteData, function (v) {
                return v.label.search(new RegExp('\^' + query + '\$', "gi")) !== -1;
            });
            if ($.isFunction(options.onChange)) {
                options.onChange(query, result[0]);
            }
        }
        e.stopImmediatePropagation();
    });
    $currentInput.on('blur', function (e) {
        window.setTimeout(function(){
        destroy($ul);
        }, 100);
    });
};
function destroy($ul) {
    $ul.remove();
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

类似于JQUERY中的自动完成功能的自定义组件

来自分类Dev

Google表格未在自动完成功能中显示自定义功能

来自分类Dev

如何在zsh中为自定义完成功能的路径添加自动完成功能?

来自分类Dev

在JQuery自动完成功能上使用自定义CSS类

来自分类Dev

如何在Xtext中编写自定义自动完成功能?

来自分类Dev

Chrome地址栏中的自定义自动完成功能

来自分类Dev

git的自定义bash自动完成功能破坏了其他git自动完成功能

来自分类Dev

JQuery 自动完成功能不适用于 minLength 0 和自定义样式

来自分类Dev

是否可以在AppsScript的脚本编辑器中获得自动完成功能来处理自定义类?

来自分类Dev

如何自定义bash自动完成功能以在另一个目录中列出文件

来自分类Dev

具有自动完成功能的自定义交互式外壳

来自分类Dev

Shell自定义自动完成功能-不列出以前列出的参数

来自分类Dev

Google放置自动完成功能-添加自定义结果作为最后的建议

来自分类Dev

如何为特定命令指定自定义自动完成功能?

来自分类Dev

如何向使用自定义函数实例化的类添加自动完成功能?

来自分类Dev

自定义jQuery UI 1.8中的自动完成显示

来自分类Dev

Flask中的jQuery自动完成功能

来自分类Dev

jQuery自定义自动完成

来自分类Dev

自动完成的jQuery与自定义数据

来自分类Dev

在angularjs中自定义自动完成

来自分类Dev

动态地向现有的自定义自动完成功能添加新选项

来自分类Dev

鱼壳自定义功能的自动完成文件

来自分类Dev

Jquery-UI 自动完成自定义数据 - 图像不会在自动完成的下拉列表中呈现

来自分类Dev

在jQuery自动完成功能中添加搜索文本

来自分类Dev

自定义jQuery自动完成组合框CSS

来自分类Dev

自定义jquery类别自动完成的下拉菜单

来自分类Dev

使用Ajax / jQuery自定义自动完成

来自分类Dev

如何在jQuery自动完成的onkeyup事件中添加自定义新选项

来自分类Dev

如何在jQuery自动完成的onkeyup事件中添加自定义新选项

Related 相关文章

  1. 1

    类似于JQUERY中的自动完成功能的自定义组件

  2. 2

    Google表格未在自动完成功能中显示自定义功能

  3. 3

    如何在zsh中为自定义完成功能的路径添加自动完成功能?

  4. 4

    在JQuery自动完成功能上使用自定义CSS类

  5. 5

    如何在Xtext中编写自定义自动完成功能?

  6. 6

    Chrome地址栏中的自定义自动完成功能

  7. 7

    git的自定义bash自动完成功能破坏了其他git自动完成功能

  8. 8

    JQuery 自动完成功能不适用于 minLength 0 和自定义样式

  9. 9

    是否可以在AppsScript的脚本编辑器中获得自动完成功能来处理自定义类?

  10. 10

    如何自定义bash自动完成功能以在另一个目录中列出文件

  11. 11

    具有自动完成功能的自定义交互式外壳

  12. 12

    Shell自定义自动完成功能-不列出以前列出的参数

  13. 13

    Google放置自动完成功能-添加自定义结果作为最后的建议

  14. 14

    如何为特定命令指定自定义自动完成功能?

  15. 15

    如何向使用自定义函数实例化的类添加自动完成功能?

  16. 16

    自定义jQuery UI 1.8中的自动完成显示

  17. 17

    Flask中的jQuery自动完成功能

  18. 18

    jQuery自定义自动完成

  19. 19

    自动完成的jQuery与自定义数据

  20. 20

    在angularjs中自定义自动完成

  21. 21

    动态地向现有的自定义自动完成功能添加新选项

  22. 22

    鱼壳自定义功能的自动完成文件

  23. 23

    Jquery-UI 自动完成自定义数据 - 图像不会在自动完成的下拉列表中呈现

  24. 24

    在jQuery自动完成功能中添加搜索文本

  25. 25

    自定义jQuery自动完成组合框CSS

  26. 26

    自定义jquery类别自动完成的下拉菜单

  27. 27

    使用Ajax / jQuery自定义自动完成

  28. 28

    如何在jQuery自动完成的onkeyup事件中添加自定义新选项

  29. 29

    如何在jQuery自动完成的onkeyup事件中添加自定义新选项

热门标签

归档