Ваша проблема в том, что live
не привязан к какому-либо конкретному набору элементов, он привязан к любому элементу, соответствующему определенному селектору, в момент события click. Это означает, что вы не можете использовать unbind
или off
, чтобы остановить клик от запуска обработчика.
Однако вы можете немного изменить селектор, чтобы исключить элементы с определенным классом, а затем добавить этот класс, чтобы сказать live
игнорировать ваш элемент:
$('.el a:not(.been-clicked)').live('click', function(event){
event.preventDefault();
var $this = $(this);
$.ajax({
url: $this.attr('href'),
type: 'GET',
success: function(response){
$this.addClass('been-clicked');
}
});
});
Демонстрация техники: http://jsfiddle.net/ambiguous/Deh5j/
Грег Петтит прав в комментариях о том, что live
больше не следует использовать, если вы используете jQuery 1.7 и несколько недовольны даже в 1.6. Обычно лучше использовать delegate
до 1,7 и on
, если вы используете 1,7:
$(document).on('click', '.el a:not(.been-clicked)', function() {
//...
});
Вы все еще не можете использовать unbind
или off
, чтобы остановить эту версию on
(за исключением очень узких обстоятельств, например, если у вас есть только один элемент, соответствующий .el a
, и у вас есть только один обработчик щелчков прикреплен (или если вы используете именованную функцию)). Вам все еще нужно что-то вроде вышеупомянутого трюка «добавить класс как флаг», если вы используете привязку «живого» стиля, если вы привязываетесь к определенному набору элементов, которые существуют, когда вы привязываете свой обработчик кликов, тогда вы не должны Чтобы вообще не использовать live
, вы должны использовать один из bind
, click
или on
, чтобы привязать обработчик только к этим конкретным элементам; и затем вы можете использовать unbind
или off
для отсоединения обработчиков. Или, лучше, вы просто используете one
и позволяете jQuery беспокоиться об отключении обработчика.