Я решил это следующим образом:
- поместив прослушиватель событий на родительский элемент
- , удалив класс из ссылки ТОЛЬКО когда пользователь подтвердит
- повторным нажатиемссылка после того, как я удалил класс.
function async() {
var dfd = $.Deferred();
// simulate async
setTimeout(function () {
if (confirm('Stackoverflow FTW')) {
dfd.resolve();
} else {
dfd.reject();
}
}, 0);
return dfd.promise();
};
$('.container').on('click', '.another-page', function (e) {
e.stopPropagation();
e.preventDefault();
async().done(function () {
$(e.currentTarget).removeClass('another-page').click();
});
});
$('body').on('click', function (e) {
alert('navigating somewhere else woot!')
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="container">
<a href="#" class="another-page">Somewhere else</a>
</div>
Причина, по которой я добавил прослушиватель событий к родителю, а не к самой ссылке, заключается в том, что событие jQuery on
будет привязано к элементу, пока не будет сказано иначе.Поэтому, хотя элемент не имеет класса another-page
, к нему по-прежнему подключен прослушиватель событий, поэтому для решения этой проблемы необходимо воспользоваться event delegation
.
GOTCHAS этоочень основанный на состоянии.т. е. если вам нужно спросить пользователя КАЖДЫЙ ВРЕМЯ, когда он нажимает на ссылку, вам нужно будет добавить второго слушателя, чтобы снова прочитать класс another-page
на этой ссылке.то есть:
$('body').on('click', function (e) {
$(e.currentTarget).addClass('another-page');
});
примечание вы также можете удалить прослушиватель событий на container
, если пользователь принимает, если вы делаете это, убедитесь, что вы используете namespace
события, потому что могутбыть другими слушателями на контейнере, который вы можете случайно удалить.см. https://api.jquery.com/event.namespace/ для более подробной информации.