2009-12-16 1 views
32

Я делаю программу планирования лаборатории с поддержкой AJAX, а некоторые операции ajax выполняются не совсем быстро.Как заставить AJAX запускать индикатор загрузки браузера

В Gmail, когда вы переходите в папку «Входящие», отправляете сообщение и т. Д. Браузер действует так, как будто он загружается (в FF кнопка останова становится включенной, появляется индикатор выполнения), но она не находится на новой странице, это сделанный через AJAX.

Как они это делают? У меня есть небольшой индикатор, но было бы неплохо следить за тем, чтобы браузер работал так, как будто он загружается. Есть идеи?

+0

, что ваш вопрос? вы пытаетесь добавить «загружающий» образ на веб-страницу? – Jason

+5

Нет, я пытаюсь запустить загрузку браузера. (Когда вы загружаете страницу, появляется индикатор выполнения и т. Д.) –

+0

Единственное, о чем я могу думать, поскольку я не знаю, что стандартный API для индикатора браузера триггера должен был запускать запрос XHR, а затем добавить элемент iframe в страницы, загрузите в него страницу «ping» (страница, которая не будет отвечать до тех пор, пока XHR не будет завершена, что означает, что, вероятно, требуется блокировка на стороне сервера, например сеансы) и помещают обработчики событий в этот 'iframe' для обработки отмена загрузки браузера. И не забудьте зафиксировать историю, как только «iframe» закончил загрузку – Xenos

ответ

2

This article содержит подробную информацию о различных типах запросов и выводит ли они индикаторы занятости, такие как индикатор выполнения.

+0

Хммм. интересно. есть ли какая-то функция, которую я могу вызвать, что-то для нее запускает (я не хочу менять все свои типы запросов и прочее)? –

+0

К сожалению, статья устарела, по крайней мере, для Chrome. – brillout

8

Думаю, this - ваш ответ. (Метод Reverse-AJAX или «Медленная нагрузка» от Obviously.com)

Похож на метод GMail и Facebook (браузер показывает страницу как «погрузка» с иконками загрузки и т. Д. - это просто симуляция, потому что есть background ajax request) :)

+2

Я не понимаю отношения между этим вопросом и техникой Reverse-AJAX, о которой вы говорили! –

+1

Идея с этим ответом заключается в создании iframe на странице, где iframe src указывает на страницу, которая загружается навсегда. Это приведет к появлению индикаторов загрузки браузера до тех пор, пока этот iframe пытается загрузить. –

+0

Техника iframe не работает в Chrome – brillout

5

Я нашел связанный ответ здесь: Browser continues 'loading' after ajax request finishes.

Вы можете создать iframe и открыть и закрыть его contentDocument, который, кажется, запускает и останавливает собственную загрузку анимации браузера. См. Пример здесь: http://jsfiddle.net/KSXkS/1/.

+6

Только кажется, что работает в Firefox. Не работает в Chrome 20, IE 9. – josh3736

+0

Не работает и в Safari 7. – nilfalse

+0

Downvote как не работает кросс-браузер. – brillout

0

Я считаю, что вам нужно что-то подобное.

Я добавил API, чтобы вытащить геоданные github.com (не связанные, но я думаю, что это служит для образца API).

Это просто JavaScript и JQuery код для отображения/скрытия указателя загрузки при выполнении запроса AJAX.

$('#btn').click(function() { 
 
    $('#overlay').show(); 
 
    $.ajax('https://freegeoip.net/json/github.com').then(function(response) { 
 
    $('#overlay').hide(); 
 
    $('#country').html(response.country_name); 
 
    }); 
 
});
body { 
 
    padding: 0; 
 
    margin: 0; 
 
} 
 

 
#overlay { 
 
    position: fixed; 
 
    width: 100%; 
 
    height: 100%; 
 
    display: flex; 
 
    align-items: center; 
 
    top: 0; 
 
    background-color: rgba(255, 255, 255, 0.7); 
 
} 
 

 
.plus { 
 
    display: flex; 
 
    margin: 0 auto; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="overlay" style="display:none"> 
 
    <div class="plus"> 
 
    <img src="https://loading.io/assets/img/landing/curved-bars.svg" alt="loading"/> 
 
    </div> 
 
</div> 
 

 
<div> 
 
    <button id="btn">Perform AJAX Operation</button> 
 
    <div> 
 
    Country: <span id="country"></span> 
 
    </div> 
 
</div>

+0

Спасибо за ответ, но я хочу использовать индикацию браузера, а не пользовательскую. Downvote, потому что OP совершенно ясно об этом. – brillout

+0

, то вы можете добавить свойство курсора в 'wait' на теле. –

+0

Это по-прежнему обычное поведение, а не стандартное «собственное» поведение браузера. – brillout

4

Многие пользователи даже не понимают или не замечать собственные индикаторы загрузки браузера. Если это действительно долгая загрузка, лучшим пользовательским интерфейсом будет указание ее как части вашего веб-приложения. Помните, что контекст - это король, и это возможность сообщить вашему пользователю, что происходит, и какие функции все еще доступны.

Если весь пользовательский интерфейс становится недействительным во время запроса, то наложение с индикатором загрузки является подходящим. Немного непрозрачный накладной обменивается с пользователем без разрушительного разрыва в зрении.

Если вам просто нужно показать, что запрос запущен и работает, лучше всего использовать прядильщик рядом с кнопкой, которая начала запрос. При успехе счетчик может быть заменен зеленой галочкой или другим общим индикатором, который исчезает через короткий период.

Это общие шаблоны, найденные во многих приложениях Google.

+2

Я ценю ответ, но у меня есть веские причины, по которым я хочу использовать индикацию браузера вместо пользовательской. – brillout

+1

Да, с точки зрения пользовательского интерфейса это имеет гораздо больший смысл. Использование кнопок браузера имеет смысл, если это действительно способ отменить запрос или список, чтобы сообщить своей странице об отмене. Что мне было бы очень интересно! –

-1

Возможное решение - использовать iframe для запуска загрузки. Но, основываясь на предыдущем ответе, метод iframe не может работать на хроме.

Ваша потребность в том, чтобы показать значок загрузки в браузере, поэтому я думаю, что другим способом является создание fake loading icon.

Вы можете обновить значок браузера вручную. Есть несколько руководств по обновлению значка браузера.

А затем попробуйте сделать анимированный значок. Большая часть браузера не поддерживает значок gif, поэтому вам нужно обновить значок за каждые несколько секунд.

Это демонстрационный код:

var favicon_images = []; 
for (var i = 1; i <= 12; i++) 
    favicon_images.push('./icon/' + i + '.png'); 

var image_counter = 0; 

setInterval(function() { 
    var link = document.querySelector("link[rel*='icon']") || document.createElement('link'); 
    link.type = 'image/x-icon'; 
    link.rel = 'shortcut icon'; 
    link.href = favicon_images[image_counter]; 
    document.getElementsByTagName('head')[0].appendChild(link); 

    if(image_counter == favicon_images.length -1) 
     image_counter = 0; 
    else 
     image_counter++; 
}, 150); 

Я быстро создать демо. Demo

С помощью этой демонстрации вы можете обнаружить, что анимация значков не работает плавно. Это потому, что каждый раз, когда мы обновляем значок, браузер снова запрашивает значок.

Поэтому преобразуйте изображение в формат base64, чем оно работает плавно.

Base64 demo

Теперь вам просто нужно найти значок загрузки же с Chrome и другими популярными браузерами, а затем вызвать fake loading при вызове Ajax.


Здесь я вставляю некоторые значок изменения учебника:

+1

Downvoting, потому что это не то, что спросил ОП. Но давая вам щедрость, потому что ваш ответ лучше остальных. – brillout