Закрытие элемента при клику за его пределами

Чаще всего при создании модальных окон внутри них делают кнопку для их закрытия, например обычный крестик. Такой вариант отличный и его отбрасывать не стоит, можно даже в паре с ним использовать и метод с данной статьи.

О том как сделать подобные окна, подробно мы останавливаться не будем.

Теперь подробнее о скрипте. Он работает на основе jQuery,поэтому, мы должны убедится что к сайту уже подключена библиотека jQuery. Если нет, то это нужно сделать.

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>

После библиотеки нужно подключить наш скрипт. Метод подключения, тоже можете взять со статьи упомянутой выше. Выглядит скрипт так:
$(document).mouseup(function (e){
var modalctr = $("#modal_cinw_ctnr");
var modal = $(".modal_cinw");
if (!modal.is(e.target) && modal.has(e.target).length === 0){
modalctr.hide();
}
});

Скрипт имеет важные параметры, настройка которых нужна для корректной работы скрипта.

$(document).mouseup(function (e){ - эта строка определяет, что скрипт будет работать когда отпущена любая из стандартных клавиш мыши.
var modalctr = $("#modal_cinw_ctnr"); - создаем переменную. В данном случаи это родительский контейнер окна. В примере это затемненная область поверх сайта. Иногда такой области нет, все зависит от типа вашего окна или другого элемента который вы хотите скрыть по клику вне его области. #modal_cinw_ctnr - это айди нашего родительского контейнера. Меняйте на свой нужный.
var modal = $(".modal_cinw"); - создаем вторую переменную. Как раз эта переменная и является нашим окном, нажимая вне его области и будет скрываться именно оно. .modal_cinw - класс нашего окна. Вы можете менять на айди или класс, вашего элемента, что нужно скрыть.
if (!modal.is(e.target) && modal.has(e.target).length === 0){ - в этой строке мы определяем был ли совершен клик по нашему главному элементу, то бишь по окну или нет, а также по его дочерних элементах, что размещены внутри. Если это не они, то переходим далее.
modalctr.hide(); - скрываем наш родительский контейнер, первую переменную - modalctr. То бишь нажимая вне окна, мы скрываем область, что затемняет сайт, внутри которой и лежит окно. Если у вас нет родителя, а нужно скрыть просто элемент из переменной modal. То есть строка будет иметь такой вид - modal.hide();
Далее, просто закрываем скобки.
Если вы настроите все правильно то результат не заставит себя ждать.

Добавлено: 27 Июня 2021 07:52:39 Добавил: Андрей Ковальчук

Как показать скрыть часть пунктов из списка

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

Если это то что вам нужно, то давайте приступим к изучению того, как повторить такое у себя на сайте.

Первым шагом в создании такого свернутого списка, будет добавление HTML кода со списком на страницу, если у вас ее нет, если у вас уже есть свой список, то адаптируйте его согласно этому.

<ul class="list">
<li>Пункт номер раз</li>
<li>Пункт номер два</li>
<li>Пункт номер три</li>
<li>Пункт номер четыре</li>
<li>Пункт номер пять</li>
<li>Пункт номер шесть</li>
<li>Пункт номер семь</li>
<li>Пункт номер восемь</li>
<li>Пункт номер девять</li>
<li>Пункт номер десять</li>
</ul>
<div class="show_hide_list">Смотреть все</div>

Тут все просто. Задаем список и присваиваем ему класс list. Можете указать свой, только в скрипте тоже надо будет указать свой новый класс. Так же, обязательно. нужно добавить кнопку, в нашем случаи это просто блок, с классом show_hide_list.

Второй шаг, добавляем стили для нашего списка и кнопки:
ul.list li:nth-child(n+6){display:none;}
.show_hide_list{cursor:pointer;display:inline-block;text-align:center;padding:10px;background:#fc0;}

Главная строка первая, она обязательна, потому как скрывает все пункты, начиная с шестого. Если вы хотите скрывать с седьмого или со второго и тд, то измените на свой. Так же надо будет изменить и в скрипте. Вторая строка - это стили для кнопки Смотреть все. Ей можете задавать свои стили, которые вам нравятся больше.

Теперь мы должны убедится что к сайту уже подключена библиотека jQuery. Если нет, то это нужно сделать.
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>

Следующий шаг, подключение уже самого скрипта, который будет осуществлять показ, скрытие пунктов из списка. Его нужно подключить после библиотеки, которую мы подключали выше. Можете воспользоваться той же инструкцией с подсказками как это сделать правильно.
jQuery(document).ready(function($){
if($('ul.list').find('li').length > 5){
$('.show_hide_list').click(function(){
$('ul.list li:nth-child(n+6)').slideToggle('');
$(this).toggleClass('opnd_g');
if($(this).hasClass('opnd_g')){
$(this).html('Скрыть');}
else {$(this).html('Смотреть все');}
});
}else{$('.show_hide_list').hide();}
});

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

if($('ul.list').find('li').length > 5){ - Задаем условие. Если у нашего списка, что имеет класс - .list имеются пункты li и их количество больше пяти.
$('.show_hide_list').click(function(){ - Запускаем функцию, которая сработает, если мы нажмем на элемент страницы с классом show_hide_list, то бишь на нашу кнопку, что расположена после списка.
$('ul.list li:nth-child(n+6)').slideToggle(''); - После нажатия показываем пункты с шестого и до последнего. Если вы поменяли количество в стилях, то меняйте и здесь соответственно.
$(this).toggleClass('opnd_g'); - Добавляем нашей кнопке после нажатия класс opnd_g.
if($(this).hasClass('opnd_g')){ - Создаем условие, что если наша кнопка имеет класс opnd_g, то...
$(this).html('Скрыть');} - То меняем текст в кнопке - Смотреть все на Скрыть.
else {$(this).html('Смотреть все');} - Или, если после нажатия на кнопку класса opnd_g нет, то меняем текст на кнопке снова на Смотреть все.
}); - Просто заканчиваем наше условие по нажатию на кнопку.
}else{$('.show_hide_list').hide();} - а это противоположное действие изначальному условию со второй строки, которое задавало действие если пунктов больше 5. То бишь, если пунктов меньше пяти, кнопка Смотреть все - будет скрыта полностью, чтобы не вводить в заблуждение посетителей сайта.

UPD: 11.12.2019

Если у вас несколько списков на одной странице и нужно, чтобы открывался только тот на кнопку под которым нажали, замените 4 строку в скрипте.

Кнопка должна быть сразу под списком! Иначе способ не сработает.

// ЗАМЕНИТЬ ЭТО
$('ul.list li:nth-child(n+6)').slideToggle('');
// НА ЭТО
$(this).prev().children('li:nth-child(n+6)').slideToggle('');

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

Добавлено: 06 Июня 2021 04:35:41 Добавил: Андрей Ковальчук

Эффект lightbox для галерей, скрипт увеличения изображений для галерей лендингов

На системах управления сайтом, так званых CMS, той же WordPress можно установить плагин, но на самописных страницах так не сделать. Поэтому данная библиотека вам может помочь. Вся библиотека это 2 файла, сам скрипт и стили CSS. Все это - baguetteBox, Страница baguetteBox на GitHub

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

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>

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

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

//В ЯВА СРЕДУ
baguetteBox.run('.gallery');
 
//В HTML СРЕДУ
<script>
jQuery(function($){
baguetteBox.run('.gallery');
});
</script>

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

<ul class="gallery">
<li><a href="images/11.jpg"><img alt="Галерея" src="images/1.jpg"></a></li>
<li><a href="images/22.jpg"><img alt="Галерея" src="images/2.jpg"></a></li>
<li><a href="images/33.jpg"><img alt="Галерея" src="images/3.jpg"></a></li>
</ul>

Внутри списка размещаете ссылки внутри которых изображения. Задумка такая: изображение в теге img - это миниатюра, маленькая картинка, а уже в самой ссылке указан путь к большому изображению. То бишь в нашем примере изображение 1.jpg - это миниатюра, а 11.jpg это полное.

Ну и чтобы все это работало, остался последний шаг - подключение стилей нашей библиотеки лайтбокса. В скачанном вами архиве - это файл baguette.css. Подключите его к своему сайту или скопируйте стили и перенесите в свой файл стилей. Пример подключения:

<link href="baguette.css" type="text/css" rel="stylesheet">

Не забудьте указать свой путь к файлу, если он лежит не в корне, а в какой-то папке


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

Если решили задавать опции, то инициализация будет немного другой, ее код уже таков

baguetteBox.run('.gallery', {
    //СЮДА ОПЦИИ
});

У скрипта есть следующие опции, укажу основные, ознакомится всеми можно на странице самого скрипта на GitHub (Ссылка указана в начале статьи).

buttons: false, - По умолчанию true. Этот параметр отключает показ кнопок для перелистывания изображений, например, если вы хотите, чтобы показывались только по одному.
fullScreen: true, - По умолчанию false. Этот параметр включает показ галереи в полно экранном режиме. Поверх браузера.
noScrollbars: true, - По умолчанию false. Этот параметр отключает показ скролбара, полосы прокрутки на сайте, во время просмотра изображений.
animation: 'fadeIn', - По умолчанию slideIn. Этот параметр задает вид анимации перелистывании изображений.
async: true, - По умолчанию false. Этот параметр включает асинхронную подгрузку файлов.
Если их применять, то инициализация будет такой. Разделите параметры запятой, не забудьте!

baguetteBox.run('.gallery', {
animation: 'fadeIn',
noScrollbars: true,
buttons: false,
});

Сложного с этим скриптом не вижу ничего. Если руки растут правильно, то справитесь без проблем, к тому же на GitHub есть информация, которую тоже можно и нужно использовать.

Добавлено: 16 Мая 2021 10:20:41 Добавил: Андрей Ковальчук

Скопировать содержимое блока в буфер обмена при нажатии

По сути вам надо сделать следующие шаги. Для начала нужно добавить нужному элементу класс - text_copy_link. Можно любой, но тогда нужно будет указать тот клас в скрипте, о котором немного позже.

Так же надо добавить на страницу блок с сообщением об успешном копировании. Это блок с классом - copy_link_mess. Текст внутри можете менять на любой. Пример того что надо добавить выглядит так:

<div class="text_copy_link">Текст или [shortcode] который скопируется</div>
<div class="copy_link_mess">Скопировано в буфер обмена</div>

Как я и сказал. Первый блок это тот, текст внутри которого копируется, а второй это блок с оповещением. Для него можно и нужно добавить стили CSS. Блок должен быть спрятан изначально и появляться лишь при клике по блоку с текстом.

Пример стилей выглядит так:
.copy_link_mess{
line-height:40px;
border-radius:5px;
background:#1DA1F2;
color:#fff;
position:fixed;
padding:0 15px;
z-index:99;
bottom:30px;
left:50%;
margin-left:-120px;
display:none;
box-shadow: rgba(0, 0, 0, 0.15) 0px 0px 15px;
}

Теперь очередь пришла к самому важному - jQuery скрипт, что будет выполнять всю работу. Но, перед его добавлением, нужно убедится, что к вашему сайту подключена библиотека jQuery. Если нет, то это нужно сделать.
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>

Дважды подключать тоже не нужно. Можете сначала сделать следующий шаг и если не будет работать, то тогда вернуться к библиотеке


И вот теперь, уже после библиотеки, можно подключить скрипт. Скопируйте его и добавьте в нужное место. Шапка или подвал сайта. Так же можно прямо на страницу после блока с сообщением об успешном копировании, если скрипт нужен только на одной странице.

Выглядит скрипт так:
<script>
jQuery(document).ready(function($){
$('.text_copy_link').click(function() {
var $text_copy = $(this);
var $temp = $("<input>");
$("body").append($temp);
$temp.val($text_copy.text()).select();
document.execCommand("copy");
$temp.remove();
$('.copy_link_mess').fadeIn(400);
setTimeout(function(){$('.copy_link_mess').fadeOut(400);},5000);
});
});
</script>

Скрипт простенький и работает следующим образом:

1. В второй строке указываем класс элемента по клику на который будет выполнятся скрипт - text_copy_link. Как я и говорил класс может быть любой, главное, чтобы у элемента и в скрипте он совпадал.
2. Во третей строке задаем переменную - $text_copy. Это наш блок по которому мы кликнули.
3. В четвертой строке создаем переменную - $temp. Это просто поле, в котором будем хранить содержимое, то что скопировали.
4. В пятой строке после тега body выводим наше поле.
5. Далее в шестой строке, нашему полю ввода присваиваем содержимое и выделяем текст нашего элемента, по которому кликнули.
6. В седьмой строке копируем в буфер то что выделеноdocument.execCommand("copy");
7. Восьмая строка - удаление нашего поля ввода, что мы создали временно и добавили после body
В принципе, это основная часть скрипта, именно она выполняет копирование. Следующие две строки - это вывод нашего блока с сообщением об успешном копировании. Если вам не нужно это то следующие две строки не нужны, так же не нужен и сам блок сс сообщением. если же нужен, то:
1. $('.copy_link_mess').fadeIn(400); - Показываем блок с классом - copy_link_mess.
2. setTimeout(function(){$('.copy_link_mess').fadeOut(400);},5000); - прячем наш блок через 5 секунд. 5000 - это и есть 5 сек, просто указано в миллисекундах. Можете поменять на свое.
Далее закрываем скобки и все готово. Теперь можно проверить работу проделанной работы. Если вы все сделали правильно и не допустили ошибок то все должно работать.

Добавлено: 24 Апреля 2021 07:25:19 Добавил: Андрей Ковальчук

Кнопки прокрутки страницы вверх и вниз jQuery

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

Это просто html код блока с двумя ссылками

<div class="scroll_panel">
    <a href="#" id="scroll_top"><span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M0 16.67l2.829 2.83 9.175-9.339 9.167 9.339 2.829-2.83-11.996-12.17z"/></svg></span></a>
    <a href="#" id="scroll_bottom"><span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M0 7.33l2.829-2.83 9.175 9.339 9.167-9.339 2.829 2.83-11.996 12.17z"/></svg></span></a>
</div>

Далее можете добавить стили. Они могут быть любыми, как вам удобно и вы хотите видеть на своем сайте. В моем примере кнопки плавают поверх сайта. Вы можете разместить кнопки по отдельности одну вверху и вторую внизу. Тогда вам не надо родительский блок, а просто используйте ссылки.

Вот готовые стили, как в примере:
.scroll_panel {
    position: fixed;
    top: 0;
    bottom: 0;
    left: 0;
    width: 90px;
    transition: background 0.2s ease;
}
.scroll_panel:hover {
    background: #eee; 
}
 
  
.scroll_panel svg {
fill:#f00;
}
 
#scroll_top {
    display: block;
    width: 100%;
    height: 50%;    
    position: absolute;
    top: 0;
    left: 0;
    text-align: center;
    transition: background 0.2s ease;
}
#scroll_top span {
    display: block;
    width: 100%;    
    position: absolute;
    left: 0;    
    top: 50px;
}
#scroll_top:hover {
    background: #ddd;   
}
 
#scroll_bottom {
    display: block;
    width: 100%;
    height: 50%;    
    position: absolute;
    top: 50%;
    left: 0;
    text-align: center;
    transition: background 0.2s ease;
}
 
#scroll_bottom span {
    display: block;
    width: 100%;    
    position: absolute;
    left: 0;    
    bottom: 20px;
}
#scroll_bottom:hover {
    background: #ddd; 
}

Последнее что нужно сделать - добавить скрипт jQuery, который и будет переносить нас в начало или конец страницы.
<script>
$(function(){
    $('#scroll_top').click(function(){
        $('html, body').animate({scrollTop: 0}, 600);
        return false;
    });
     
    $('#scroll_bottom').click(function(){
        $('html, body').animate({scrollTop: $(document).height() - $(window).height()}, 600);
        return false;
    });
});
</script>

Данный скрипт нужно добавлять только после библиотеки - jQuery. Она должна быть подключена у вас, если вы используете CMS, например WordPress. Если у вас самописный сайт, то вы должны были ее добавлять, если нет, то добавьте.
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>


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

Добавлено: 24 Марта 2021 06:21:05 Добавил: Андрей Ковальчук

Как добавить в свою форму отправки писем reCAPTCHA v3

Что же такое reCAPTCHA v3? Это скрытая капча от Google. Ее суть в том, что не надо больше ставить галочки, для того чтобы отправить письмо. Она просто проверяет как вы ведете себя на странице, похожи ли ваши действия на человека, а не робота и как вы просматриваете страницы, через обычный браузер или с использованием каких-то плагинов, скрытых сетей и тд.

Я перебрал много вариантов и описаний решений, для реализации того, что мне нужно. Сам же Google подробных инструкций не дает. Там общая инструкция по которой ничего не понятною.

Первое что вам нужно сделать, это авторизоваться на сервисе reCAPTCHA и получить ключи для нужного вам сайта. Инструкцию по этому делать смысла нет, их сотни, да там и так все интуитивно понятно. Если вы имеете свою PHP форму, написанную своими руками, то думаю, такая простая вещь, как получение ключей, для вас не проблема. Вам понадобятся - ключ сайта и секретный ключ. Еще раз повторюсь, вам надо ключи для reCAPTCHA v3, именно третяя версия, не вторая, та что с галочкой, а именно невидимая reCAPTCHA v3.

Теперь самая тяжелая часть - код. Для начала нужно подключить API JavaScript для reCAPTCHA. Данная строка в коде должна быть ниже библиотеки jQuery. Если нет, то это нужно сделать.

<script async src="https://www.google.com/recaptcha/api.js?render=YOUR_SITE_KEY_HERE"></script>

YOUR_SITE_KEY_HERE - нужно заменить на ваш ключ сайта, что вы получили. Не перепутайте с секретным ключом, его показывать на фронтенде нельзя, только ключ сайта!

Следующим шагом нужно добавить скрытое поле к вашей форме отправки письма на PHP. Его надо добавить перед кнопкой отправки формы.
<input type="hidden" name="recaptcha_response" id="recaptchaResponse">

После этого надо вызывать grecaptcha.execute, которая будет генерировать токен и передавать данные с формы уже на сторону сервера, где будет сверка с секретным ключом.
<script>
jQuery(document).ready(function() {
grecaptcha.ready(function () {
   grecaptcha.execute('YOUR_SITE_KEY_HERE', { action: 'contact' }).then(function (token) {
      var recaptchaResponse = document.getElementById('recaptchaResponse');
      recaptchaResponse.value = token;
       
      // СЮДА НАДО ДОБАВИТЬ ВАШУ AJAX ОТПРАВКУ ДАННЫХ
       
   });
});
});
</script>

Сам код заключен в тегах script для вставки в HTML среду, например сразу после формы, если у вас лендинг. Если вы хотите добавлять в отдельный файл то теги script нужно убрать в начале и в конце.

YOUR_SITE_KEY_HERE - опять как и выше, нужно заменить на ваш ключ сайта, не секретный, только ключ сайта! После комментария - "сюда надо добавить вашу Ajax отправку данных" или вместо него, вы должны добавить свой код Ajax отправку данных. Ниже я приведу пример, его нельзя использовать в своем коде, это просто пример!
//НЕ ДОБАВЛЯЙТЕ ЭТОТ КОД - ЭТО ПРОСТО ПРИМЕР!
   jQuery.ajax({
        url: "ajax_form.php",
        type:"POST",
        dataType: "html",
        data: jQuery("#ajax_form").serialize(),
        success: function(response) { 
             alert("Mail send!");
        },
        error: function(response) {
            alert("Error");
        }
    });

Больше ничего менять вам в скрипте не нужно. Оставьте все как есть. Далее переходим к следующему шагу.

Последний шаг - это проверка на стороне сервера, то бишь код нужно добавлять в ваш файл PHP, в котором у вас mail() функция отправки письма. Вам нужно открыть его и переделать. Данный код нужно разместить в самом начале файла перед вашим кодом.
$recaptcha_url = 'https://www.google.com/recaptcha/api/siteverify';
$recaptcha_secret = 'YOUR_SECRET_KEY_HERE';
$recaptcha_response = $_POST['recaptcha_response'];
$recaptcha = file_get_contents($recaptcha_url . '?secret=' . $recaptcha_secret . '&response=' . $recaptcha_response);
$recaptcha = json_decode($recaptcha);
if ($recaptcha->success == true && $recaptcha->score >= 0.5 && $recaptcha->action == 'contact') {
 
//ТУТ КОД ВАШЕЙ ОТПРАВКИ ЕСЛИ ВСЕ ОК
 
} 
    else
{
//ТУТ КОД, ЕСЛИ ОТПРАВКА НЕВОЗМОЖНА
}

После того как разместили, вам нужно заменить во второй строке - YOUR_SECRET_KEY_HERE, уже на СЕКРЕТНЫЙ КЛЮЧ.

Так же, вам нужно ваш старый код перенести внутрь данного. Точнее, сразу после комментария - "тут код вашей отправки если все ок". Думаю, логика понятна. Сначала идет проверка не спам, робот ли отправил форму, а уже потом идет ваша отправка письма на почту.

Сам код простой и если вы хоть немного знакомы с PHP, то поймете его логику. Сначала задаем переменную, где подключается API от Google для проверки. После переменная где вы задаете секретный ключ, третья переменная - данные с нашего скрытого поля, которое мы добавляли перед кнопкой отправки. После идет две строки где мы получаем данные, чтобы использовать их в сравнении.

Самим сравнением - if, мы проверяем соответствует ли все параметры для отправки. У нас три параметра - успешность отправленных с формы, оценка отправки и то что мы передали событие action == 'contact'. В третьем шаге, когда мы добавляли скрипт, там вы можете увидеть что в нем есть параметр, где мы задаем такое же название события. Это нужно, если у вас будет несколько форм для которых нужно создавать разные события.

Еще в коде есть последние 4 строки. Это условие, что делать, если проверку по капче форма не прошла. Если у вас проверка идет через скрипт на стороне сайта, а не в РНР, то можете ничего туда не добавлять. Если же вы разбираетесь в коде, то сможете добавить туда вывод сообщения об ошибке.

В самом начале я сказал, что данный материал требует от вас определенных знаний. Я не могу вам 1 в 1 расписать как сделать правильно вам, потому как каждая форма уникальна и требует своих действий по внедрению в нее reCAPTCHA v3. Данный метод я лично применяю на сайтах где требуется подключение капчи, потому уверен в его работоспособности.

Добавлено: 21 Марта 2021 10:05:50 Добавил: Андрей Ковальчук

Скрипт что определяет мобильное устройство

Сегодня, хочу показать вам jQuery скрипт, который будет определять открыт ли сайт на мобильном устройстве или на десктопе. Если вы занимаетесь версткой то знаете что такое адаптивная верстка, отображение контента на десктопе и на мобильном устройстве, что дизайн сайта, а в следствии и его верстка должны рассчитываться так, чтобы сайт отображался корректно и на компьютерах,ноутбуках и на мобильных устройствах.

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

Именно для этого существует скрипт, который и помогает решить подобные задачи. Носит название он - Current Device. Суть данного скрипта в том, что он добавляет на страницу классы, в зависимости от того, на каком устройстве просматривается сайт. Можете перейти на страницу с примером и посмотреть как это работает.

В примере можете протестировать страницу файрбагом. Выбрать разные устройства. Чтобы добавлялся соответственный класс, нужно перезагружать страницу. Как видно на странице примера список классов, что могут быть добавлены. Соответствующий класс присваивается тегу <html>.

На странице примера указаны следующие параметры и классы к ним, давайте их разберем.

Тип устройства - классы данной категории присваиваются в зависимости от устройства на котором открыт сайт:
.mobile - класс что присваивается, если страница открыта на мобильном устройстве.
.tablet - класс что присваивается, если страница открыта на планшете.
.desktop - класс что присваивается, если страница открыта на персональном компьютере.
Положение устройства - классы этой категории присваиваются в зависимости от положения, ориентации устройства. То есть, экран устройства в горизонтальном или вертикальном положении.
.portrait - класс что присваивается, если устройство имеет вертикальную ориентацию.
.landscape - класс что присваивается, если устройство имеет горизонтальную ориентацию.

Операционная система - классы данной категории присваиваются в зависимости от того какая операционная система установлена на устройстве. Данные классы пригодятся если важно отображать разные элементы для устройств с разной ОС.
.ios, .iphone, .ipad, .ipod, .android, .blackberry, .macos, .windows, .fxos, .meego, .television - классы с названием операционных систем, что и будут присвоены.
В моей практике, данный скрипт выручал меня несколько раз ,в основном благодаря классам .mobile и .desktop. Скорее всего и вам именно они и понадобятся. Как и говорил в начале статьи, данные классы не для CSS, хотя и там можно их использовать. Эти классы скорее для скриптов, когда нужно заставить работать скрипт, только при наличии класса на странице. Примерная функция выглядит так:

$('.mobile .block').click(function(){
//СЮДА КОД ФУНКЦИИ ДЛЯ МОБИЛЬНОГО УСТРОЙСТВА
});

В данном случаи функция сработает если вы нажали на элемент с классом .block на мобильном устройстве. Для ПК такая функция будет аналогична, но с классом .desktop.
$('.desktop .block').click(function(){
//СЮДА КОД ФУНКЦИИ ДЛЯ КОМПЬЮТЕРА
});

Таким образом можете применять работу разных скриптов в зависимости от устройства. Сам скрипт можете скопировать с файла current-device.js и добавить в свои файлы или подключить отдельно. Как это лучше сделать, можете прочитать в статье Как и где подключить скрипт?.

На этом все, спасибо за внимание.

Добавлено: 28 Сентября 2020 19:38:57 Добавил: Андрей Ковальчук

Закрытие элемента при клику за его пределами

Чаще всего при создании модальных окон внутри них делают кнопку для их закрытия, например обычный крестик. Такой вариант отличный и его отбрасывать не стоит, можно даже в паре с ним использовать и метод с данной статьи.

О том как сделать подобные окна, подробно мы останавливаться не будем. На моем сайте есть много статей на подобные темы.

Теперь подробнее о скрипте. Он работает на основе jQuery,поэтому, мы должны убедится что к сайту уже подключена библиотека jQuery. Если нет, то это нужно сделать.

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>

После библиотеки нужно подключить наш скрипт.
Выглядит скрипт так:
$(document).mouseup(function (e){
var modalctr = $("#modal_cinw_ctnr");
var modal = $(".modal_cinw");
if (!modal.is(e.target) && modal.has(e.target).length === 0){
modalctr.hide();
}
});

Скрипт имеет важные параметры, настройка которых нужна для корректной работы скрипта.

$(document).mouseup(function (e){ - эта строка определяет, что скрипт будет работать когда отпущена любая из стандартных клавиш мыши.

var modalctr = $("#modal_cinw_ctnr"); - создаем переменную. В данном случаи это родительский контейнер окна. В примере это затемненная область поверх сайта. Иногда такой области нет, все зависит от типа вашего окна или другого элемента который вы хотите скрыть по клику вне его области.
#modal_cinw_ctnr - это айди нашего родительского контейнера. Меняйте на свой нужный.

var modal = $(".modal_cinw"); - создаем вторую переменную. Как раз эта переменная и является нашим окном, нажимая вне его области и будет скрываться именно оно. .modal_cinw - класс нашего окна. Вы можете менять на айди или класс, вашего элемента, что нужно скрыть.

if (!modal.is(e.target) && modal.has(e.target).length === 0){ - в этой строке мы определяем был ли совершен клик по нашему главному элементу, то бишь по окну или нет, а также по его дочерних элементах, что размещены внутри. Если это не они, то переходим далее.

modalctr.hide();
- скрываем наш родительский контейнер, первую переменную - modalctr. То бишь нажимая вне окна, мы скрываем область, что затемняет сайт, внутри которой и лежит окно. Если у вас нет родителя, а нужно скрыть просто элемент из переменной modal. То есть строка будет иметь такой вид - modal.hide();
Далее, просто закрываем скобки.
Если вы настроите все правильно то результат не заставит себя ждать.

На этом все, спасибо за внимание.

Добавлено: 19 Июня 2019 14:04:48 Добавил: Андрей Ковальчук

Поле с автодополнением при помощи jQuery UI Autocomplete

Стандартный способ создания поля с автодополнением достаточно ограничен, например нет возможности вызвать свой код после выбора элемента, или вывести список в каком-нибудь изощренном виде. Но выход есть, это jQuery UI Autocomplete, который входит в ядро Drupal 7.

Ниже, пример создания поля с автодополнением по заголовкам нод при помощи jQuery UI Autocomplete:

jqueryui_autocomplete.module:

/**
 * Implements hook_menu()
 */
function jqueryui_autocomplete_menu() {
  $items['test/form'] = array(
    'page callback' => 'drupal_get_form',
    'page arguments' => array('jqueryui_autocomplete_test_form'),
    'access arguments' => array('access content'),
  );
  $items['test/autocomplete'] = array(
    'page callback' => 'jqueryui_autocomplete_autocomplete',
    'access arguments' => array('access content'),
  );
  return $items;
}
 
/**
 * Form builder
 */
function jqueryui_autocomplete_test_form() {
  $form['title'] = array(
    '#type' => 'textfield',
    '#title' => 'Title',
  );
 
  $form['#attached']['library'][] = array('system', 'ui.autocomplete');
  $form['#attached']['js'][] = drupal_get_path('module', 'jqueryui_autocomplete') . '/jqueryui_autocomplete.js';
 
  return $form;
}
 
/**
 * Menu callback
 */
function jqueryui_autocomplete_autocomplete() {
  $titles = db_select('node', 'n')
    ->fields('n', array('title'))
    ->condition('n.title', '%' . db_like($_GET['term']) . '%', 'LIKE')
    ->execute()
    ->fetchCol();
 
  drupal_json_output($titles);
}

jqueryui_autocomplete.js:

(function ($) {
 
  Drupal.behaviors.jqueryui_autocomplete = {
    attach: function (context, settings) {
      $('input[name="title"]', context).autocomplete({
        source: Drupal.settings.basePath + 'test/autocomplete'
      });
    }
  };
 
}(jQuery));

Написанное актуально для
Drupal 7

Добавлено: 30 Июля 2018 07:32:11 Добавил: Андрей Ковальчук

Как подключить javascript файл из своего js скрипта

Пример подключения скрипта http://example.com/script.js:

Native javascript

var script = document.createElement('script');
script.src = 'http://example.com/script.js';
document.getElementsByTagName('head')[0].appendChild(script);
alert('script loaded');

jQuery:

$.getScript('http://example.com/script.js', function(){
  alert('script loaded');
});

Добавлено: 29 Июля 2018 22:22:25 Добавил: Андрей Ковальчук

Как с помощью jQuery UI Dialog открыть AJAX окно

В jQuery UI виджете Dialog нет встроенной возможности показать окно с данными, полученными с помощью AJAX. Но это легко решаемо:

$('<div>').load('/some/url').dialog();
Или так, если после получения данных, их необходимо обработать:

$('<div id="my-dialog">Загрузка...</div>').dialog({
    open: function() {
        $.get('/some/url', function(response) {
            $('#my-dialog').html('<p>' + response + '</p>');
        });
    },
    close: function() {
        $('#my-dialog').remove();
    }
});

Добавлено: 29 Июля 2018 20:11:32 Добавил: Андрей Ковальчук

jQuery, функция scrolled

Небольшой кусок js кода, функция, из разряда сниппетов. Принимает jQuery объект (элемент) возвращает true когда элемент выходит за верхнюю границу окна.

function scrolled(e)
{
    var docViewTop = $(window).scrollTop();
    var elemTop = $(e).offset().top;
    var elemBottom = elemTop + $(e).height();
    return (elemBottom < docViewTop);
}

Добавлено: 13 Июля 2018 07:30:22 Добавил: Андрей Ковальчук

jQuery Ajax $.post

jQuery.post( url, [data], [callback], [type] )

Загружает страницу, используя POST-запрос.
Используется для отправки простых post-запросов на сервер, в случаях, когда нет необходимости использовать более сложную функцию $.ajax. Можно определить функцию-колбэк, которая будет выполнена по завершении запроса (в случае, если получен соответствующий ответ). Формат возвращаемых данных может быть определен в четвертом параметре type.

Аргументы:
url - String

url загружаемой страницы
data (необязательный) Map, String

данные, которые будут отправлены на с
ервер (пары key/value или результат функции .serialize() )
callback (необязательный) Function
функция, которая будет выполнена, если данные загружены успешно.
type (необязательный) String

тип данных, которые будут возвращены в функцию callback ( “xml”, “html”, “script”, “json”, “jsonp”, “text”.)

Примеры:
1. Запрашивает страницу mytest.php без возвращения результата.
$.post("mytest.php");

2. Запрашивает страницу mytest.php, передавая дополнительные данные. Результат не возвращается
$.post("mytest.php", { name: "Alex", balance: "7000" } );

3. Отсылает массивы данных на сервер без возвращения результата.
$.post("mytest.php", { 'names[]': ["Ольга", "Петр", "Анастасия"] });

4. Отсылает данные формы, используя ajax запрос
$.post("mytest.php", $("#mytestform").serialize());

5. Выводит сообщение с результатом запроса страницы mytest.php
$.post("mytest.php", function(data){
    alert("Данные загружены: " + data);
});

6. Отправляет данные и выводит результат запроса страницы mytest.php
$.post("mytest.php", { name: "Alex", balance: "7000" },
    function(data){
        alert("Данные загружены: " + data);
    });

7. Получает содержимое mytest.php, сохраняет в объекте XMLHttpResponse и вызывает функцию process().
$.post("mytest.php", { name: "Alex", balance: "7000" },
    function(data){
        process(data);
    }, "xml");

8. Получает содержимое mytest.php, которое было возвращено в формате
json (&lt;?php echo json_encode(array("name"=&gt; "Alex", "balance"=&gt; "7000")); ?&gt;)

$.post("mytest.php", { func: "getNameAndTime" },
    function(data){
        alert(data.name); // Alex
        console.log(data.balance); //  7000
    }, "json");

Добавлено: 12 Июля 2018 21:18:20 Добавил: Андрей Ковальчук

Простой jQquery слайд шоу без плагина

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

<div class="slidshow">
  <img src="images/first.jpg">
  <img src="images/second.jpg">
  <img src="images/third.jpeg">
</div>

Ну здесь должно быть все понятно, див с тремя картинками находящимися от текущего html файла на расстоянии одной директории images, далее пишем css код:
.slidshow {
        position:relative; 
}
.slidshow img { 
        position:absolute;
        left:0; 
        top:0; 
        width:500px; 
        height:375px;
}

Здесь мы ставим для картинок абсолютное позиционирование и ставим их левый верхний угол, ну и определяем для них одну ширину и высоту что бы при смене они не скакали ). Далее пишем Javascript код точнее jQuery )) но перед этим должны подключить его, лично я его всегда подключаю с гугла… примерно вот так вот:
<script type="text/javascript" src="http://jqueryjs.googlecode.com/files/jquery-1.3.2.js"></script>

А теперь пишем такой вот код:
$(function(){
    $('.slidshow img:gt(0)').hide();//скрываем все картинки кроме 1го
      setInterval(function(){
      $('.slidshow :first-child').fadeOut()//анимированно скрываем 1ую картинку
         .next('img').fadeIn()//и показываем вторую
         .end().appendTo('.slidshow');},2000);//повторяем это каждые 2000 мс
});

Добавлено: 05 Июля 2018 08:33:14 Добавил: Андрей Ковальчук

Перекидное круглое слайдшоу

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

Вот как выглядит структура:

<div id="fc-slideshow" class="fc-slideshow">
    <ul class="fc-slides">
        <li><img src="images/1.jpg" /><h3>Hot</h3></li>
        <li><img src="images/2.jpg" /><h3>Cold</h3></li>
        <li><img src="images/3.jpg" /><h3>Light</h3></li>
        <li><img src="images/4.jpg" /><h3>Dark</h3></li>
        <li><img src="images/5.jpg" /><h3>Soft</h3></li>
        <li><img src="images/6.jpg" /><h3>Hard</h3></li>
        <li><img src="images/7.jpg" /><h3>Smooth</h3></li>
        <li><img src="images/8.jpg" /><h3>Rough</h3></li>
    </ul>
</div>

А мы преобразуем ее следующим образом:
<div id="fc-slideshow" class="fc-slideshow">

    <ul class="fc-slides">
        <!-- ... -->
    </ul>

    <nav>
        <div class="fc-left">
            <span></span>
            <span></span>
            <span></span>
            <i class="icon-arrow-left"></i>
        </div>
        <div class="fc-right">
            <span></span>
            <span></span>
            <span></span>
            <i class="icon-arrow-right"></i>
        </div>
    </nav>

    <div class="fc-flip">
        <div class="fc-front">
            <div><img src="images/4.jpg"><h3>Dark</h3></div>
            <div class="fc-overlay-light"></div>
        </div>
        <div class="fc-back">
            <div><img src="images/5.jpg"><h3>Soft</h3></div>
            <div class="fc-overlay-dark"></div>
        </div>
    </div>

</div>

У элемента nav есть несколько пустых участков, служащих в качестве “зон обнаружения”. У каждой стороны окружности имеется три области, на которые можно будет щелкать, одна вверху, одна посредине и одна внизу. Элемент i послужит в качестве навигационной стрелки-указателя и, в зависимости от того, над которым из участков проводим мышью, мы будем вращать маленький квадрат со стрелкой. Но мы не станем применять в качестве области щелчка стрелку, а возьмем весь участок.

Разделение для перекидывания круга содержит специальную 3D-структуру: у него есть передняя и задняя стороны. При переходе к следующему или предыдущему элементу мы покажем эту структуру и будем вращать контейнер так, чтобы было видно обратную сторону.

От применения наложений все смотрится более реалистичным по причине обеспечения эффекта света и тени. Мы анимируем непрозрачность в зависимости от угла вращения.

Просто вызываем плагин вроде этого:
$( '#fc-slideshow' ).flipshow();
А вот опции плагина:

// опции
$.Flipshow.defaults = {
    // скорость перехода по умолчанию (в мс)
    speed : 700,
    // ослабление перехода по умолчанию
    easing : 'cubic-bezier(.29,1.44,.86,1.06)'
};

Пожалуйста, помните, что это эксперимент, и работать как следует все будет в браузерах, поддерживающих 3d-трансформации CSS. Для остальных есть простая альтернатива, при которой предыдущий или следующий элемент показываются и скрываются.

Надеюсь, вас вдохновит этот маленький плагин!

Добавлено: 29 Мая 2018 08:27:01 Добавил: Андрей Ковальчук