Кнопки социальных сетей, HTML 5, атрибут data и асинхронная загрузка javascript

от автора

Давно уже планировал установить на свой сайт кнопки социальных сетей. Наконец нашел время для этого, проблема усугублялась тем, что я сам не являюсь пользователем социальных сетей, хотя против ничего не имею.

Первым делом начал собирать информацию, ее довольно много, есть правда и устаревшая. Например, Twitter поменял уже ссылку, старая twitter.com/share, а новая twitter.com/intent/tweet, у Google ссылка «www.google.com/buzz/post», уже давно не работает, вместо нее plus.google.com/share. Конечно, это общеизвестные факты, но, похоже, все-таки не все об этом знают и предлагают «шарить» на старые ссылки.

В общем, ознакомившись с темой, решил взять кнопки в первоисточнике:
Twitter — twitter.com/about/resources/buttons
Facebook — developers.facebook.com/docs/reference/plugins/like/
Vkontakte — vk.com/developers.php?o=-1&p=Like
Google+ — developers.google.com/+/plugins/+1button/

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

Twitter:

<a href="https://twitter.com/share" class="twitter-share-button" data-lang="ru">Твитнуть</a> 

<script> !function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script> 

Facebook:

<div id="fb-root"></div> 

<script>(function(d, s, id) {   var js, fjs = d.getElementsByTagName(s)[0];   if (d.getElementById(id)) return;   js = d.createElement(s); js.id = id;   js.src = "//connect.facebook.net/ru_RU/all.js#xfbml=1";   fjs.parentNode.insertBefore(js, fjs); }(document, 'script', 'facebook-jssdk'));</script> 

Google+:

<!-- Place this tag where you want the +1 button to render. --> <div class="g-plusone" data-annotation="none"></div> 
<!-- Place this tag after the last +1 button tag. --> <script type="text/javascript">   window.___gcfg = {lang: 'ru'};    (function() {     var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;     po.src = 'https://apis.google.com/js/plusone.js';     var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);   })(); </script> 

Vkontakte:

<!-- Put this script tag to the <head> of your page --> <script type="text/javascript" src="//vk.com/js/api/openapi.js?75"></script>  <script type="text/javascript">   VK.init({apiId: 3363525, onlyWidgets: true}); </script> 

<!-- Put this div tag to the place, where the Like block will be --> <div id="vk_like"></div> 

<script type="text/javascript"> VK.Widgets.Like("vk_like", {type: "button"}); </script> 

Вот такие коды кнопок. Что же мы видим? Vkontakte единственный из представленных кодов, не использует HTML 5. В данном случае на использование HTML 5 указывает атрибут data- в html тегах. Еще интересно, что у Twitter и Facebook очень похожие коды, видимо, подсматривают друг у друга. Еще у Twitter и Facebook не указан type=«text/javascript», что соответствует HTML5, атрибут type теперь не является обязательным. Значение по умолчанию JavaScript (ECMAScript). А Google продолжает указывать type=«text/javascript». Зато Google единственный кто использует асинхронную загрузку javascript, при помощи атрибута async, соответствующего спецификации HTML 5.

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

Для чего это нужно? Например, Вы поставили на свой сайт кнопку «Твитнуть», а мы помним, что у них нет в коде атрибута async. И все бы хорошо, но у многих на работе закрыт доступ к социальным сетям и когда к Вам на сайт зайдет пользователь без доступа к Twittter его браузер не сможет загрузить скрипты с Твиттера, а т.к. загрузка синхронная браузер заметно «подвиснет», пока попытка загрузить скрипт не прекратится по таймауту.

Как это касается Вас? Не каждый пользователь будет ждать загрузки Вашего сайта, а если дождется в дальнейшем, может, не вернутся, зачем ему возвращаться на «тормозной» сайт. Делаем вывод, что в ряде случаев асинхронная загрузка скриптов — нужная вещь.

В связи с тем, что полученные кнопки я решил объединить в один блок, логично будет весь javascript код также объединить в один скрипт и добавить асинхронную загрузку. Кроме того, я пока не использую HTML 5 на своем сайте и для того, что бы код был валидным, все атрибуты HTML 5 нужно установить с помощью javascript.

С помощью javascript, атрибут data- устанавливается очень просто, например:

<div class="g-plusone" data-annotation="none"></div> 

==

document.getElementById(id).dataset.annotation = "none" 

Как всегда не обошлось без нюансов. Работает во всех браузерах, кроме… Как Вы уже догадались, кроме IE до ie8, в ie9 уже работает. Но мы запишем по-другому, что бы работало во всех браузерах:

document.getElementById(id).setAttribute("data-annotation", "none");  

В конечном итоге вот, что у меня получилось:

1. Немного изменил HTML, главным образом мне на сайте совсем не нужна прямая ссылка на Twitter, а в своем коде они проставляют такую ссылку: <a href="https://twitter.com/share" class="twitter-share-button" data-lang="ru">Твитнуть</a>, зачем им это не понятно, что о них кто-то еще не знает? Или рейтинг в поисковиках маленький? В общем, записал так: <a class="twitter-share-button" data-lang="ru">Твитнуть</a>, можно, конечно rel=«nofollow» поставить, но я выбрал максимально кардинальный метод. Вообще бы убрал тег «А», но без него не работает. HTML блок кнопок, вставляем туда, где хотим увидеть кнопки:

<ul style="height:40px;list-style:none;margin:0;padding:0;"> 	<li style="float:left;"> 		<a id="s-twitter" class="twitter-share-button"> </a></li> 	<li style="float:left;"> 		<div id="s-facebook" class="fb-like" style="margin-right:40px;"> 			 </div> 	</li> 	<li style="float:left;"> 		<div id="vk_like"> 			 </div> 	</li> 	<li style="float:left;margin-right:10px;"> 		<div id="s-google" class="g-plusone"> 			 </div> 	</li> </ul> 

2. Javascript код асинхронной загрузки скриптов для кнопок, вставляйте куда хотите, обычно или в head или в конец страницы. Кстати у Twitter и Facebook в коде есть защита от повторной загрузки скриптов, сделанная, на случай если код вставить в страницу несколько раз, не думаю, что мой код кто-то вставит несколько раз, но на всякий случай защиту от повторной загрузки скриптов я оставил:

<script type="text/javascript"> (function() { 	function async_load(u,id) { 		if (!gid(id)) { 			s="script", d=document, 			o = d.createElement(s); 			o.type = 'text/javascript'; 			o.async = true; 			o.src = u; 			// Creating scripts on page 			x = d.getElementsByTagName(s)[0]; 			x.parentNode.insertBefore(o,x); 		} 	} 	function gid (id){ 		return document.getElementById(id); 	} 	window.onload = function() { 	 	e = gid("s-twitter"); 	e.setAttribute("data-lang", "ru");  	 	e = gid("s-facebook"); 	e.setAttribute("data-layout", "button_count");  	e.setAttribute("data-send", "false");  	 	e = gid("s-google"); 	e.setAttribute("data-size", "medium");  	 	 	async_load("//platform.twitter.com/widgets.js", "id-twitter");//twitter 	async_load("//connect.facebook.net/ru_RU/all.js#xfbml=1", "id-facebook");//facebook 	async_load("https://apis.google.com/js/plusone.js", "id-google");//google 	async_load("//vk.com/js/api/openapi.js", "id-vkontakte");//vkontakte 	} 	// Инициализация vkontakte 	window.vkAsyncInit = function(){ 		VK.init({apiId: 3363525, onlyWidgets: true}); 		VK.Widgets.Like("vk_like", {type: "button", height: 20}); 	} })(); </script> 

Последний нюанс, Вам придется зарегистрировать свой сайт vkontakte, что бы получить apiId, можете оставить мой apiId, но только на Вашем сайте он работать не будет.

Удачи!

ссылка на оригинал статьи http://habrahabr.ru/post/166831/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *