Вход

Просмотр полной версии : 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 никогда работать не приходилось до этого(((

Sanda
03.12.2012, 14:16
Обычного флага не хватит?

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 ниже не надо)

Sanda
03.12.2012, 14:41
Как заставить браузер игнорировать действия пользователя при выполнении 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.

Dim@
03.12.2012, 15:20
dmitry111,
вот не знаю почему, но не люблю я использовать флаги. Мне кажется это хаком, возможно я не прав))
не прав:)

dmitry111
03.12.2012, 15:34
Dim@,

просто я как думаю, что каждая переменная должна иметь значение, которое будет использоваться по назначению

в iQuery используются флаги?

У Фленагана нет ни строчки про флаги, я не нашел

Dim@
03.12.2012, 16:12
dmitry111,
флаг - переменная которая используется по значению

в iQuery используются флаги?

У Фленагана нет ни строчки про флаги, я не нашел
это настолько базовая вещь, но встречается не часто

dmitry111
03.12.2012, 21:04
Dim@,

да? тогда буду решать с помощью флага!

Dim@
03.12.2012, 21:09
dmitry111,

да?
да :) :)

nerv_
03.12.2012, 22:37
Как заставить браузер игнорировать действия пользователя при выполнении 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;
}

nerv_
04.12.2012, 13:24
Почему тебе так не нравится флаг?
флаги бывают разные :)
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 изучаю всего полгода.. может в будущем изменю свое мнение и буду использовать флаги)

nerv_
04.12.2012, 15:32
разве это может как-то привести к сбоям?
элемент твой другая программа или пользователь удалит и вуаля

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")) {
}


и все это в самом коде. Это тогда тоже надо заменить флагами