Показывать всплывающий div при разговоре с сервером AJAX

Я пытаюсь показать всплывающее окно в центре экрана, пока мой веб-сайт общается с моим сервером AJAX. Поскольку выполнение некоторых операций занимает пару секунд, я хочу дать своим пользователям визуальный сигнал о том, что операция выполняется. Например, вы можете создать музыкальный плейлист на моем сайте. Когда создается список воспроизведения, я хочу, чтобы во всплывающем окне появлялся div, в котором говорилось, что он создает список воспроизведения на моих серверах.

Я сделал jsfiddle, чтобы показать функции, которые я использую для этого, но я имеющий немного противоположный эффект. В скрипте он показывает всплывающее окно после того, как пытается поговорить с сервером (он не сможет поговорить с сервером, потому что я отрицаю что-либо за пределами моего домена), но, поскольку он не может поговорить с сервером, он никогда не вызывает hide_popup().

На моих серверах он даже не показывает всплывающее окно (если я не вызываю alert() сразу после вызова show_popup()).

Я не уверен, почему это происходит, но я просто хочу
1. Показать всплывающее окно
2. Выполнить мой AJAX-вызов
3. Скрыть всплывающее окно

Какие-либо предложения?


person jas7457    schedule 17.09.2013    source источник
comment
Вы используете async = false. Этот вопрос о переполнении стека (stackoverflow.com/questions/16000803/) может вам помочь.   -  person functionoid    schedule 17.09.2013
comment
Ваш пример jsfiddle не работает, потому что вы выполняете междоменный запрос. Вероятно, это тоже причина, по которой у вас возникает обратный эффект. У вас есть неперехваченная ошибка: NetworkError: DOM Exception 19, которая останавливает javascript, поэтому всплывающее окно не может быть скрыто. Во всяком случае, я считаю, что ваш подход к этой проблеме правильный.   -  person Entity Black    schedule 17.09.2013
comment
@Windkiller подход на самом деле неверный.   -  person Abhitalks    schedule 17.09.2013


Ответы (2)


Есть несколько проблем с тем, как вы написали свой код. Вот пара из них:

(1.) Позвоните:

var response = get_server_response("action=createPlaylist&name=" + name, false);

Вы ожидаете немедленного ответа, которого не будет при вызове AJAX. Кроме того, вы передаете false для параметра async, что фактически делает его вызовом sync. Вот почему ваш код просто ждет, прежде чем делать что-либо еще.

(2.) Реализация:

xmlhttp.onreadystatechange = function()
{
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
    {
        response = xmlhttp.responseText;
    }
}
xmlhttp.open("POST", ajax_server, async);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send(url);
return response;

Вы только кэшируете результат в response, а не обрабатываете его при отслеживании onreadystatechange. Фактически вы обрабатываете его сразу после вызова, который будет выполняться после вызова, а не при получении ответа. Здесь нет необходимости возвращать ответ.

(3.) всплывающее окно:

Вы не используете отображение / скрытие в подходящем месте.

Решение:

Я бы посоветовал вам запустить обратный вызов при отслеживании onreadystatechange, реализовав функцию. Показывать всплывающее окно непосредственно перед тем, как совершить сетевой вызов. Спрячьте его внутри функции обратного вызова в зависимости от readyState и status.

Вот вам рабочая скрипка: http://jsfiddle.net/nDNXc/549/

Надеюсь, это поможет.

person Abhitalks    schedule 17.09.2013
comment
Думаю, он хочет сделать звонок синхронным. Например, вы не должны позволять посетителям загружать другой плейлист, пока первый еще не загружен ... - person Entity Black; 17.09.2013

Сначала я рекомендую вам использовать общую библиотеку для вызовов Ajax, например. jQuery.ajax.

Во-вторых, узнайте об асинхронном Javascript. Ваш вызов get_server_response () немедленно возвращается, не дожидаясь завершения вашего запроса Ajax. Взгляните на полный параметр в jQuery.ajax. Он принимает функцию, которая вызывается, когда ваши запросы завершаются - правильное место, чтобы скрыть ваше сообщение!

person ToniTornado    schedule 17.09.2013
comment
Мой вызов get_server_response() не должен возвращаться немедленно, потому что я создал переменную с именем async и установил для нее значение false. Это заставляет его дождаться завершения отправки перед возвратом значения. - person jas7457; 17.09.2013
comment
Он сделал звонок синхронным. Итак, javascript ошеломлен до тех пор, пока вызов не будет разрешен. Но он сбрасывает ошибку, поэтому он не работает. Его подход правильный. - person Entity Black; 17.09.2013