防止在jquery-ui自动完成期间执行$ .ajaxStart()

时间:2012-04-09 22:54:11

标签: jquery-ui jquery

我在我正在创建的页面上使用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();
});

防止在没有必要的ajax事件期间执行ajaxstart函数。我添加

global:false,

到相应的ajaxfunctions。如何在不更改jquery-ui源的情况下在自动完成期间执行类似的操作?

3 个答案:

答案 0 :(得分: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. 您可以传递多个参数。参数名称也不必是term。
  2. 简写符号需要一个字符串数组。在这里你也可以返回一个对象数组。

答案 1 :(得分:1)

如果您希望$.ajax()以某种方式工作大多数,但现在所有时间,那么您可能不应该更改其默认行为

我建议在一个函数中创建一个包装ajax请求的函数,该函数在适当的时候启用和禁用叠加。将此功能调用到您希望使用叠加层的位置,并使用纯$.ajax()进行自动填充。

答案 2 :(得分:1)

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

你可以在jQuery UI中覆盖ajax调用,我复制了处理AJAX请求的_initSource函数调用的源代码。然后简单地将global: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;
    }
};