Jump to content
  • 0

.removeClass()


Omega24v
 Share

Question

Ребята, помогите написать скрипт.

 

При нажатии на кнопку (div) , добавляется класс wp-tab-active и всплывает модальное окно. Мне надо его удалить, то есть когда я нажимаю вне формы, она закрывается.

 

qweqweqpng_7610092_13395711.png

http://shure-kryg.ru/testt - кнопка "Подробнее"

Edited by Omega24v
Link to comment
Share on other sites

13 answers to this question

Recommended Posts

  • 0

поидее

$(window).load(function(){   $('body').click(function(){    $('.popup_element').removeClass('wp-tab-active');  });})

Но могу ошибаться)


заставили читать весь сайт пока ищу кнопку "подробнее" оказывается это "чудо" вот оно http://joxi.ru/FIrrU4wyTJDPAh4G0iE

Уж очень подробнее))

 

p.s. по ночам консоль с ошибками с косой не сниться?) 

Edited by Нарек
Link to comment
Share on other sites

  • 0

Я бы так делал:

Дал модальному окну свои методы show() и hide(). В методе show() назначал бы обработчик клика по body и вызывал окно, а в методе hide() - удалял обработчик клика с body и скрывал окно. Кроме того т.к. клик по самому модальному окну так же сгенерирует событие в body, надо включить в тело обарботчика клика проверку на то по какому элементу произошел клик (чтоб по клику по самому модальному окну оно не закрывалось). Плюс назначения методов окну в том, что пока окно закрыто обработчик onclick не висит на body без надобносити. Кроме того, вы сможете так же добавить окну кнопку "закрыть" (что желательно, т.к. не всем интуитивно понятно что надо кликнуть за пределами окна чтобы его закрыть, обычно глаза ищут стандартный крестик виндоуз) и по клику на нее вызывать тот же метод hide() модального окна. В коде вашем я не копался, вот общий принцип работы моего варианта, подстроите под себя:

// Вспомогательная функция проверки на то, является ли элемент "а" вложенным в элемент "b"function isNested(a,  {  while ( a != b && a) {    a = a.parentNode;  }  return !!a;}// Выбираем модальные окна:var modal = $('.popup_element');// Для всех окон создаем методы:for (var i=0, len=modal.length; i<len; i++) {  // Метод show():  // [1] - Отображаем модальное окно.  // [2] - Вешаем обработчик onclick на body в котором будет проверка:  // [3] - Если элемент, сгенерировавший onclick, не является модальным окном,  //       его дочерним элементом или кнопкой, открывающей это окно:  // [4] - Скрыть модальное окно  modal[i].show = function (btn) {    $(this).addClass('show');                                   /*[1]*/    var self = this;    $('body').click(function(e){                                /*[2]*/      if ( !isNested( e.target, self) && e.target !== btn )     /*[3]*/        self.hide();                                            /*[4]*/    });  };  // метод hide():  // [1] - Скрываем модальное окно.  // [2] - Удаляем обработчик onclick у body.  modal[i].hide = function () {    $(this).removeClass( 'show' );                              /*[1]*/    $('body').click(function() {});                             /*[2]*/  };}// Для отображения окна вызываем везде где нужно метод show(). Ваш кэп.
Edited by ows.nightwolf
Link to comment
Share on other sites

  • 0

поидее

$(window).load(function(){   $('body').click(function(){    $('.popup_element').removeClass('wp-tab-active');  });})

Но могу ошибаться)

заставили читать весь сайт пока ищу кнопку "подробнее" оказывается это "чудо" вот оно http://joxi.ru/FIrrU4wyTJDPAh4G0iE

Уж очень подробнее))

 

p.s. по ночам консоль с ошибками с косой не сниться?) 

 

 

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

Link to comment
Share on other sites

  • 0

Я бы так делал:

Дал модальному окну свои методы show() и hide(). В методе show() назначал бы обработчик клика по body и вызывал окно, а в методе hide() - удалял обработчик клика с body и скрывал окно. Кроме того т.к. клик по самому модальному окну так же сгенерирует событие в body, надо включить в тело обарботчика клика проверку на то по какому элементу произошел клик (чтоб по клику по самому модальному окну оно не закрывалось). Плюс назначения методов окну в том, что пока окно закрыто обработчик onclick не висит на body без надобносити. Кроме того, вы сможете так же добавить окну кнопку "закрыть" (что желательно, т.к. не всем интуитивно понятно что надо кликнуть за пределами окна чтобы его закрыть, обычно глаза ищут стандартный крестик виндоуз) и по клику на нее вызывать тот же метод hide() модального окна. В коде вашем я не копался, вот общий принцип работы моего варианта, подстроите под себя:

// Вспомогательная функция проверки на то, является ли элемент "а" вложенным в элемент "b"function isNested(a,  {  while ( a != b && a) {    a = a.parentNode;  }  return !!a;}// Выбираем модальное окно:var modal = $('.popup_element');// Метод show():// [1] - Отображаем модальное окно.// [2] - Вешаем обработчик onclick на body в котором будет проверка:// [3] - Если элемент, сгенерировавший onclick, не является модальным окном или его дочерним элементом:// [4] - Скрыть модальное окноmodal.show = funciton () {  this.addClass('wp-tab-active');         /*[1]*/  $('body').click(function(e){            /*[2]*/    if ( !isNested( e.target, modal) )    /*[3]*/      modal.hide();                       /*[4]*/  });};// метод hide():// [1] - Скрываем модальное окно.// [2] - Удаляем обработчик onclick у body.modal.hide = function () {  this.removeClass('wp-tab-active');      /*[1]*/  $('body').click(function() {});         /*[2]*/};// Для отображения окна вызываем везде где нужно метод modal.show(). Ваш кэп.

 

 

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

Но вот хотелось бы уточнить пару нюансов: 

Расскажите мне более подробно о этом методе, что должно проверяться и что вложено 

    $('body').click(function(e){

        if ( !isNested( e.target, modal) )

        modal.hide();

        });

    };

 

    var modal = $('.clip_frame'); // Метод show():	modal.show = funciton () {		this.addClass('wp-tab-active');     			$('body').click(function(e){           		if ( !isNested( e.target, modal) )    		modal.hide();                          		});	}; // метод hide():			modal.hide = function () {			this.removeClass('wp-tab-active');   		$('body').click(function() {});         		};	});	

Edited by Omega24v
Link to comment
Share on other sites

  • 0

Расскажите мне более подробно о этом методе, что должно проверяться и что вложено 

    $('body').click(function(e){

        if ( !isNested( e.target, modal) )

        modal.hide();

        });

    };

 

Это относится к теме всплытия событий. В кратце: "После того, как событие сработает на самом вложенном элементе, оно также сработает на родителях, вверх по цепочке вложенности". Когда мы вешаем обработчик click на body, все клики по любому элементу на странице (в том числе и по нашему модальному окну) будут вызывать обработчик этого события ( в частности: кликнули по модальному окну - событие "всплывает" вверх к родителю, к родителю родителя и т.д., доходит до body и у него выполняется ваш назначенный обработчик ). А т.к. в обработчике click у body у нас стоит директива "скрыть модальное окно", то получится что наше модальное окно будет скрываться по клику на него самого, что не есть хорошо. По этому перед выполнением скрытия нужно проверить на каком элементе был произведен клик. Если клик произведен по модальному окну, или его дочернему элементу - окно скрываться не должно.

 

P.S. К стати, вместо проверки на вложенность еще можно было повесить на модальное окно обработчик click с инструкцией прекращения всплытия.

P.P.S У меня там в самой функции isNested косяк был (вторая строка сверху), второй аргумент и скобка пропали, исправил.

Edited by ows.nightwolf
Link to comment
Share on other sites

  • 0

 

Расскажите мне более подробно о этом методе, что должно проверяться и что вложено 

    $('body').click(function(e){

        if ( !isNested( e.target, modal) )

        modal.hide();

        });

    };

 

Это относится к теме всплытия событий. В кратце: "После того, как событие сработает на самом вложенном элементе, оно также сработает на родителях, вверх по цепочке вложенности". Когда мы вешаем обработчик click на body, все клики по любому элементу на странице (в том числе и по нашему модальному окну) будут вызывать обработчик этого события ( в частности: кликнули по модальному окну - событие "всплывает" вверх к родителю, к родителю родителя и т.д., доходит до body и у него выполняется ваш назначенный обработчик ). А т.к. в обработчике click у body у нас стоит директива "скрыть модальное окно", то получится что наше модальное окно будет скрываться по клику на него самого, что не есть хорошо. По этому перед выполнением скрытия нужно проверить на каком элементе был произведен клик. Если клик произведен по модальному окну, или его дочернему элементу - окно скрываться не должно.

 

P.S. К стати, вместо проверки на вложенность еще можно было повесить на модальное окно обработчик click с инструкцией прекращения всплытия.

P.P.S У меня там в самой функции isNested косяк был (вторая строка сверху), второй аргумент и скобка пропали, исправил.

 

 

 Вот мне предоставили условно рабочий код, но тут нету проверки на id, можно к нему проверку прикрутить ??? А то он закрывает все модальные окна + кнопка "подробнее" не вызывается 

 

$(window).on('click', function( event ){if ( $( event.target ).closest( 'div.grpelem.wp-panel' ).length == 0 ){var element = $('div.grpelem.wp-panel:visible');if ( !$( event.target ).hasClass( '.popup_element' ) ){element.removeClass('wp-panel-active').hide();}if ( element.size() > 0 ){$( '.popup_element.wp-tab-active' ).removeClass( 'wp-tab-active PamphletThumbSelected' );}}}); 
Edited by Omega24v
Link to comment
Share on other sites

  • 0

 Вот мне предоставили условно рабочий код, но тут нету проверки на id, можно к нему проверку прикрутить ??? А то он закрывает все модальные окна + кнопка "подробнее" не вызывается 

 

$(window).on('click', function( event ){if ( $( event.target ).closest( 'div.grpelem.wp-panel' ).length == 0 ){var element = $('div.grpelem.wp-panel:visible');if ( !$( event.target ).hasClass( '.popup_element' ) ){element.removeClass('wp-panel-active').hide();}if ( element.size() > 0 ){$( '.popup_element.wp-tab-active' ).removeClass( 'wp-tab-active PamphletThumbSelected' );}}}); 

 

 

Затрудняюсь ответить почему кнопка не вызывается, т.к. в предоставленом коде не вижу сходу ничего что могло бы нарушить ее функционал, тут только директивы для скрытия модальных окон. Но я не смотрел код и структуру вашего сайта (и не буду, не люблю я это дело), так что возможно я не до конца понимаю всех нюансов данного кода. А на счет проверки на id - что вы имеете в виду?

Link to comment
Share on other sites

  • 0

 

 Вот мне предоставили условно рабочий код, но тут нету проверки на id, можно к нему проверку прикрутить ??? А то он закрывает все модальные окна + кнопка "подробнее" не вызывается 

 

$(window).on('click', function( event ){if ( $( event.target ).closest( 'div.grpelem.wp-panel' ).length == 0 ){var element = $('div.grpelem.wp-panel:visible');if ( !$( event.target ).hasClass( '.popup_element' ) ){element.removeClass('wp-panel-active').hide();}if ( element.size() > 0 ){$( '.popup_element.wp-tab-active' ).removeClass( 'wp-tab-active PamphletThumbSelected' );}}}); 

 

 

Затрудняюсь ответить почему кнопка не вызывается, т.к. в предоставленом коде не вижу сходу ничего что могло бы нарушить ее функционал, тут только директивы для скрытия модальных окон. Но я не смотрел код и структуру вашего сайта (и не буду, не люблю я это дело), так что возможно я не до конца понимаю всех нюансов данного кода. А на счет проверки на id - что вы имеете в виду?

 

 

У каждой кнопки и модального окна id, по этому 2 раз кнопка не работает  и не работает 

Link to comment
Share on other sites

  • 0
Ребята, помогите ! Заплачу. Сроки поджимают.

 

http://htmlforum.ru/index.php?showforum=54

 

Быстрее найдутся. А можно и прописать класс всем окнам того типа, и закрывать их по клику на body.

Edited by Нарек
Link to comment
Share on other sites

  • 0

 

У каждой кнопки и модального окна id, по этому 2 раз кнопка не работает  и не работает 

 

 

всеравно я не понимаю как id может влиять на работоспособность кнопки) И вообще, что у вас за задача? Вам надо чтоб несколько окон одновременно можно было открывать? По клику на боди должны закрываться все сразу, или по одному?

Link to comment
Share on other sites

  • 0

 

 

У каждой кнопки и модального окна id, по этому 2 раз кнопка не работает  и не работает 

 

 

всеравно я не понимаю как id может влиять на работоспособность кнопки) И вообще, что у вас за задача? Вам надо чтоб несколько окон одновременно можно было открывать? По клику на боди должны закрываться все сразу, или по одному?

 

Открываться должно одно окно, закрываться должно то окно которое открылось... 

Link to comment
Share on other sites

  • 0
Открываться должно одно окно, закрываться должно то окно которое открылось... 

 

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

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Similar Content

    • By Seadjus
      Добрый день!
      Огромная просьба камнями не кидаться!
      Начал изучать JS , пока нет особых продвижений в изучении.
      помогите оптимизировать игру в пары. по условиям задания необходимо реализовать игру в пары с таймером, выбором количества карт .
      Ниже
      https://codepen.io/Seadjus/pen/VwVedaP
    • By ilya1203
      Прошу помочь с заданием:
      Написать файл скрипта, который генерирует три числа, соответствующие значениям высоты, длины и ширины комнаты. Отобразить в консоли:
      a.Площадь стен комнаты
      b.Объём комнаты
      c.*Объём комнаты за вычетом случайно сгенерированного количества чисел, которые определяет объёмы случайно зашедших в комнату людей.
      (в итоге запустит скрипт последством консоли)
      (заранее огромное спасибо)
    • By Kaido
      Использую готовый плагин для модальных окон(от MaxGraph). Проблема в том, что когда у меня открыто два модальных окна, для примера Форма + Политика конфендициальности, и мне нужно закрыть политику вместе с ней закрывается и другое модальное окно. В JS я не сильно разбираюсь(собственно из за этого и использую готовый плагин), можете помочь кто работал с этим плагином? Я примерно понимаю как он работает, но реализовать чтобы закрывалось только одно не получается.
       
        <div class="content"> <button class="modal-btn" data-path="first" data-animation="fadeInUp" data-speed="1500">Открыть окно 1</button> </div> <div class="modal"> <div class="modal__wrapp" data-target="first"> <div class="modal__content"> <button class="modal__close">Закрыть</button> модальное окно <button data-path="policy">Политика</button> </div> </div> <div class="modal__wrapp" data-target="policy"> <div class="modal__content"> <button class="modal__close">Закрыть</button> политика </div> </div> </div> .modal { --transition-time: 0.3s; position: fixed; left: 0; top: 0; right: 0; bottom: 0; z-index: 1000; cursor: pointer; overflow-y: auto; overflow-x: hidden; text-align: center; opacity: 0; visibility: hidden; transition: opacity var(--transition-time), visibility var(--transition-time); } .modal__wrapp { display: none; cursor: default; width: fit-content; height: fit-content; } .modal__content{ position: absolute; left: 500px; width: 500px; height: 500px; display: flex; color: white; flex-direction: column; text-align: left; background-color: #000; } .modal__content button{ width: 200px; height: 50px; margin: 50px 0; } .modal.is-open { opacity: 1; visibility: visible; transition: opacity var(--transition-time), visibility var(--transition-time); } .modal__wrapp.modal-open { display: flex; } .disable-scroll { position: relative; overflow: hidden; height: 100vh; position: fixed; left: 0; top: 0; width: 100%; } .fade { opacity: 0; transition: opacity var(--transition-time); } .fade.animate-open { opacity: 1; transition: opacity var(--transition-time); } .fadeInUp { opacity: 0; transform: translateY(vw(-100)); transition: opacity var(--transition-time), transform var(--transition-time); } .fadeInUp.animate-open { opacity: 1; transform: translateY(0); transition: opacity var(--transition-time), transform var(--transition-time); } .modal__wrapp[data-target="policy"] .modal__content{ left: 1050px; background-color: #000; opacity: .5; } class Modal { constructor(options) { let defaultOptions = { isOpen: () => {}, isClose: () => {}, } this.options = Object.assign(defaultOptions, options); this.modal = document.querySelector('.modal'); this.speed = false; this.animation = false; this.isOpen = false; this.modalContainer = false; this.previousActiveElement = false; this.fixBlocks = document.querySelectorAll('.fix-block'); this.focusElements = [ 'a[href]', 'input', 'button', 'select', 'textarea', '[tabindex]' ]; this.events(); } events() { if (this.modal) { document.addEventListener('click', function(e){ const clickedElement = e.target.closest('[data-path]'); if (clickedElement) { let target = clickedElement.dataset.path; let animation = clickedElement.dataset.animation; if (clickedElement.classList.contains('modal-close')) { this.close(); } let speed = clickedElement.dataset.speed; this.animation = animation ? animation : 'fade'; this.speed = speed ? parseInt(speed) : 300; this.modalContainer = document.querySelector(`[data-target="${target}"]`); this.open(); return; } if (e.target.closest('.modal__close')) { this.close(); return; } }.bind(this)); window.addEventListener('keydown', function(e) { if (e.keyCode == 27) { if (this.isOpen) { this.close(); } } if (e.keyCode == 9 && this.isOpen) { this.focusCatch(e); return; } }.bind(this)); this.modal.addEventListener('click', function(e) { if (!e.target.classList.contains('modal__wrapp') && !e.target.closest('.modal__wrapp') && this.isOpen) { this.close(); } }.bind(this)); } } open() { this.previousActiveElement = document.activeElement; this.modal.style.setProperty('--transition-time', `${this.speed / 1000}s`); this.modal.classList.add('is-open'); this.disableScroll(); this.modalContainer.classList.add('modal-open'); this.modalContainer.classList.add(this.animation); setTimeout(() => { this.options.isOpen(this); this.modalContainer.classList.add('animate-open'); this.isOpen = true; this.focusTrap(); }, this.speed); } close() { if (this.modalContainer) { this.modalContainer.classList.remove('animate-open'); this.modalContainer.classList.remove(this.animation); this.modal.classList.remove('is-open'); this.modalContainer.classList.remove('modal-open'); this.enableScroll(); this.options.isClose(this); this.isOpen = false; this.focusTrap(); } } focusCatch(e) { const focusable = this.modalContainer.querySelectorAll(this.focusElements); const focusArray = Array.prototype.slice.call(focusable); const focusedIndex = focusArray.indexOf(document.activeElement); if (e.shiftKey && focusedIndex === 0) { focusArray[focusArray.length - 1].focus(); e.preventDefault(); } if (!e.shiftKey && focusedIndex === focusArray.length - 1) { focusArray[0].focus(); e.preventDefault(); } } focusTrap() { const focusable = this.modalContainer.querySelectorAll(this.focusElements); if (this.isOpen) { focusable[0].focus(); } else { this.previousActiveElement.focus(); } } disableScroll() { let pagePosition = window.scrollY; this.lockPadding(); document.body.classList.add('disable-scroll'); document.body.dataset.position = pagePosition; document.body.style.top = -pagePosition + 'px'; } enableScroll() { let pagePosition = parseInt(document.body.dataset.position, 10); this.unlockPadding(); document.body.style.top = 'auto'; document.body.classList.remove('disable-scroll'); window.scroll({ top: pagePosition, left: 0 }); document.body.removeAttribute('data-position'); } lockPadding() { let paddingOffset = window.innerWidth - document.body.offsetWidth + 'px'; this.fixBlocks.forEach((el) => { el.style.paddingRight = paddingOffset; }); document.body.style.paddingRight = paddingOffset; } unlockPadding() { this.fixBlocks.forEach((el) => { el.style.paddingRight = '0px'; }); document.body.style.paddingRight = '0px'; } } const modal = new Modal({ isOpen: (modal) => { console.log(modal); console.log('opened'); }, isClose: () => { console.log('closed'); }, });  
    • By ilyamio
      Здравствуйте. Имеется рабочий скрипт конвертера валют. https://ilyamio.github.io/currencyconverter/
      Мне необходимо изменить источник загрузки курсов на ЦБ РФ вот по этой ссылке: https://www.cbr.ru/scripts/XML_daily.asp
      А также мне необходимо установить ограничение на количество обращений к сайту ЦБ РФ - 1 раз в сутки. При частом обращении, могут заблокировать.
      Вот в этом js файле находятся настройки конвертера:
      const from_currencyEl = document.getElementById('from_currency'); const from_ammountEl = document.getElementById('from_ammount'); const to_currencyEl = document.getElementById('to_currency'); const to_ammountEl = document.getElementById('to_ammount'); const rateEl = document.getElementById('rate'); const exchange = document.getElementById('exchange'); from_currencyEl.addEventListener('change', calculate); from_ammountEl.addEventListener('input', calculate); to_currencyEl.addEventListener('change', calculate); to_ammountEl.addEventListener('input', calculate); exchange.addEventListener('click', () => { const temp = from_currencyEl.value; from_currencyEl.value = to_currencyEl.value; to_currencyEl.value = temp; calculate(); }); function calculate() { const from_currency = from_currencyEl.value; const to_currency = to_currencyEl.value; fetch(`https://api.exchangerate-api.com/v4/latest/${from_currency}`) .then(res => res.json()) .then(res => { const rate = res.rates[to_currency]; rateEl.innerText = `1 ${from_currency} = ${rate} ${to_currency}` to_ammountEl.value = (from_ammountEl.value * rate).toFixed(2); }) } calculate(); Как мне изменить настройки в этом файле чтобы курсы брались с https://www.cbr.ru/scripts/XML_daily.asp и включить ограничение на количество обращений по ссылке cbr.ru - 1 раз в сутки?
      Заранее спасибо всем, кто хотел помочь с решением этой задачи.
    • By vasyl_runner
      $(function () { var mixer = mixitup('.directions__list'); $('.directions__filter-btn').on('click', function () { $('.directions__filter-btn').removeClass('directions__filter-btn--active') $(this).addClass('directions__filter-btn--active') }) })
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy