возможность выполнения функции jQuery document ready (), занимающей очень много времени - PullRequest
3 голосов
/ 30 декабря 2008

Моя проблема в том, что иногда фрагмент JavaScript (часто Google Analytics) может загружаться очень долго, хотя это не важно, чтобы HTML был готов к «прохождению и манипулированию». Если бы я использовал следующий код:

$(document).ready(function () {
    $("p").text("The DOM is now loaded and can be manipulated.");
});

будет ли это означать, что <p> не будет заполняться до тех пор, пока не загрузится что-то вроде Google Analytics?

Что-то вроде Google Analytics, как правило, не требуется на большинстве веб-сайтов, и я часто обнаруживаю, что жду его загрузки. (Я не хочу использовать onload, потому что из-за ненадежности .)

Есть ли лучший способ или способ сказать "не жди [...]"?

Примечание. Обычно я не могу поместить код в тег <script> непосредственно перед тегом </body>, поскольку сайт основан на шаблоне. Я обычно могу редактировать только «содержимое» страницы.

Ответы [ 5 ]

6 голосов
/ 30 декабря 2008

Вы пытались загрузить аналитику Google из функции готовности? Вот ссылка , которая обсуждает динамическую загрузку скрипта. Предположительно, вы сделаете это в конце после того, как другие части вашего готового скрипта уже будут выполнены.

5 голосов
/ 12 февраля 2010

Google фактически выпустил то, что они называют Асинхронное отслеживание :

<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-XXXXX-X']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(ga);
  })();

</script>

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

1 голос
/ 04 ноября 2013

В большинстве современных браузеров вы можете написать:

<script>var _gaq = _gaq || [["_setAccount","UA-XXXXX-X"],["_trackPageview"]]; </script>
<script src="//www.google-analytics.com/ga.js" async></script>

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

Возможно, вы захотите использовать более длинную - более безопасную для старых браузеров - версию:

<script>var _gaq = _gaq || [["_setAccount","UA-XXXXX-X"],["_trackPageview"]]; </script>
<script type="text/javascript" src="//www.google-analytics.com/ga.js" async="true" defer="true"></script>

Несколько пещер:

  • в IE6 есть ошибка, которая не позволяет JS загружаться из-за отсутствующего протокола (см. http://www.paulirish.com/2010/the-protocol-relative-url/), но вы можете просто добавить используемый протокол.
  • старые браузеры не будут понимать свойство "async", поэтому будут загружаться, если либо отклонены (после загрузки страницы), либо просто загрузят его, когда обнаружат (не асинхронно).
0 голосов
/ 27 марта 2009

У меня была такая же проблема. Просто поместите эту строку при первой загрузке javascript, и после этого она отлично работает в IE:

jQuery.noConflict();
0 голосов
/ 30 декабря 2008

Это только предположение, но вы рассматривали setTimeOut ()?

$(document).ready(function()
{
   setTimeOut(function()
   {
      // Your code comes here
   }, 0); // We don't really need any delay
});

setTimeOut () имеет замечательную функцию экранирования стека вызовов, поэтому она может решить вашу проблему.

...