• Записи 162
  • Теги 66
  • Комментарии 330

Компьютерное

Асинхронная загрузка виджетов ВКонтакте

Как известно, ВКонтакте есть несколько полезных виджетов, которые можно разместить на своем сайте, например, виджет группы или комментариев. Но есть у них недостаток: они вставляются обычным тегом script и подгружаются с сервера ВКонтакте, что ощутимо тормозит загрузку сайта целиком. А если вдруг у пользователя по каким-то причинам заблокирован домен vk.com, то он может и вообще не дождаться загрузки сайта. В результате я решил сделать загрузку асинхронной. Первое, что пришло в голову — это использовать свойства defer или async у тега script, но оказалось, что в этом случае ничего не работает вообще из-за того, что код инициализации пытается выполниться раньше, чем будет загружен скрипт и создан объект VK. Но это достаточно легко обойти:
нужно вынести код инициализации в анонимную функцию на событии onload:


<script  async="async" src="https://userapi.com/js/api/openapi.js?20" onload='VK.init({apiId: ID_сайта_ВКонтакте, onlyWidgets: true}); VK.Widgets.Group("vk_groups", {mode: 0, width: 200, height: 250}, номер_группы); VK.Widgets.Comments("vk_comments", {limit: 10, width: 400, attach: "*"});'> </script>

Для того, чтобы код сработал корректно, нужно расположить его после блока для виджетов <div id="vk_groups"></div>


Теперь подгрузка виджетов начинается параллельно отображению основной части сайта и не тормозит его! Посмотреть в действии можно на сайте SOCIOMODEL.RU (но там несколько более сложный код).


Добавлено 19 мая 2018 года. А с помощью библиотеки CondiLoader подгрузку можно сделать так:


<script> function CondiLoaderInit() {  new CondiLoader([ {   js: "http://userapi.com/js/api/openapi.js?20",    init: function () {         VK.init({apiId: ID_сайта_ВКонтакте, onlyWidgets: true});         VK.Widgets.Group("vk_groups", {mode: 0, width: 200, height: 250}, номер_группы); // вывод группы         VK.Widgets.Comments("vk_comments", {limit: 10, width: 400, attach: "*"}); // вывод комментариев    } }  ],{ /* options */ }); } </script> <script src="condi_loader.js" onload="CondiLoaderInit()" defer="defer"></script>

18 комментариев:

4X_Pro
0

Точно также можно асинхронно грузить и счетчики Google Analytics, Яндекс-Метрики и другие.
Для этого делаем еще одну функцию, например, Metrika_loader, вставляем в нее код Метрики, а вызовы добавляем после вызовов VK_loader().
С Google Analytics будет чуть сложнее: там часть кода, содержащую идентификаторы (т.е. что-то вроде var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-5518309-15']);
_gaq.push(['_trackPageview'])), нужно не помещать в функцию, а оставлять в общей части скрипта, чтобы объявленные переменные оставались глобальными.

Нет
Владислав
0

Возникла подобная проблема. Попробую реализовать ваш метод. Спасибо.

Нет
Александр
0

Спасибо огромное! работает чотко. у вас есть готовый код с метрикой?

4X_Pro
0

Готового нет. Но с Метрикой все проще на самом деле, там не надо создавать DOM-элементов в коде загрузчика, как для ВК. И получается вот что:
var Metrika_loader =function() {
// сюда помещаем код метрики
}
А дальше добавляем вызов Metrika_loader(); после VK_loader(); (это нужно сделать два раза).

Нет
Юрий
0

Подскажите, а для виджета комментов Фейсбука как модифицировать данное решение?!

4X_Pro
0

Переделать процедуру VK_loader. Если конкретно, то прописать что-то вроде oScript.src="http://connect.facebook.net/en_US/all.js#appId=ВАШ_ID&amp;xfbml=1"
А кода инициализации там, по-моему, и не нужно, хотя, если есть, его нужно поместить в функцию, которая задается в oScript.onload. Если нет, то просто закомментируйте ее.

Нет
Сергей
0

Для тех кто просил.
<b>Асинхронная загрузка виджетов Facebook</b>
В предлагаемом коде виджетов HTML5 добавим перед js.src = "//connect.facebook.net вот эту строчку js.async=true;

<b>Для Я.Метрика уже существует асинхронный код.</b>
На странице редактирования счетчика, кликните на Дополнительно и поставьте галочку асинхронный код. Скопируйте и установите код на свой сайт.
<br />

Нет
Сергей
0

На сайте sociomodel.ru в IE 10 виджеты вк не загружаются, в остальных браузерах все отлично. У всех так или только у меня?

Нет
Дмитрий
0

А я использовал вот этот метод https://varvy.com/pagespeed/defer-loading-javascript.html

Нет
Герыч
0

замечательный скрипт, но он у меня не рабатал

Нет
Кирилл
0

Всё хорошо, только в первой строчке кавычка забыта. Поэтому и не работает у некоторых..

Нет
Pashaster (cccp-blog.com)
0

Спасибо за код, помог) Никак только не пойму, почему прямое прописывание атрибута async в тег script подгрузки vk openapi не помогает...

4X_Pro
0

Очень просто: в этом случае код инициализации (там, где VK.init вызывается) броузер пытается выполнить еще до того, как загрузится скрипт openapi.js. Объект VK оказывается не определен, поэтому ничего и не работает.

Нет
Иван
0

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

Нет
Иван
0

А не всё норм, это у меня там косяк с переносом был.
НО!! т.к. сайт отдается по https, всё равно не отображались блоки ВК, пока не заменил http://userapi.com/js/api/openapi.js?20 на https

Нет
Марат
0

Здравствуйте. Скажите как можно убрать аватарки с комментариев в виджете?

4X_Pro
0

Можно попробовать включить мини-режим, но не знаю, скрываются там аватары или нет:
VK.Widgets.Comments("vk_comments", {limit: 10, width: 400, attach: "*", mini: true});
Другой вариант — скрыть их через CSS. Для этого нужно прописать в CSS что-то вроде .post_image { display: none !mportant }

4X_Pro
0

Заменил код на более простой вариант через onload.

Написать комментарий


Задать вопрос