JQuery自动完成帮助

我有一个自定义的JQuery自动完成控件,声明是这样的。

$('#SystemCode_Autocomplete').autocomplete({ source: [{"label":"Access","value":0},{"label":"Documentum","value":0}], //move values minLength: 1, change: function(event, ui) {// some function}, select: function(event, ui) {// some function} }); 

更改和选择事件是自定义的。 问题是如果我在文本框中键入内容然后单击提交按钮(即没有标签输出或丢失焦点),或者如果我在键入文本框后按键提交,则不会触发更改事件,它必须在我提交之前。

我希望不要在提交按钮后面放置javascript,并且理想情况下在自动完成控件本身内执行此操作。 我尝试将更改添加到模糊事件。

 ${'foo').blur(function() { $('bar').trigger('autocompletechange'); // or ${'foo').blur(function() { $('bar').change(); 

但他们都没有工作,任何人都有任何想法?

你可以尝试这样的事情:

 $('#SystemCode_Autocomplete').autocomplete({ source: [{"label":"Access","value":0},{"label":"Documentum","value":0}], //move values minLength: 1, change: function(event, ui) {/* some function */}, select: function(event, ui) {/* some function */} }).each(function(){ var self = $(this).closest("form").submit(function(e){ self.trigger("change"); // you may not need anything like this...but whatever if(!functionToCheckIfFormIsValid()){ e.preventDefault(); } }); }); 

焦点function自动完成

在将焦点移动到项目(不选择)之前,ui.item指的是焦点项目。 焦点的默认操作是将文本字段的值替换为焦点项的值,但前提是焦点事件是由键盘交互触发的。 取消此事件可防止更新值,但不会阻止菜单项被聚焦。

解决这个问题:

  $('#SystemCode_Autocomplete').autocomplete({ source: [{"label":"Access","value":0},{"label":"Documentum","value":0}], //move values minLength: 1, focus: function( event, ui ) { return false; }, select: function(event, ui) { alert('Select Event:'+ui.item.value); } }); 

所以你的问题是你必须确保在动作b之前发生了动作,并且你在两个事件处理程序之间协调时遇到了麻烦吗? 这实际上听起来像一个非常常见的UI问题,而不是限于jQuery的东西。

在其他任何情况下你会如何解决? 如果我建议你使用jQuery数据对象附加到元素然后在每个方法中进行某种信号量检查,比如在一个方法中设置一个标志,在另一个方法中检查是否设置了标志,该怎么办? ?

我就是这样做的,不管是我。

  • 演示: http //ask.altervista.org/demo/jquery-autocomplete-help/
 $(function() { var json = [{"label":"Access","value":0},{"label":"Documentum","value":0}]; $('#SystemCode_Autocomplete').autocomplete({ source: function( request, responce ) { responce( $.map( json, function( item ) { return { id: item.value, label: item.label, value: item.label } })); $.each( json, function( i, item ) { if ( request.term.toLowerCase() == item.label.toLowerCase() ) { // do something here, ex.: AJAX call or form submit... $('#submit_button').click(); } }); }, minLength: 1, change: function(event, ui) { /*alert(ui.item.label + ' ' + ui.item.id)*/ }, select: function(event, ui) {} }); }); 

好吧,我完全是为了将其更新为我们为实现它而实际做的事情。 基本上我们编辑了自动完成.js文件,让它成为我们想要的。 具体来说,我们将自己的选项添加到自动完成中,然后我们将_response方法编辑为类似的东西

 _response: function (content) { if (content.length) { content = this._normalize(content); this._suggest(content); this._trigger("open"); this.options.isInError = false; this.element.removeClass("input-validation-error"); } else { this.close(); if (this.element.val() == '') { this.options.hiddenField.val(''); } else { this.options.hiddenField.val('-1'); } if (this.options.mustBeInList) { this.options.isInError = true; this.element.addClass('input-validation-error'); } } this.element.removeClass("ui-autocomplete-loading"); }, 

这样我们就可以知道用户输入的“垃圾”是否为“垃圾”,并且控件变为红色并进入“错误”模式。 为了阻止他们回发,我们这样做

 case keyCode.ENTER: case keyCode.NUMPAD_ENTER: // when menu is open or has focus if (self.options.isInError == true) { return false; } if (self.menu.element.is(":visible")) { event.preventDefault(); } //passthrough - ENTER and TAB both select the current element case keyCode.TAB: if (!self.menu.active) { return; } self.menu.select(event); break;