我已经准备好在内部ajax
调用的函数,该函数从MySql数据库中推断值。
然后,在.scroll()
事件中,我有一个函数使用此值来对某些divs
进行动画处理。
问题在于,当ajax调用未完成时,有时会运行.scroll()
。
function values_database(){
$.ajax({
type: "POST",
url: 'events.php',
dataType:"json",
data: {
dal_mese1: 'example'
},
success: function (result) {
var return_php = JSON.parse(JSON.stringify(result));
values.push(return_php); //VALUES FOR ANIMATIONS
}
}
$(window).scroll(function(){
var top_window2 = $(window).scrollTop();
var bottom_window2 = top_window2 + $(window).height();
var top_statistiche = $('#somedivs').offset().top;
if(((top_statistiche >= top_window2) && (top_statistiche <= bottom_window2))){
animation_somedivs();
}
});
function animation_somedivs(){
//use values global array (with inside value from database, if ajax call is finish before "this" function is run
}
我该如何解决这个问题?
(我不想使用async: false
)
非常感谢,对不起我的英语
答案 0 :(得分:2)
基本上,如果要在请求完成后运行某些内容,可以将其放入success
回调中。因此,只需对代码进行少量修改就可以完成您想要的
function values_database(){
$.ajax({
type: "POST",
url: 'events.php',
dataType:"json",
data: {
dal_mese1: 'example'
},
success: function (result) {
var return_php = JSON.parse(JSON.stringify(result));
values.push(return_php); //VALUES FOR ANIMATIONS
$(window).scroll(function(){
var top_window2 = $(window).scrollTop();
var bottom_window2 = top_window2 + $(window).height();
var top_statistiche = $('#somedivs').offset().top;
if(((top_statistiche >= top_window2) && (top_statistiche <= bottom_window2))){
animation_somedivs();
}
});
}
}
function animation_somedivs(){
//use values global array (with inside value from database, if ajax call is finish before "this" function is run
}
修改
如果您的ajax请求每次页面加载运行多次,则需要进行一些修改。
function handle_scroll() {
var top_window2 = $(window).scrollTop();
var bottom_window2 = top_window2 + $(window).height();
var top_statistiche = $('#somedivs').offset().top;
if(((top_statistiche >= top_window2) && (top_statistiche <= bottom_window2))){
animation_somedivs();
}
}
}
function values_database(){
$.ajax({
type: "POST",
url: 'events.php',
dataType:"json",
data: {
dal_mese1: 'example'
},
success: function (result) {
var return_php = JSON.parse(JSON.stringify(result));
values.push(return_php); //VALUES FOR ANIMATIONS
$(window).off('scroll', handle_scroll);
$(window).on('scroll', handle_scroll);
}
}
function animation_somedivs(){
//use values global array (with inside value from database, if ajax call is finish before "this" function is run
}
答案 1 :(得分:1)
$。ajax返回一个可以在滚动事件处理程序中检查的承诺:
var promise;
function values_database(){
promise = $.ajax({
type: "POST",
url: 'events.php',
dataType:"json",
data: {
dal_mese1: 'example'
},
success: function (result) {
var return_php = JSON.parse(JSON.stringify(result));
values.push(return_php); //VALUES FOR ANIMATIONS
}
}
$(window).scroll(function(){
$.when(promise).then(function(){
var top_window2 = $(window).scrollTop();
var bottom_window2 = top_window2 + $(window).height();
var top_statistiche = $('#somedivs').offset().top;
if(((top_statistiche >= top_window2) && (top_statistiche <= bottom_window2))){
animation_somedivs();
}
});
});
function animation_somedivs(){
//use values global array (with inside value from database, if ajax call is finish before "this" function is run
}
答案 2 :(得分:1)
Andrei解决方案为您进行的每个ajax调用绑定了一个函数来滚动事件。如上面的代码所示,您可以使用全局变量来了解ajax调用是否已完成。
var ajaxCallIsComplete = false;
function values_database(){
$.ajax({
type: "POST",
url: 'events.php',
dataType:"json",
data: {
dal_mese1: 'example'
},
success: function (result) {
var return_php = JSON.parse(JSON.stringify(result));
values.push(return_php); //VALUES FOR ANIMATIONS
ajaxCallIsComplete = true;
}
}
$(window).scroll(function(){
if (!ajaxCallIsComplete){
return;
}
var top_window2 = $(window).scrollTop();
var bottom_window2 = top_window2 + $(window).height();
var top_statistiche = $('#somedivs').offset().top;
if(((top_statistiche >= top_window2) && (top_statistiche <= bottom_window2))){
animation_somedivs();
}
});
function animation_somedivs(){
//use values global array (with inside value from database, if ajax call is finish before "this" function is run
}