У меня есть следующая и предыдущая кнопка на моей веб-странице. Они получают следующую и предыдущую страницу на доступной средней части. Ответ новой страницы происходит от сервера.
Если пользователь нажимает кнопку несколько раз, например. 5 раз, а 4 страницы пропускаются, а пятый - загружается. То, что я хочу сделать, - это отключить все события кликов, когда первый не завершен.
Я знаю, что могу отключить кнопки при первом щелчке. Но мне не нравится писать логику включения/отключения кнопок. Есть ли какой-либо код, представленный в JavaScript, который работает более разумно.
У меня есть трюк, который мне нравится совсем немного = D
Я использую этот css:
.page-load-mask {
position: fixed;
z-index: 99999;
top: 0;
height: 100%;
width: 100%;
cursor: progress;
}
с этой разметкой в любом месте страницы:
Когда что-либо загружается, покажите, что div и спрячьте его снова, когда загрузка будет выполнена.
Чтобы далее объяснить, что происходит, так это то, что .page-load-mask
будет охватывать всю страницу, когда она видна, и зависание над ней стирает курсор как загрузку. Поскольку он закрывает страницу, ничто не может быть нажато. Вы также можете адаптировать это, чтобы заполнить только раздел страницы, используя position: absolute
или другое позиционирование, ширину, высоту и т.д.
mask.style.display = 'block'
.
если вы используете панель обновления, это лучший способ сделать это. и пользователь будет знать, что процесс продолжается, и даже он не может нажать на кнопку тоже. вам просто нужно выбрать изображение обработки под кодом
<asp:UpdateProgress ID="udpProgress" AssociatedUpdatePanelID="update" runat="server">
<ProgressTemplate>
<div style="width: 2000px; height: 1000px; background-color: Gray;position: absolute; opacity:50;filter:Alpha(Opacity=50);z-index:10000">
</div>
<img style="vertical-align: middle; margin-left: 47%; margin-top: 10%; position: absolute;z-index:10001"
id="imgProgressImage" alt="Progressing" src="Images/LoadingProgress.gif" />
</ProgressTemplate>
</asp:UpdateProgress>
<asp:UpdatePanel ID="update" runat="server">
</ContentTemplate >
<ContentTemplate >
</asp:UpdatePanel>
Обычно я отключился и включил кнопку или имел bool. Однако, если вы хотите добавить и удалить прослушиватели событий.
Используйте этот код прямо из MDN.
Это приведет к удалению прослушивателя событий после нажатия кнопки.
var div = document.getElementById("div");
var listener = function (event) {
div.removeEventListener("click", listener, false);
};
div.addEventListener("click", listener, false);
По вашему комментарию, вы используете переменную в JS для хранения текущего номера страницы и увеличения/уменьшения на 1 при нажатии на кнопки "Далее" или "Предыдущий".
Это означает, что эта переменная изменяется до того, как завершится вызов ajax, что является причиной вашей проблемы. Даже если вы перейдете по маршруту "только один раз до завершения запроса", появится еще одна потенциальная проблема: когда вызов ajax завершится неудачно, то и ваша переменная изменится - и эта проблема не исчезнет, просто поместив прозрачную маску загрузки, пока ajax запрос делается.
Решение состоит в том, чтобы переместить логику изменения этой переменной в обратный вызов ajax, желательно, также возвращая в ответе ajax номер страницы, на которой вы находитесь.