• Записи 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 комментариев:

Показать еще 8 комментариев
Нет
Дмитрий
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.

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


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