Неблокирующий Javascript - PullRequest
12 голосов
/ 10 июля 2009

Мне интересно, возможно ли загрузить javascript таким образом, чтобы он не блокировал взаимодействие с пользователем. Я не уверен, как добиться того же, но я ищу кросс-браузерное решение. Мне интересно, если кто-то может направить меня в правильном направлении. Размещение js внизу страницы не очень хорошо работает.

Спасибо за ваше время.

Ответы [ 7 ]

14 голосов
/ 10 июля 2009

Javascript работает в однопоточном режиме, поэтому, если у вас массивные вызовы Javascript, скажем, с такими библиотеками, как ExtJS, это нормально, что он может быть медленным. Однако вы можете рассмотреть следующие варианты:

Прежде всего, постарайтесь максимально оптимизировать код.

Затем вы можете использовать таймеры в Javascript для имитации асинхронной работы. Вот хороший пример того, как это сделать: http://ejohn.org/blog/how-javascript-timers-work/

Если вам нужна дополнительная информация, вот несколько дополнительных советов о том, как попытаться сократить время зависания Javascript.

http://debuggable.com/posts/run-intense-js-without-freezing-the-browser:480f4dd6-f864-4f72-ae16-41cccbdd56cb

Удачи!

3 голосов
/ 10 июля 2009

Цитирование этот ответ :

Запросы ресурсов Javascript действительно блокирует, но есть способы вокруг этого (для остроумия: DOM вводят теги скрипта в голове и AJAX запросы) которые не видя Сама страница, вероятно, будет то, что здесь происходит.

Включая несколько копий одного и того же Ресурс JS крайне плох, но не обязательно смертельно, и это типично для большие сайты, которые могли бы быть аккредитованный от работы отдельных команды, или просто старый плохой код, планирование или обслуживание.

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

Вы можете взглянуть на запись в блоге YUI о неблокирующем JavaScript .

2 голосов
/ 10 июля 2009

Когда страница загружается, она может одновременно загружать только 2 файла javascript одновременно, поэтому попытка уменьшить количество файлов javascript и уменьшить их размер (с помощью Minification, obsfucation и GZipping) поможет в процессе загрузки.

Использование обратных вызовов в вашем javascript также поможет с неблокирующими элементами во время работы javascript.

Примером в jQuery будет

$('#id').click(function(){
  $.post('url',data,function(callbackdata){//do something
         });

});
2 голосов
/ 10 июля 2009

Полагаю, вы можете использовать Workers, но, похоже, это реализовано в FF3.5, но немного других.

См. http://hacks.mozilla.org/2009/07/working-smarter-not-harder/

1 голос
/ 03 февраля 2010

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

Я считаю очень полезным предотвращать вмешательство ошибок javascript в связанные события. Например, чтобы установить обработчик отправки в форме:

$('#form').submit(function() {
  setTimeout(function() {
    // Submit handler function, i.e. do an ajax submission of the form
    $.ajax(...etc...);
  }, 1);
  // Return false before the handler executes, ensuring the form won't manually submit
  // in the event of a js error in the handler
  return false;
});
0 голосов
/ 25 мая 2012

Взгляните на этот jQuery плагин (http://code.google.com/p/funky-jq-plugins/wiki/nonblocking).

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

Чао сейчас

0 голосов
/ 10 июля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...