Отключить функцию jquery после 1 щелчка, чтобы предотвратить несколько исполнений
У меня есть следующая функция, которая извлекает больше комментариев за пределы 20, которые отображаются по умолчанию
$('.more_comments_link').live('click', function() {
$(".more_comments_link").text("Fetching More Comments ...");
var ajaxOpts = {
type: "get",
url: "ajax_getcomments.php",
dataType: 'json',
data: "&itemid=<? echo $id; ?>&type=1&owner=<? echo $event["data"]["e_creator"]; ?>&more=1",
success: function(data) {
$('.discussion-more').after(data);
$(".discussion-more").hide();
}
};
$.ajax(ajaxOpts);
return false;
});
он работает, единственная проблема заключается в том, что пользователь может быстро нажать кнопку 3 раза, и он отправит 3 запроса на ajax_getcomments.php, каждый раз получая одинаковый результат.
Я попробовал добавить
$(".more_comments_link").unbind('click');
но он ничего не делает.
Исходный набор результатов также загружается с помощью jquery, поэтому Im использует .live(click'
не уверен, имеет ли он какое-либо отношение к тому, почему он не работает.
Ответы
Ответ 1
live
не работает с unbind
- вам нужно die
.
Однако есть лучшее решение. Поскольку вы, вероятно, хотите иметь возможность обновлять контент более одного раза, вы можете установить переменную, чтобы увидеть, выполняется ли в настоящий момент запрос:
var requestRunning = false;
$('.more_comments_link').live('click', function () {
if (requestRunning) { // don't do anything if an AJAX request is pending
return;
}
$(".more_comments_link").text("Fetching More Comments ...");
var ajaxOpts = {
type: "get",
url: "ajax_getcomments.php",
dataType: 'json',
data: "&itemid=<? echo $id; ?>&type=1&owner=<? echo $event["
data "]["
e_creator "]; ?>&more=1",
success: function (data) {
$('.discussion-more').after(data);
$(".discussion-more").hide();
},
complete: function() {
requestRunning = false;
}
};
requestRunning = true;
$.ajax(ajaxOpts);
return false;
});
Ответ 2
Все эти решения сложны для очень простого решения; используйте .one() в соответствии с документацией здесь:
http://api.jquery.com/one/
Просто измените live
на one
. См. Ниже:
$('.more_comments_link').one('click', function() {
Ответ 3
Вы можете использовать .die()
для отвязывания событий .live()
.
Или установите флаг в другом месте, в котором говорится, что запрос выполняется, и проверьте, что в начале обработчика кликов.
Ответ 4
Попробуйте использовать отключенное ключевое слово. Таким образом, вам не нужно отменить функцию, вы просто отключите ее от нажатия:
$('.more_comments_link').live('click', function() {
$(this).attr("disabled", true);
$(".more_comments_link").text("Fetching More Comments ...");
var ajaxOpts = {
type: "get",
url: "ajax_getcomments.php",
dataType: 'json',
data: "&itemid=<? echo $id; ?>&type=1&owner=<? echo $event["data"]["e_creator"]; ?>&more=1",
success: function(data) {
$('.discussion-more').after(data);
$(".discussion-more").hide();
}
};
$.ajax(ajaxOpts);
return false;
});
Ответ 5
В зависимости от вашего варианта использования вам может не понадобиться live, и в этом случае one будет делать именно то, что вы хотите.
Ответ 6
$('.more_comments_link').live('click', function(e) {
if($(e.target).data('oneclicked')!='yes') {
$(this).text("Fetching More Comments ...");
var ajaxOpts = {
type: "get",
url: "ajax_getcomments.php",
dataType: 'json',
data: "&itemid=<? echo $id; ?>&type=1&owner=<? echo $event["data"]["e_creator"]; ?>&more=1",
success: function(data) {
$('.discussion-more').after(data);
$(".discussion-more").hide();
}
};
$.ajax(ajaxOpts);
return false;
}
$(e.target).data('oneclicked','yes');
});
Ответ 7
Для меня это сработало:
$('.more_comments_link').live('click', function() {
if(e.handled !== true) // This will prevent event firing more than one time
{
e.handled = true;
//your code here...
}
});
Ответ 8
Мое решение, работающее глобально по всему запросу ajax, если это активный запрос, новый с тем же URL-адресом будет прерван. Хорошо работает.
var activeRequests = [];
$(document).ajaxComplete(function(e, jqxhr, settings) {
var i = activeRequests.indexOf(settings.url);
if (i != -1) {
setTimeout(function(){ activeRequests.splice(activeRequests.indexOf(settings.url), 1); }, 75);
}
});
$(document).ajaxSend(function(e, jqxhr, settings) {
var i = activeRequests.indexOf(settings.url)
if (i != -1) {
jqxhr.abort();
activeRequests.push(settings.url);
}
});
Ответ 9
Вы можете использовать:
$('element').off()
Это отключит любое событие вашего компонента, который вы слушаете.
Ответ 10
Вы можете использовать один клик по кнопке над веб-страницей
$('button id or classs').one('click',function(){
});