<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0">

<channel>

<title>Блог Чуденкова Алексея, заметки с тегом: js</title>
<link>https://blog.chudenkov.ru/tags/js/</link>
<description></description>
<generator>E2 (v3365; Aegea)</generator>

<item>
<title>JS: Рисуем логотип</title>
<guid isPermaLink="false">77</guid>
<link>https://blog.chudenkov.ru/all/js-risuem-logotip/</link>
<comments>https://blog.chudenkov.ru/all/js-risuem-logotip/</comments>
<description>
&lt;p&gt;Я бродил по Codepen в поисках интересных решений для анимаций форм и объектов на CSS и наткнулся на клёвую реализацию анимации SVG логотипа. Принцип прост — указываем для каждого элемента path в SVG класс и он будет анимирован. Можно на прелоадер поставить, будет эффектно.&lt;/p&gt;
&lt;p class="codepen" data-height="377" data-theme-id="light" data-default-tab="html,result" data-user="alexey-chudenkov" data-slug-hash="KKpqKwd" style="height: 377px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Animated SVG Logo"&gt;
  &lt;span&gt;See the Pen &lt;a href="https://codepen.io/alexey-chudenkov/pen/KKpqKwd"&gt;
  Animated SVG Logo&lt;/a&gt; by Alexey  Chudenkov (&lt;a href="https://codepen.io/alexey-chudenkov"&gt;@alexey-chudenkov&lt;/a&gt;)
  on &lt;a href="https://codepen.io"&gt;CodePen&lt;/a&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;script async src="https://static.codepen.io/assets/embed/ei.js"&gt;&lt;/script&gt;
</description>
<pubDate>Sat, 29 Feb 2020 11:50:49 +0300</pubDate>
</item>

<item>
<title>jQuery: запретить вводить пробелы в E-Mail</title>
<guid isPermaLink="false">75</guid>
<link>https://blog.chudenkov.ru/all/jquery-zapretit-vvodit-probely-v-e-mail/</link>
<comments>https://blog.chudenkov.ru/all/jquery-zapretit-vvodit-probely-v-e-mail/</comments>
<description>
&lt;p&gt;Защита от дурака, который может скопировать и вставить почту с пробелами или хуже того ещё и написать её с пробелами.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;$(&amp;quot;#input_Id&amp;quot;).change(function()
     $(this).val($(this).val().replace(/ +/g, ''))
});&lt;/code&gt;&lt;/pre&gt;</description>
<pubDate>Mon, 10 Feb 2020 14:05:01 +0300</pubDate>
</item>

<item>
<title>Shopify: check user age before shopping</title>
<guid isPermaLink="false">70</guid>
<link>https://blog.chudenkov.ru/all/shopify-check-user-age-before-shopping/</link>
<comments>https://blog.chudenkov.ru/all/shopify-check-user-age-before-shopping/</comments>
<description>
&lt;p&gt;Есть продукты, которые можно продавать в США только лицам старше 21 года, да и то, не во всех штатах. Сам шопифай такого решения разумеется не имеет, поэтому появилось следующее решение, которое работает так: если нет соответствующей куки, то показываем пользователю предупреждение (предупреждение сами верстаем), а если кука есть, то не показываем пользователю предупреждение N-дней. Если пользователю нет 21 года, то отправляем его в магазин лего и куку не присваиваем.&lt;/p&gt;
&lt;p&gt;Я запихал текст предупреждения в переменные, чтобы их можно было просто отредактировать.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;{% capture warning_header %}
THE SITE IS ONLY AVAILABLE TO PERSONS OVER 21 YEARS OF AGE.
{% endcapture %}

{% capture warning_question %}
ARE YOU'RE 21 YEARS OLD?
{% endcapture %}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Далее вёрстка самого предупреждения, который нужно запихать в theme.liquid сразу после body. Рекомендую подключить сниппетом, чтобы не засорять шаблон кучей строк.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;&amp;lt;div class=&amp;quot;warning&amp;quot; id=&amp;quot;warning&amp;quot;&amp;gt;
    &amp;lt;div class=&amp;quot;warning-popup&amp;quot; id=&amp;quot;popup&amp;quot;&amp;gt;
        &amp;lt;div class=&amp;quot;logo&amp;quot;&amp;gt;
            &amp;lt;img src=&amp;quot;https://cdn.shopify.com/s/files/logo.svg&amp;quot; alt=&amp;quot;logo&amp;quot;&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;div&amp;gt;{{ warning_header }}&amp;lt;/div&amp;gt;
        &amp;lt;div class=&amp;quot;warning-question&amp;quot;&amp;gt;{{ warning_question }}&amp;lt;/div&amp;gt;
        &amp;lt;div class=&amp;quot;btns&amp;quot;&amp;gt;
            &amp;lt;a href=&amp;quot;https://lego.com/&amp;quot;&amp;gt;&amp;lt;button class=&amp;quot;btn&amp;quot;&amp;gt;No&amp;lt;/button&amp;gt;&amp;lt;/a&amp;gt;
            &amp;lt;button class=&amp;quot;btn&amp;quot; onclick=&amp;quot;ageCheck()&amp;quot;&amp;gt;Yes&amp;lt;/button&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Далее сам скрипт, логику работы описал выше.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;&amp;lt;script&amp;gt;
 function ageCheck() {
     var days = 14; //количество дней, через которое спросим возраст снова
     var date = new Date();
     date.setTime(date.getTime()+(days*24*60*60*1000));
     var expires = &amp;quot;; expires=&amp;quot;+date.toGMTString();
     document.cookie = 'isAnAdult=true;'+expires+&amp;quot;; path=/&amp;quot;;
     location.reload();
   };
  function readCookie(name) {
    var nameEQ = name + &amp;quot;=&amp;quot;;
    var ca = document.cookie.split(';');
    for(var i=0;i &amp;lt; ca.length;i++) {
      var c = ca[i];
      while (c.charAt(0)==' ') c = c.substring(1,c.length);
      if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
  };
  var isAnAdult = readCookie('isAnAdult');
  if (isAnAdult) {
    document.write(&amp;quot;&amp;lt;style&amp;gt; #warning { display: none; overflow:hidden; }&amp;lt;/style&amp;gt;&amp;quot;);
  };
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;</description>
<pubDate>Fri, 31 Jan 2020 03:26:16 +0300</pubDate>
</item>

<item>
<title>JS: Определяем включён Caps Lock или нет</title>
<guid isPermaLink="false">69</guid>
<link>https://blog.chudenkov.ru/all/js-opredelyaem-vklyuchyon-caps-lock-ili-net/</link>
<comments>https://blog.chudenkov.ru/all/js-opredelyaem-vklyuchyon-caps-lock-ili-net/</comments>
<description>
&lt;p&gt;На W3C нашёл простой и отличный способ определения капса. Для чего? Всё для UI/UX! Особенно, если аудитория слегка деревянная. Итак, реализация:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;var input = document.getElementById(&amp;quot;myInput&amp;quot;);
var text = document.getElementById(&amp;quot;text&amp;quot;);
input.addEventListener(&amp;quot;keyup&amp;quot;, function(event) {
  if (event.getModifierState(&amp;quot;CapsLock&amp;quot;)) {
    text.style.display = &amp;quot;block&amp;quot;;
  } else {
    text.style.display = &amp;quot;none&amp;quot;
  }
});&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.chudenkov.ru/pictures/Screenshot_3.png" width="461" height="248" alt="" /&gt;
&lt;/div&gt;
</description>
<pubDate>Wed, 15 Jan 2020 22:46:54 +0300</pubDate>
</item>

<item>
<title>SimplaCMS: Подсчёт количества введённых символов в поля SEO-параметров</title>
<guid isPermaLink="false">68</guid>
<link>https://blog.chudenkov.ru/all/simplacms-podschyot-kolichestva-vvedyonnyh-simvolov-v-polya-seo/</link>
<comments>https://blog.chudenkov.ru/all/simplacms-podschyot-kolichestva-vvedyonnyh-simvolov-v-polya-seo/</comments>
<description>
&lt;p&gt;Сеошники знают, что есть правила, которые ограничивают нам ввод длинных title или description. Чтобы не кидать каждый раз в Sublime для подсчёта символов, я набросал простенький скрипт, который показывает текущее значение каждого поля SEO-параметров.&lt;/p&gt;
&lt;p&gt;Потестить можно на категориях, для которых в первую очередь и писался сам скрипт. Для этого откроем /simpla/design/html/category.tpl и заменим блок&lt;/p&gt;
&lt;!-- Параметры страницы --&gt;&lt;p&gt;на код ниже:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;&amp;lt;div class=&amp;quot;block layer&amp;quot;&amp;gt;
&amp;lt;h2&amp;gt;Параметры страницы&amp;lt;/h2&amp;gt;
&amp;lt;ul&amp;gt;
	&amp;lt;li&amp;gt;&amp;lt;label id=&amp;quot;url_count&amp;quot;class=property&amp;gt;Адрес&amp;lt;/label&amp;gt;&amp;lt;div class=&amp;quot;page_url&amp;quot;&amp;gt;/catalog/&amp;lt;/div&amp;gt;&amp;lt;input name=&amp;quot;url&amp;quot; class=&amp;quot;page_url&amp;quot; type=&amp;quot;text&amp;quot; value=&amp;quot;{$category-&amp;gt;url|escape}&amp;quot; id=&amp;quot;url_source&amp;quot; /&amp;gt;&amp;lt;/li&amp;gt;
	&amp;lt;li&amp;gt;&amp;lt;label id=&amp;quot;title_count&amp;quot; class=property&amp;gt;Заголовок&amp;lt;/label&amp;gt;&amp;lt;input name=&amp;quot;meta_title&amp;quot; class=&amp;quot;simpla_inp&amp;quot; type=&amp;quot;text&amp;quot; value=&amp;quot;{$category-&amp;gt;meta_title|escape}&amp;quot; id=&amp;quot;title_source&amp;quot; /&amp;gt;&amp;lt;/li&amp;gt;
	&amp;lt;li&amp;gt;&amp;lt;label id=&amp;quot;keys_count&amp;quot; class=property&amp;gt;Ключевые слова&amp;lt;/label&amp;gt;&amp;lt;input name=&amp;quot;meta_keywords&amp;quot; class=&amp;quot;simpla_inp&amp;quot; type=&amp;quot;text&amp;quot; value=&amp;quot;{$category-&amp;gt;meta_keywords|escape}&amp;quot; id=&amp;quot;keys_source&amp;quot; /&amp;gt;&amp;lt;/li&amp;gt;
	&amp;lt;li&amp;gt;&amp;lt;label id=&amp;quot;description_count&amp;quot; class=property&amp;gt;Описание&amp;lt;/label&amp;gt;&amp;lt;textarea name=&amp;quot;meta_description&amp;quot; class=&amp;quot;simpla_inp&amp;quot; id=&amp;quot;description_source&amp;quot; &amp;gt;{$category-&amp;gt;meta_description|escape}&amp;lt;/textarea&amp;gt;&amp;lt;/li&amp;gt;
			&amp;lt;/ul&amp;gt;
&amp;lt;script&amp;gt;
var urlname = document.getElementById(&amp;quot;url_source&amp;quot;);
var urlcount = document.getElementById(&amp;quot;url_count&amp;quot;);
var titlename = document.getElementById(&amp;quot;title_source&amp;quot;);
var titlecount = document.getElementById(&amp;quot;title_count&amp;quot;);
var keywordname = document.getElementById(&amp;quot;keys_source&amp;quot;);
var keywordscount = document.getElementById(&amp;quot;keys_count&amp;quot;); 
var descriptionname = document.getElementById(&amp;quot;description_source&amp;quot;);
var descriptioncount = document.getElementById(&amp;quot;description_count&amp;quot;);                                   
window.onload = urlCount();
window.onload = titleCount();
window.onload = keywordsCount();
window.onload = descriptionCount();
urlname.oninput = urlCount;
titlename.oninput = titleCount;
keywordname.oninput = keywordsCount;
descriptionname.oninput = descriptionCount;                  
function urlCount() {
var x = urlname.value;
urlcount.innerHTML = &amp;quot;Адрес (&amp;quot; + x.length + &amp;quot;)&amp;quot;;
}             
function titleCount() {
var y = titlename.value;
titlecount.innerHTML = &amp;quot;Заголовок (&amp;quot; + y.length + &amp;quot;)&amp;quot;;
}                  
function keywordsCount() {
var z = keywordname.value;
keywordscount.innerHTML = &amp;quot;Ключевые слова (&amp;quot; + z.length + &amp;quot;)&amp;quot;;
}
function descriptionCount() {
var xx = descriptionname.value;
descriptioncount.textContent = &amp;quot;Описание (&amp;quot; + xx.length + &amp;quot;)&amp;quot;;
}                 
&amp;lt;/script&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.chudenkov.ru/pictures/Screenshot_2.png" width="1185" height="489" alt="" /&gt;
&lt;/div&gt;
</description>
<pubDate>Tue, 14 Jan 2020 13:58:34 +0300</pubDate>
</item>

<item>
<title>Tilda: Отслеживание целей в Яндекс Метрике и Google Analytics</title>
<guid isPermaLink="false">41</guid>
<link>https://blog.chudenkov.ru/all/otslezhivanie-celey-dlya-tildy/</link>
<comments>https://blog.chudenkov.ru/all/otslezhivanie-celey-dlya-tildy/</comments>
<description>
&lt;ol start="1"&gt;
&lt;li&gt;Заходим в Метрику, создаем цели.&lt;/li&gt;
&lt;li&gt;Заходим в Google Analytics, создаем цели.&lt;/li&gt;
&lt;li&gt;Заходим на сайт, вставляем в footer / custom.js:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
$(document).ready(function(){
    $('#ID_BLOCK a').click(function(){ // Надо указать ID блока, в котором расположена ссылка
        yaCounterXXXXXXXX.reachGoal('ORDER');  // Надо указать название цели и номер счётчика Метрики
        gtag('event', 'OrderClick', { 'event_category': 'Order', 'event_action': 'Order Click', }); // Надо указать название и тип события для Analytics
        console.log('Data was sent'); // Это отладка для консоли. Если в консоли выводится, то всё ок, цели работают.
    });
});
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;</description>
<pubDate>Fri, 25 May 2018 22:42:42 +0300</pubDate>
</item>

<item>
<title>JS: Одна всплывающая форма и разные заголовки</title>
<guid isPermaLink="false">37</guid>
<link>https://blog.chudenkov.ru/all/js-odna-vsplyvayuschaya-forma-i-raznye-zagolovki/</link>
<comments>https://blog.chudenkov.ru/all/js-odna-vsplyvayuschaya-forma-i-raznye-zagolovki/</comments>
<description>
&lt;p&gt;Каждый раз, создавая или оптимизируя сайты, всегда сталкиваюсь с задачами, которые можно и нужно оптимизировать, сокращать, минимизировать и так далее. Например, вы хотите сделать на лендинге 5 форм, у которых по сути отличается только заголовок. Неужели вы будете лепить все 5 форм? Не надо! Можно обойтись несколькими строчками кода.&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Дадим заголовку вашей формы идентификатор&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;&amp;lt;h2 id=&amp;quot;windowHeader&amp;quot;&amp;gt;Ваш заголовок формы&amp;lt;/h2&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;ol start="2"&gt;
&lt;li&gt;Повесим на ваши кнопки названия заголовка каждой из них. Например, для обратного звонка — «Обратный звонок», для бесплатной консультации — «Бесплатная консультация»:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;&amp;lt;a onClick=&amp;quot;windowHeader('Бесплатная консультация');&amp;quot;&amp;gt;Заказать бесплатную консультацию&amp;lt;/a&amp;gt;
&amp;lt;a onClick=&amp;quot;windowHeader('Обратный звонок');&amp;quot;&amp;gt;Заказать звонок&amp;lt;/a&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;ol start="3"&gt;
&lt;li&gt;Создадим JS функцию, которая при нажатии той или иной кнопки будет подменять нам название формы:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;function windowHeader(name) {
          document.getElementById('windowHeader').innerHTML = name;
}&lt;/code&gt;&lt;/pre&gt;&lt;ol start="4"&gt;
&lt;li&gt;Жамкаем по кнопкам, смотрим на форму.&lt;/li&gt;
&lt;/ol&gt;
</description>
<pubDate>Sun, 06 May 2018 03:06:39 +0300</pubDate>
</item>

<item>
<title>JivoSite: отключить звук появления окна</title>
<guid isPermaLink="false">30</guid>
<link>https://blog.chudenkov.ru/all/jivosite-otklyuchit-zvuk-poyavleniya-okna/</link>
<comments>https://blog.chudenkov.ru/all/jivosite-otklyuchit-zvuk-poyavleniya-okna/</comments>
<description>
&lt;p&gt;В JivoSite есть раздражающий звук, который реально &lt;s&gt;заёбывает&lt;/s&gt; своим навязчивым пиканием. Покопавшись в настройках, я не нашёл никакого функционала, который бы позволил мне это отключить. Странно, что разработчики об этом не позаботились.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.chudenkov.ru/pictures/42159_3_640x480.jpeg" width="640" height="480" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Что ж, будем решать через DOM:&lt;/p&gt;
&lt;p&gt;Открываем существующий код JivoSite и добавим в него пару строчек:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;&amp;lt;script type='text/javascript'&amp;gt;
(function() { var widget_id = 'YOUR_ID'; var d = document; var w = window;
    function l() { var s = document.createElement('script');
        s.type = 'text/javascript';
        s.async = true;
        s.src = '//code.jivosite.com/script/widget/' + widget_id; var ss = document.getElementsByTagName('script')[0];
        ss.parentNode.insertBefore(s, ss); } if (d.readyState == 'complete') { l(); } else { if (w.attachEvent) { w.attachEvent('onload', l); } else { w.addEventListener('load', l, false); } } })();

// Ниже код, который нужно добавить после вашего скрипта
function jivo_onLoadCallback() {
document.jivo_container.HTMLAudioElement.prototype.play = function () {};
}
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;После этого никакие звуки не будут раздражать вас и вашего пользователя.&lt;/p&gt;
</description>
<pubDate>Tue, 17 Apr 2018 01:11:21 +0300</pubDate>
</item>

<item>
<title>JS: Настройки Fancybox 3</title>
<guid isPermaLink="false">29</guid>
<link>https://blog.chudenkov.ru/all/fancybox-3-moi-nastroyki/</link>
<comments>https://blog.chudenkov.ru/all/fancybox-3-moi-nastroyki/</comments>
<description>
&lt;p&gt;Чтобы не писать каждый раз, запишу здесь:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;$(&amp;quot;[data-fancybox]&amp;quot;).fancybox({
    loop: true,
    gutter: 30,
    buttons: [
        &amp;quot;zoom&amp;quot;,
        &amp;quot;share&amp;quot;,
        &amp;quot;slideShow&amp;quot;,
        &amp;quot;fullScreen&amp;quot;,
        &amp;quot;thumbs&amp;quot;,
        &amp;quot;close&amp;quot;
    ],
    protect: true,
    transitionEffect: &amp;quot;circular&amp;quot;,
    slideShow: {
        autoStart: true,
        speed: 5000
    },
    lang: &amp;quot;ru&amp;quot;,
    i18n: {
        ru: {
            CLOSE: &amp;quot;Закрыть&amp;quot;,
            NEXT: &amp;quot;Вперед&amp;quot;,
            PREV: &amp;quot;Назад&amp;quot;,
            ERROR: &amp;quot;Ошибка загрузки. &amp;lt;br/&amp;gt; Повторите запрос позднее.&amp;quot;,
            PLAY_START: &amp;quot;Начать демонстрацию&amp;quot;,
            PLAY_STOP: &amp;quot;Приостановить демонстрацию&amp;quot;,
            FULL_SCREEN: &amp;quot;На полный экран&amp;quot;,
            THUMBS: &amp;quot;Миниатюры&amp;quot;,
            DOWNLOAD: &amp;quot;Скачать&amp;quot;,
            SHARE: &amp;quot;Поделиться&amp;quot;,
            ZOOM: &amp;quot;Увеличить&amp;quot;
        },
    }
};&lt;/code&gt;&lt;/pre&gt;</description>
<pubDate>Mon, 16 Apr 2018 23:59:06 +0300</pubDate>
</item>

<item>
<title>JS: Вешаем события GA через DOM для плагина Wordpress Contact Form 7</title>
<guid isPermaLink="false">26</guid>
<link>https://blog.chudenkov.ru/all/veshaem-sobytiya-ga-cherez-dom-dlya-plagina-wordpress-contact-fo/</link>
<comments>https://blog.chudenkov.ru/all/veshaem-sobytiya-ga-cherez-dom-dlya-plagina-wordpress-contact-fo/</comments>
<description>
&lt;p&gt;После опыта с LP Generator, нашёл такое же решение для самого популярного плагина Wordpress Contact Form 7. Согласно официальной документации плагина, начиная с версии 7.5.0 они убрали возможность установки событий onsubmit и onclick через интерфейс админки. И предлагают вешать его через скрипт. Пример:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;&amp;lt;script&amp;gt;
document.addEventListener( 'wpcf7mailsent', function( event ) {
    yaCounterXXXXXX.reachGoal('ORDER'); gtag('event', 'order', { 'event_category': 'ORDER', 'event_action': 'ORDER', });
}, false );
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Зачем убрали — не понятно, но точно ясно, что усложнили жизнь новичкам.&lt;/p&gt;
</description>
<pubDate>Wed, 04 Apr 2018 23:42:15 +0300</pubDate>
</item>


</channel>
</rss>