#jquery
#jquery
Вопрос:
У меня есть следующий код:
$(document).ajaxComplete(function () {
tips();
});
Который снова запускает функцию tips при завершении события ajax! Однако функция tips ТАКЖЕ содержит ajax-запросы, поэтому она вызывает себя, что я не хочу делать!
Как я могу запускать подсказки при завершении событий ajax, ЗА исключением случаев, когда это запрос tips ajax
Ответ №1:
Функция обратного вызова для ajaxComplete()
может быть настроена для получения подробной информации о запросе ajax. Затем вы можете передать специальную настройку при вызове ajax, которая позволяет вам указывать, когда вы должны или не должны вызывать функцию tips:
function tips() {
var settings = {
is_tips_call: true
};
$.ajax('#', settings);
alert("In tips");
}
$(document).ajaxComplete(function(event, xhr, settings) {
if ('is_tips_call' in settings amp;amp; settings.is_tips_call == true) {
// Do nothing
return;
}
tips();
});
Я создал jsFiddle для этого, чтобы вы могли увидеть его в действии. Это предпочтительнее принятого ответа, подробности см. В Моих комментариях.
Комментарии:
1. Нет, необходимо проверять каждый запрос, чтобы убедиться, что все вызовы, отличные от tips, действительно перехвачены. Поскольку это асинхронные вызовы, вы не можете с уверенностью сказать, что между заданным вами временем и обратными вызовами не будет
isTips = true
isTips = false
. Если какие-либо обратные вызовы будут запущены в течение этого времени, вы пропустите это.2. Черт возьми, ты прав. 😛 Это элегантное решение. Я ненавижу ошибаться, но я признаю, что я 🙂
Ответ №2:
Редактировать
Не используйте мое решение. Используйте функцию из mmcnickle ниже.
tips();
Не могли бы вы установить флаг bool в своей функции? Что-то вроде…
var isTips = false;
function tips(callBack){
isTips = true;
// rest of your code
if(typeOf(callBack) == 'function'){
callBack();
}
}
$(document).ajaxComplete(function(){
if(!isTips){
tips(function(){
isTips = false;
});
}
});
Комментарии:
1. или просто создайте подсказки как функцию.
2. советы — это функция, что вы имеете в виду?
3. Это решение может привести к очень странному поведению и может быть источником некоторых трудно отслеживаемых ошибок. a)
isTips
Флаг никогда не устанавливаетсяfalse
снова, поэтому после первого вызоваtips()
вашajaxComplete()
обратный вызов больше не будет работать для любых вызовов ajax, независимо от того, были ли они вызваныtips()
или нет. б) Запросы Ajax, которые завершаются с момента установкиisTips
флага и повторной установки его false, не смогут вызвать обратный вызов. Смотрите Мой ответ для решения, которое позволяет проверять по запросу , вызывать или нетtips()
.4. Я бы подумал, что он сможет понять это сам. С моим решением вы всегда можете вернуть isTips значение false после вызова
tips();
ajaxComplete
функции.