Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.02.2018, 00:07
Новичок на форуме
Отправить личное сообщение для floody Посмотреть профиль Найти все сообщения от floody
 
Регистрация: 15.02.2018
Сообщений: 4

Второй раз функция вызывается некорректно
Здравствуйте. Пытаюсь сделать анимацию на js.
Все работает, но только один раз. При повторном клике функция работает уже начинает работать некорректно.
Необходимо сделать список(див), который будет появляться когда нажимаешь на обработчик1(.openli), на обработчик2(.closeli) должен исчезать.
На второй раз, когда нажимаешь на обработчик, див(список) появляется и сразу же исчезает. Будто обработчик2 нажимается автоматически при клике на обработчик1.

Все это я получаю путем добавления CSS: opacity и transition;
Если не понятно, перейдите по ссылке и попробуйте два раза открыть и закрыть список
Ссылка на песочницу https://jsfiddle.net/Ayvars/fjzc2ekz/3/#run


<div class="socialobes basis">
		<a href="#"><h2>Социальное обеспечение</h2></a>
  <ul>
   <li>подъёмные</li>
<li>индексация материнского капитала</li>
<li>бесплатная юридическая помощь многодетным семьям</li>
<li>оплата учебы материнским капиталом</li>
</ul>
       <span class="openli">показать все</span>
     
       <div class="openall">

        <ul><li>социальная стипендия</li>
<li>бесплатная юридическая помощь детям сиротам</li>
<li>региональный материнский капитал</li>
<li>пенсии и пособия</li>
<span class="closeli">скрыть</span>
</ul>
 </div>
</div>


Код:
.fa-enter{
	opacity: 0;
}

.fa-enter-active{

	transition: opacity 1s;
}
.fa-leave-active{
	transition: opacity 1s;
	opacity:0
  }
  .displayblock{
	display:block;

}
.displaynone{
display: none;
}
var seeall = document.querySelectorAll('.openli');


for (var i = 0; i < seeall.length; i++)  {


seeall[i].addEventListener('click',  function(){
var blockli = this.parentElement.children[3];

this.classList.add('fa-leave-active');
this.style.display = 'none';
this.classList.remove('fa-leave-active');


var handler = function(){
	blockli.classList.remove('fa-enter-active');
	blockli.removeEventListener('transitionend', handler);

};

blockli.style.display = 'block';
blockli.classList.add('fa-enter');
raf(function(){
	blockli.classList.remove('fa-enter');
blockli.classList.add('fa-enter-active');

blockli.addEventListener('transitionend', handler);
});



});
};


var closeall = document.querySelectorAll('.closeli');

for (i = 0; i < closeall.length; i++){
	closeall[i].addEventListener('click',  function(){
var handler2 = function(){
	sellallinhide.classList.remove('fa-enter-active');
	sellallinhide.removeEventListener('transitionend', handler2);

};
var hideall = this.parentElement.parentElement;
var parentforhide = this.parentElement;
var sellallinhide = parentforhide.parentElement.parentElement.children[2];
this.style.display = 'none';
hideall.classList.add('fa-leave-active');
hideall.addEventListener('transitionend', function(){
hideall.style.display = 'none';
hideall.classList.remove('fa-leave-active');
sellallinhide.style.display = 'block';
sellallinhide.classList.add('fa-enter');
raf(function(){
sellallinhide.classList.add('fa-enter-active');
sellallinhide.classList.remove('fa-enter');
sellallinhide.addEventListener('transitionend', handler2);

});

});
console.log(this.parentElement.parentElement);



});
}

function raf(fn){
	window.requestAnimationFrame(function(){
		window.requestAnimationFrame(function(){

		fn();
		});
	});
}

Последний раз редактировалось floody, 23.02.2018 в 01:37.
Ответить с цитированием
  #2 (permalink)  
Старый 23.02.2018, 14:38
Новичок на форуме
Отправить личное сообщение для Andrey163783 Посмотреть профиль Найти все сообщения от Andrey163783
 
Регистрация: 24.06.2017
Сообщений: 5

var btn1 = document.querySelector('.btn');
var hide = document.querySelector('.hide');

function openAndClose(elem, add){
  if(add){
    elem.classList.add('active');
  }else{
    elem.classList.remove('active');
  }
}

btn1.onclick = function(){
  var list = document.querySelector('.list');
  openAndClose(list,true)
}
hide.onclick = function(){
  var list = document.querySelector('.list');
  openAndClose(list,false);
}


делай разные классы

https://codepen.io/Andreydesign/pen/RQBjqo?editors=1111
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод выбранного элемента radio. Срабатывает только во второй раз. Mukhtar Events/DOM/Window 3 09.08.2012 12:19
Функция в функции. Обработчики клика. Запутался =) DorianLeroy Общие вопросы Javascript 8 29.09.2011 16:17
не срабатывает на второй раз ajax[отправка формы] vovs jQuery 5 21.09.2010 12:12
Некорректно работает функция для создания элементов exec Общие вопросы Javascript 4 13.07.2010 11:15
Не выполнять ф-цию второй раз, пока она не проработает до конца. peter888 Элементы интерфейса 2 04.04.2010 13:04