AJAX запрос...
Как заставить браузер игнорировать действия пользователя при выполнении ajax?
Синхронные запросы почему-то не блокируют браузер, возможно потому что ajax запрос выполняется долго.. Проблему в том, что пользователь может послать еще один запрос, кликнув на другую ссылку, как это можно запретить?
request = new window.XMLHttpRequest();
params = 'name=' + encodeURIComponent(key);
request.open('GET', "check.php?" + params, true);
request.setRequestHeader("Content-Type", "text/plain;charset=UTF-8");
request.onreadystatechange = function () {
if (request.readyState === 4 && request.status === 200) {
//// .............
}
};
С ajax никогда работать не приходилось до этого((( |
Обычного флага не хватит?
var isRequestProcessed = false;
...
if (!isRequestProcessed) {
isRequestProcessed = true;
request = new window.XMLHttpRequest();
//..
request.onreadystatechange = function () {
//..
isRequestProcessed = false;
}
}
|
Sanda,
вот не знаю почему, но не люблю я использовать флаги. Мне кажется это хаком, возможно я не прав)) А разве по другому никак нельзя? (главное чтоб работало в ie8 -9 ниже не надо) |
Цитата:
Если нужен синхронный, надо ставить false. Ещё можно, например, вешать перекрывающий полупрозрачный div с надписью 'Loading...' |
Цитата:
Цитата:
хотя если сделать полностью прозрачным то можно, но это уж на самый крайний случай! Хотелось бы именно средствами js. |
dmitry111,
Цитата:
|
Dim@,
просто я как думаю, что каждая переменная должна иметь значение, которое будет использоваться по назначению в iQuery используются флаги? У Фленагана нет ни строчки про флаги, я не нашел |
dmitry111,
флаг - переменная которая используется по значению Цитата:
|
Dim@,
да? тогда буду решать с помощью флага! |
dmitry111,
Цитата:
|
Цитата:
![]() |
nerv_,
это я просто всю ночь пытался решить вопрос самостоятельно, к утру задал, из тех сил что остались) |
я нашел более (по моему мнению) аккуратный способ.
В моем ajax во время загрузки появляется полоска загрузки, я ее поставил как условие перед выполнением очередного запроса:
if (document.getElementId("wait")) {
return;
}
|
Цитата:
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Цитата:
Вот логика с ajax: Пользователь кликнул: 1 Если элемент wait есть: return; 2 Если элемента wait нет: включить wait запрос на сервер обработка запроса отключить wait Цитата:
1 Я помещаю в глобальные переменные только те значения, которые используются в нескольких независимых функциях 2 Переменные должны иметь только значения, используемые программой и эти значения должны быть константой и желательно понимаемые без комментариев В чем недостаток флага: 1 если скрипт небольшой то терпимо, если скрипт большой и расширяемый, то таких флагов будет все больше и больше и каждый флаг нужно будет описывать. и будет вот так: forAJAX = false, forCache = false, forLoad = false ,,,,,,,,,,,,, 2 Функция может быть на 5457 строчке, глобальные переменные принято описывать вверху. Когда глобальные переменные не содержат лишних вещей и представляют что-то вроде:
sml = document.getElementById("glob"), //////////////////// контейнер glob
set = document.getElementById("set"), ///////////////////// контейнер set
libs = document.getElementById("libs"), ///////////////////// библиотеки
то функция будет более понятна и не надо лишний раз обращаться к началу скрипта. Я вот например все свои глобальные переменные помню и даже не смотрю что у меня там как написано. Не знаю может я не прав, я js изучаю всего полгода.. может в будущем изменю свое мнение и буду использовать флаги) |
Цитата:
|
Цитата:
Пользователь может удалить элемент с помощью firebag и больше никак. Так можно и весь сайт удалить) |
Цитата:
ну а как же по другому? Ведь все чем манипулирует js - это и есть элементы. Или лучше делать так чтобы все элементы присваивались переменным в самом верху и манипулировать только этими переменными Что-то вроде:
var a = document.getElementById("x"),
b = document.getElementById("y"),
c = document.getElementsByTagName("li");
// а уже дальше не обращаться напрямую к DOM, а манипулировать только переменными:
function goA () {
}
function goB () {
}
при таком подходе все элементы назначаются вверху |
у меня много проблемных мест с использованием элементов вместо флагов
Например:
// если подсказка не открыта, открыть:
if (!document.getElementById("tooltip")) {
....
}
// если элемент не создан, создать
if (!document.getElementById("back")) {
}
и все это в самом коде. Это тогда тоже надо заменить флагами |
| Часовой пояс GMT +3, время: 22:37. |