Просмотр полной версии : AJAX запрос...
dmitry111
03.12.2012, 14:04
Как заставить браузер игнорировать действия пользователя при выполнении 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;
}
}
dmitry111
03.12.2012, 14:24
Sanda,
вот не знаю почему, но не люблю я использовать флаги. Мне кажется это хаком, возможно я не прав))
А разве по другому никак нельзя? (главное чтоб работало в ie8 -9 ниже не надо)
Как заставить браузер игнорировать действия пользователя при выполнении ajax?
Синхронные запросы почему-то не блокируют браузер, возможно потому что ajax запрос выполняется долго..
С ajax никогда работать не приходилось до этого(((
Таки обещают, что request.open('GET', "check.php?" + params, true) задаёт асинхронный запрос (ссылка (http://msdn.microsoft.com/en-us/library/ie/ms536648%28v=vs.85%29.aspx))
Если нужен синхронный, надо ставить false.
Ещё можно, например, вешать перекрывающий полупрозрачный div с надписью 'Loading...'
dmitry111
03.12.2012, 15:17
Таки обещают, что request.open('GET', "check.php?" + params, true) задаёт асинхронный запрос (ссылка)
Если нужен синхронный, надо ставить false.
синхронный почему-то не срабатывает (пробовал в firefox)
Ещё можно, например, вешать перекрывающий полупрозрачный div с надписью 'Loading...'
этот не подходит по дизайну ((
хотя если сделать полностью прозрачным то можно, но это уж на самый крайний случай!
Хотелось бы именно средствами js.
dmitry111,
вот не знаю почему, но не люблю я использовать флаги. Мне кажется это хаком, возможно я не прав))
не прав:)
dmitry111
03.12.2012, 15:34
Dim@,
просто я как думаю, что каждая переменная должна иметь значение, которое будет использоваться по назначению
в iQuery используются флаги?
У Фленагана нет ни строчки про флаги, я не нашел
dmitry111,
флаг - переменная которая используется по значению
в iQuery используются флаги?
У Фленагана нет ни строчки про флаги, я не нашел
это настолько базовая вещь, но встречается не часто
dmitry111
03.12.2012, 21:04
Dim@,
да? тогда буду решать с помощью флага!
Как заставить браузер игнорировать действия пользователя при выполнении ajax?
твой вопрос печалит мастера йоду http://www.yaplakal.com/uploads/post-28-13486568321514.jpg
dmitry111
03.12.2012, 23:17
nerv_,
это я просто всю ночь пытался решить вопрос самостоятельно, к утру задал, из тех сил что остались)
dmitry111
04.12.2012, 12:05
я нашел более (по моему мнению) аккуратный способ.
В моем ajax во время загрузки появляется полоска загрузки, я ее поставил как условие перед выполнением очередного запроса:
if (document.getElementId("wait")) {
return;
}
Почему тебе так не нравится флаг?
флаги бывают разные :)
http://domflagov.com/content/files/catalog1/tn/zavdv_flag_1327784924.jpg
http://domflagov.com/content/files/catalog1/tn/piratskiyflagvkievekupit_1322057742.jpg
http://domflagov.com/content/files/catalog1/tn/flagukrainiy_1346677026.jpg
http://domflagov.com/content/files/catalog1/tn/flagrossii_1322050804.jpg
http://domflagov.com/content/files/catalog1/tn/flaggermanykupit_1322233311.jpg
http://domflagov.com/content/files/catalog1/tn/flag_unitedstatesofamerica_1325160885.gif
http://domflagov.com/content/files/catalog1/tn/Italy_flag_1327869021.gif
http://domflagov.com/content/files/catalog1/tn/pionerskiyflag_1325682374.jpg
dmitry111
04.12.2012, 14:40
Ты таким образом логику завязываешь на интерфейс.
а что в этом плохого? Я часто этим злоупотребляю, разве это может как-то привести к сбоям?
Вот логика с 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 изучаю всего полгода.. может в будущем изменю свое мнение и буду использовать флаги)
разве это может как-то привести к сбоям?
элемент твой другая программа или пользователь удалит и вуаля
dmitry111
04.12.2012, 15:51
элемент твой другая программа или пользователь удалит и вуаля
Ну если это сделает другая программа, то это уже конфликты на уровне программ, что невозможно, потому как в моем случае - сайт это одна программа
Пользователь может удалить элемент с помощью firebag и больше никак. Так можно и весь сайт удалить)
dmitry111
04.12.2012, 18:13
Твоя логика становится неотделима от интерфейса, а интерфейс неотделим от логики, меняя что-то одно, ты вынужден менять и всё остальное, ферштейн?
ну а как же по другому? Ведь все чем манипулирует js - это и есть элементы.
Или лучше делать так чтобы все элементы присваивались переменным в самом верху и манипулировать только этими переменными
Что-то вроде:
var a = document.getElementById("x"),
b = document.getElementById("y"),
c = document.getElementsByTagName("li");
// а уже дальше не обращаться напрямую к DOM, а манипулировать только переменными:
function goA () {
}
function goB () {
}
при таком подходе все элементы назначаются вверху
dmitry111
04.12.2012, 18:20
у меня много проблемных мест с использованием элементов вместо флагов
Например:
// если подсказка не открыта, открыть:
if (!document.getElementById("tooltip")) {
....
}
// если элемент не создан, создать
if (!document.getElementById("back")) {
}
и все это в самом коде. Это тогда тоже надо заменить флагами
vBulletin® v3.6.7, Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot