gpt4 book ai didi

javascript - jquery中的自定义自动完成功能

转载 作者:数据小太阳 更新时间:2023-10-29 04:49:12 25 4
gpt4 key购买 nike

更新

借助来自 @Ziv Weissman 的帮助和建议和 @Fribu我重写了整个自动完成功能。

如果有人需要他/她可以从here下载.

感谢 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();

这是 fiddle 链接。 https://jsfiddle.net/saineshmamgain/cs6g13q9/2/

最佳答案

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

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

我已经更新了这个 fiddle

它可能有一些我没有时间完善的东西,我会把它留给你。

解决方案看起来像这样:

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();
}

关于javascript - jquery中的自定义自动完成功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38450772/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com