2012-04-09 64 views
6

我在创建的页面上使用jquery-ui自动完成功能。在同一页面上,我正在进行一些Ajax事件。在其他ajax事件期间,我正在为我的页面添加一个叠加层,以便该网站上的所有链接不再可供用户点击。我不希望在自动填充过程中发生这种情况。

自动完成:

$(function() { 
    $("#search_input").autocomplete({ 
    source: '/search_autocomplete/',}); 
}); 

AJAX:

$.ajax({ 
    url: "/ajax_login/", 
      login_user: $("#login_user").val(), 
      password: $("#login_password").val(), 
      }); 

ajaxStart:

$("#loading_gif").ajaxStart(function() { 
    $("#overlay").show(); 
    $(this).show(); 
}); 

为了防止ajaxstart功能从在阿贾克斯比赛时,就没有必要执行。我加

global:false, 

到相应的ajaxfunctions。我怎样才能在自动完成期间做类似的事情而不用改变jquery-ui源代码?

回答

1

如果你想$.ajax()工作以某种方式的时间,但现在所有的时候,那么你可能不应该改变其缺省行为。

我建议创建一个函数,将ajax请求包装在一个函数中,该函数在适当的时候启用和禁用覆盖。在要使用叠加层的地方调用此函数,并使用普通的$.ajax()作为自动填充。

5

为此,您必须省略与source的简写呼叫,然后像这样更改呼叫。

$('#search_input').autocomplete({ 
    source: function (request, response) { 
     var DTO = { "term": request.term }; 
     //var DTO = { "term": $('#search_input').val() }; 
     $.ajax({ 
      data: DTO, 
      global: false, 
      type: 'GET', 
      url: '/search_autocomplete/', 
      success: function (jobNumbers) { 
       //var formattedNumbers = $.map(jobNumbersObject, function (item) { 
       // return { 
       //  label: item.JobName, 
       //  value: item.JobID 
       // } 
       //}); 
       return response(jobNumbers); 
      } 
     }); 
    } 
    //source: '/search_autocomplete/' 
}); 

这个长手方法的优点是

  1. 您可以通过多个参数。另外参数名称不应该是术语。
  2. 简写符号需要一串字符串。在这里你可以返回一个对象数组。
1

我同意naveen的回答是最好的解决方案。在我的情况下,需要更改的大量代码不符合成本效益,因为我们正在进行重写,我们需要一个短期解决方案。

你可以重写jQuery UI中的ajax调用,我复制处理AJAX请求的_initSource函数调用的源代码。然后只需将全局:false添加到$ .ajax选项。这里的代码基于jquery-ui 1.9.2,您可能需要为您的版本找到正确的源代码。

$.ui.autocomplete.prototype._initSource = function() { 
    var array, url, 
     that = this; 
    if ($.isArray(this.options.source)) { 
     array = this.options.source; 
     this.source = function(request, response) { 
      response($.ui.autocomplete.filter(array, request.term)); 
     }; 
    } else if (typeof this.options.source === "string") { 
     url = this.options.source; 
     this.source = function(request, response) { 
      if (that.xhr) { 
       that.xhr.abort(); 
      } 
      that.xhr = $.ajax({ 
       url: url, 
       data: request, 
       dataType: "json", 
       global: false, 
       success: function(data) { 
        response(data); 
       }, 
       error: function() { 
        response([]); 
       } 
      }); 
     }; 
    } else { 
     this.source = this.options.source; 
    } 
};