Комментарии (5)
Дима, это решение актуально только для кнопкок соцсетей (share, like)? Или и для виджетов групп в соцсетях, которые часто добавляются на сайт (виджет группы vk, fb, виджет инстаграм)?
Подключаем виджеты социальных сетей асинхронно 22 August, 22:46
6255
5
Хороший вариант загрузки виджетов от социальных сетей на свой сайт |
Речь в статье пойдет о сайтах на Друпал 7. Но будет полезна и для тех, кто использует стандартные скрипты от социальных сетей на своих проектах.
На просторах интернета проблема асинхронной загрузки таких скриптов обсуждалась не раз. Дело в том, что сами по себе практически все предоставляемые социальными сетями скрипты виджетов уже являются асинхронными и якобы не должны негативно влиять на скорость отдачи контента посетителям сайта, но это не совсем так. Некоторые из скриптов подгружаются одновременно с загрузкой страницы, тем самым напрямую влияя на доступность содержимого страницы. В качестве примера для статьи, попробуем подключить лайки от социальных сетей на наш сайт (Вконтакте, Facebook, Twitter и Google). Причем, решим две возможные проблемы:
Файл social-button-async.js (function ($) { // Инициализация ВКонтакте после асинхронной загрузки window.vkAsyncInit = function () { VK.init({apiId: 'APP_ID', onlyWidgets: true}); // Теперь перечисляем нужные виджеты ВКонтакте // VK.Widgets.Group('vk_groups', {mode: 0, wide: 1, width: '310', height: '320'}, DIGITS); VK.Widgets.Like("vk_like", {redesign: 1, type: "mini", height: 20}); }; //Инициализация Facebook после асинхронной загрузки window.fbAsyncInit = function () { //FB.init({ appId : 'YOUR_ID', status : true, cookie : true, xfbml : true, oauth: true }); }; // Сама функция асинхронной загрузки (function (a, c, f) { function g() { var d, a = c.getElementsByTagName(f)[0], b = function (b, e) { c.getElementById(e) || (d = c.createElement(f), d.src = b, d.async = !0, e && (d.id = e), a.parentNode.insertBefore(d, a)) }; b("//vk.com/js/api/openapi.js?127"); b("//vk.com/js/api/share.js?127"); b("https://platform.twitter.com/widgets.js"); b("//connect.facebook.net/ru_RU/sdk.js#xfbml=1&version=v2.7"); b("https://apis.google.com/js/platform.js") } a.addEventListener ? a.addEventListener("load", g, !1) : a.attachEvent && a.attachEvent("onload", g) })(window, document, "script"); })(jQuery); Помещаем данный файл в папку js в вашей теме. Теперь подключим скрипт только на страницах материала 'blog'. Для этого в файле template.php используем hook_preprocess_page: function THEMENAME_preprocess_page(&$vars) { if (isset($vars['node'])) { $node = $vars['node']; if (in_array($node->type, array('blog'))) { //Поключаем кнопки социальных сетей drupal_add_js(path_to_theme() . '/js/social-button-async.js', 'file', 'footer'); } } } Все приготовления закончены. Теперь осталось вывести в нужном месте страницы html для будущих кнопок. Из доступных способов можно использовать файл node--blog.tpl.php. В нужном месте в файле добавим: Результат: |
Дима, это решение актуально только для кнопкок соцсетей (share, like)? Или и для виджетов групп в соцсетях, которые часто добавляются на сайт (виджет группы vk, fb, виджет инстаграм)?