Отложенная загрузка скрипта addthis?(или отложенная загрузка внешнего содержимого js, зависящая от уже запущенных событий)
-
09-09-2019 - |
Вопрос
Я хочу, чтобы у меня был добавь это виджет доступен для моих пользователей, но я хочу отложить его загрузку, чтобы моя страница загружалась как можно быстрее.Однако, попробовав это с помощью тега script, а затем с помощью моего метода отложенной загрузки, похоже, что он работает только с помощью тега script.В запутанном коде я вижу что-то, что выглядит так, как будто это зависит от события DOMContentLoaded (по крайней мере, для Firefox).
Поскольку событие DOMContentLoaded уже запущено, виджет не отображается должным образом.Что же делать?
Я мог бы просто использовать тег script (медленнее)...или я мог бы запустить (кроссбраузерным способом) событие DOMContentLoaded (или эквивалентное)?У меня есть ощущение, что это может быть невозможно, потому что я считаю, что (как и в jQuery) существует несколько тестов события content ready, и поэтому должно произойти несколько моделируемых событий.
Тем не менее, это интересная проблема, потому что я видел пару виджетов, которые теперь предполагают, что вы включаете их содержимое с помощью статических тегов скрипта.Было бы неплохо, если бы они написали код, который был бы более полезен разработчикам, озабоченным скоростью, но до тех пор, есть ли обходной путь?И / или какие-либо из моих предположений неверны?
Редактировать: Поскольку первый ответ на вопрос, казалось, упускал суть моей проблемы, я хотел прояснить ситуацию.
Речь идет о конкретной проблеме.Я не ищу еще один скрипт отложенной загрузки или проверяю, загружены ли какие-то зависимости скриптом. В частности эта проблема связана с
- сторонние виджеты, которые вы не контролировать и может или не может обфусцирован
- задержка загрузки внешних виджетов до тех пор, пока они не понадобятся или, по крайней мере, до по существу после того, как все остальное будет загружено, включая другие отложенные элементы
- описание того, как был написан виджет, исключает существующую типичную отложенную загрузку парадигмы
Хотя это эзотерика, я видел, как это происходит с парой виджетов, где разработчики виджетов предполагают, что вы просто хотите добавить еще один тег script внизу страницы.Я хочу сэкономить эти 500-1000 мс **, хотя, как показывают многочисленные исследования Yahoo, Google и Amazon, это важно для вашего пользовательского опыта.
** Мое тестирование с hammerhead и личный опыт показывают, что в данном случае это будет моей экономией.
Решение 2
Этот код решает проблему и экономит время загрузки, которое я искал.
После прочтения этого Публикация о том, как большинство современных библиотек js реализуют тесты для события, загруженного dom.Я потратил некоторое время на обфускацию кода и смог определить, что addthis использует комбинацию упомянутого метода doscroll, таймеров и события DOMContentLoaded для различных браузеров.Поскольку только тем браузерам, которые зависят от события DOMContentLoaded, в любом случае потребуется следующий код:
if( document.createEvent ) {
var evt = document.createEvent("MutationEvents");
evt.initMutationEvent("DOMContentLoaded", true, true, document, "", "", "", 0);
document.dispatchEvent(evt);
}
а остальное зависит от тестирования таймеров на наличие определенных свойств, мне нужно было учесть только этот один случай, чтобы иметь возможность ленивой загрузки этого внешнего JS-контента вместо использования статических тегов скрипта, таким образом экономя время, на которое я надеялся.:)
Другие советы
Самое простое решение - установить параметр дом готов к 1 при встраивании добавьте этот скрипт на свою страницу.Вот такой пример:
<script type="text/javascript"
src="http://s7.addthis.com/js/250/addthis_widget.js#username=addthis&domready=1">
</script>
Я протестировал это в IE, Firefox, Chrome и Safari, и все работало нормально.Доступна дополнительная информация о параметрах конфигурации addthis здесь.
Редактировать:Если цель состоит просто в том, чтобы сначала загрузить другой ваш контент, попробуйте поместить <script>
теги в нижней части вашей страницы.Он по-прежнему сможет перехватывать DOMContentLoaded, и содержимое, которое появляется раньше, будет загружено раньше скрипта.
Оригинал:
в дополнение к загрузке в DOMContentLoaded, вы могли бы заставить его загрузиться, если для определенного параметра установлено значение true.например ,
var isDOMContentLoaded = false;
document.addEventListener("DOMContentLoaded",function() { isDOMContentLoaded = true; }, false);
затем добавьте в другой файл скрипта
if (isDOMContentLoaded) loadThisScript();
Редактировать в ответ на комментарии:
Загрузите скрипт и запустите функцию, которую запускает прослушиватель DOMContentLoaded.(Читать скрипт, если вы не уверены, какая функция вызывается).
например ,
var timerID;
var iteration=0;
function checkAndLoad() {
if (typeof loadThisScript != "undefined") {
clearInterval(timerID);
loadThisScript();
}
iteration++;
if (iteration > 59) clearInterval(timerID);
}
var extScript = document.createElement("script");
extScript.setAttribute("src",scriptSrcHere);
document.head.appendChild(extScript);
timerID = setInterval(checkAndLoad,1000);
Описанное выше будет пытаться один раз в секунду в течение 60 секунд проверять, доступна ли нужная вам функция, и, если да, запускать ее
AddThis содержит раздел о как асинхронно загружать свои инструменты.
Текущее "лучшее" решение:
<script type="text/javascript" src="//s7.addthis.com/js/300/addthis_widget.js#pubid=[YOUR PROFILE ID]" async="async"></script>