Jquery 呃,我没有保存叉子。。。现在已经修复了。可以了,但是在用鼠标选择一个项目后,它会再次打开(我想它会再次将焦点放回到元素上)。嗯?我在Firefox和Chromium上测试了它,但它没有第二次弹出。您使用哪种浏览器?这(stackoverflow答案)在我从
Jquery 呃,我没有保存叉子。。。现在已经修复了。可以了,但是在用鼠标选择一个项目后,它会再次打开(我想它会再次将焦点放回到元素上)。嗯?我在Firefox和Chromium上测试了它,但它没有第二次弹出。您使用哪种浏览器?这(stackoverflow答案)在我从,jquery,jquery-autocomplete,Jquery,Jquery Autocomplete,呃,我没有保存叉子。。。现在已经修复了。可以了,但是在用鼠标选择一个项目后,它会再次打开(我想它会再次将焦点放回到元素上)。嗯?我在Firefox和Chromium上测试了它,但它没有第二次弹出。您使用哪种浏览器?这(stackoverflow答案)在我从JSFIDLE添加“minLength:0”之前对我不起作用,然后它就完美地工作了。它不仅仅是一个样式化的选择,因为用户仍然可以在框中键入并输入列表中未显示的内容。更像一个组合框。我已经限制了结果,所以这不是一个问题。好的,Mark u是对的,
呃,我没有保存叉子。。。现在已经修复了。可以了,但是在用鼠标选择一个项目后,它会再次打开(我想它会再次将焦点放回到元素上)。嗯?我在Firefox和Chromium上测试了它,但它没有第二次弹出。您使用哪种浏览器?这(stackoverflow答案)在我从JSFIDLE添加“minLength:0”之前对我不起作用,然后它就完美地工作了。它不仅仅是一个样式化的选择,因为用户仍然可以在框中键入并输入列表中未显示的内容。更像一个组合框。我已经限制了结果,所以这不是一个问题。好的,Mark u是对的,但我编辑了我的答案,修复了IE出现的问题,请看一下..应该是
==
而不是=但是你的想法是对的。那就行了:)谢谢。那个解决方案有点不对劲。它依赖于300毫秒的延迟。同意这不是个主意,但它有效-我愿意接受更好的建议?你可以看到我的解决方案。虽然它不仅仅是打开搜索,它还做了很多事情。它在单击或选项卡时打开,但仅在某些条件下打开,如未通过编程触发。我认为防止双重打开的关键是打开和关闭事件中的位$(this).data('isOpen',true)
,它将变量存储在元素本身上,而不是使用全局,这也让你在页面上有多个这样的功能。谢谢你的发帖-我无法轻松地将你的代码集成到我的解决方案中,但正如你所说,它看起来更优雅,所以希望有人会发现它有用。
$("#yourField").bind('focus', function(){ $(this).autocomplete("search"); } );
$("#yourField").bind('focus', function(){
if($(this).val()!=""){
$(this).autocomplete("search");
}
});
$.fn.ajaxselect = function(options) {
var settings = {
delay: 300,
sourceData: function(term) {
return {term:term};
},
sourceUrl: null,
select: function(item) {},
html: true,
minLength: 0,
autoSelect: true,
autoFocus: true,
showOnClick: null
};
if(options) $.extend(settings, options);
if(settings.showOnClick === null) settings.showOnClick = settings.minLength === 0;
$(this).autocomplete({
source: function(request, response) {
var data = settings.sourceData.call(this.element[0], request.term);
if(data === false) {
response([]);
return;
}
$.ajax({
url: settings.sourceUrl,
dataType: 'json',
data: data,
success: function(data, textStatus, $xhr) {
response(data);
},
error: function($xhr, textStatus) {
response([]);
}
});
},
focus: function(e, ui) {
return false; // don't fill input with highlighted value
},
search: function(e, ui) {
if(settings.minLength < 0 && e.hasOwnProperty('originalEvent')) return false; // don't search on keypress if minLength < 0 (use with showOnClick)
$(this).data('lastSearch', this.value);
return true;
},
select: function(e, ui) {
if(!settings.autoSelect && e.keyCode === 9) return false; // don't select highlighted item on tab unless autoSelect is enabled
if($(this).val() === $(this).data('lastSearch')) {
if(settings.select.call(this, ui.item) !== false) {
$(this).val(ui.item.value);
}
$(this).data('selectedValue',$(this).val()).trigger('change');
}
return false;
},
open: function(e, ui) {
$(this).data('isOpen', true);
},
close: function(e, ui) {
$(this).data('isOpen', false);
},
minLength: settings.minLength,
autoFocus: settings.autoFocus,
delay: settings.delay,
html: settings.html
}).bind('change.ajaxselect', function() {
$(this).toggleClass('ajax-selected', $(this).val() === $(this).data('selectedValue'));
});
if(settings.autoSelect) {
$(this).bind('autocompletechange.ajaxselect', function(event, ui) {
if($(this).val() !== $(this).data('selectedValue') && this.value.length > 0) {
var self = this;
var data = $.extend({autoSelect:1},settings.sourceData.call(this, this.value));
$(this).addClass('.ui-autocomplete-loading');
$.ajax({
url: settings.sourceUrl,
dataType: 'json',
data: data,
success: function(data, textStatus, $xhr) {
if(data.length >= 1) {
var item = $.ui.autocomplete.prototype._normalize(data)[0];
if(settings.select.call(self, item) !== false) {
$(self).val(item.value);
}
$(self).data('selectedValue',$(self).val()).trigger('change');
}
},
complete: function($xhr, textStatus) {
$(self).removeClass('.ui-autocomplete-loading');
}
});
}
});
}
if(settings.showOnClick) {
$(this).bind('click.ajaxselect', function(e) {
if(!$(this).data('clickHandled') && !$(this).data('isOpen')) {
$(this).data('clickHandled',true);
$(this).autocomplete('search','');
} else {
$(this).data('clickHandled',false);
}
}).bind('focus.ajaxselect', function(e) {
if(!$(this).data('clickHandled') && e.hasOwnProperty('originalEvent') && $(this).val() === this.defaultValue && !$(this).data('isOpen')) {
$(this).data('clickHandled',true);
$(this).autocomplete('search','');
} else {
$(this).data('clickHandled',false);
}
})
}
return $(this);
};