我在我正在创建的页面上使用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源的情况下在自动完成期间执行类似的操作?
答案 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 :(得分: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;
}
};