2017-02-20 9 views
0

Я пытаюсь запустить прослушиватель событий mouseover, только когда завершится переход css. Я попытался предупредить случайное сообщение, когда css-переход завершается, и он работает по назначению (показывается только сообщение, когда оно заканчивается). Но по какой-то причине событие mouseover работает еще до завершения перехода.Прослушивание прослушивателей событий внутри прослушивателя событий перехода?

Ниже представлен мой javascript. Спасибо заранее, ребята.

mapContainer.addEventListener("transitionend", function(){ 
    mapContainer.addEventListener("mousemove", function(e){ 
     if(e.clientX >= 200 && e.clientX <= 600){ 
      removeClass(mapContainer, "map-right"); 
      addClass(mapContainer, "map-left"); 
     } else if (e.clientX >= 900){ 
      removeClass(mapContainer, "map-left"); 
      addClass(mapContainer, "map-right");   
     } else { 
      removeClass(mapContainer, "map-left"); 
      removeClass(mapContainer, "map-right"); 
     } 
    }); 
}); 

ОБНОВЛЕНИЕ: Я использовал хакерский хакер Z-Index, который неожиданно работает ... по крайней мере, для того, чего я пытаюсь достичь. Не уверен, что это хорошо на практике. Но в основном я применяю Z-индекс 0 на контейнере карты в CSS, и когда контейнер активен, я использую setTimeout() для увеличения Z-индекса и устанавливаю интервал до 3 секунд, чтобы Z-индекс не делал ' t, пока не закончится переход.

Javascript

setTimeout(function(){ 
    campaignContainer.style.zIndex = "3"; 
    mapContainer.style.zIndex = "3"; 
}, 3000); 

CSS

.map-container { 
    height: 100%; 
    opacity: 0; 
    position: absolute; 
    transform: scale(2) rotate(30deg); 
    transition: all 1.2s linear; 
    width: 100%; 
    z-index: 0; 
} 
+0

Вы хотите запустить событие (имитировать/вызвать событие mouseover) или вы хотите прослушивать событие mouseover на узле только после того, как был запущен 'animationend' (так что слушайте' mouseover' только после завершения анимации)? –

+0

эй давид! Я хочу прослушать событие mouseover ПОСЛЕ завершения анимации :) Должен ли я использовать 'animationend' вместо' transitionend'? Я использую переход в CSS, а не анимацию с ключевыми кадрами ** EDIT ** просто попробовал «анимацию», и он не работал – giantqtipz

+1

'addEventListener' делает то, что он говорит; он добавляет слушателя событий. Этот слушатель прослушивается с момента его добавления до выгрузки страницы или вызывается ['removeEventListener'] (https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener). Если этот переход выполняется несколько раз, вы добавляете несколько слушателей к одному и тому же событию. Вам понадобится способ удаления прослушивателя событий, когда вы больше не хотите его запускать. –

ответ

1

Вот то, что будет работать один раз в переходе:

var transitioned = document.getElementById("transition"); 
 
var show = document.getElementById("show"); 
 
var hasEnded = false; 
 

 
transitioned.addEventListener("transitionend", function(evt){ 
 
\t console.log("end") 
 
    hasEnded = true; 
 
}); 
 

 
transitioned.addEventListener("mousemove", function(evt){ 
 
    if(hasEnded) { 
 
     console.log("Mousemoving"); 
 
    } 
 
});
#transition { 
 
    background: yellow; 
 
    padding: 10px; 
 
    transition: all 1s linear; 
 
    -webkit-transition: all 1s linear; 
 
} 
 
#transition:hover { 
 
    background: red; 
 
}
<div id="transition"> 
 
Hover me! 
 
</div>

Кроме того, для IE10 и выше exlusively, вы можете также добавить

transitioned.addEventListener("transitionstart", function(evt){ 
    hasEnded = false; 
}); 

Читайте о polyfill для transitionstart:

+0

эй wscourge, спасибо за обмен. поэтому я только заметил, что «переход» срабатывает только один раз, когда страница загружается. он не срабатывает второй раз и сразу же запускает «mousemove» после первого раза. Я предполагаю, что я должен использовать 'removeEventListener' для сброса' transitionend'? – giantqtipz

+1

Ну, вот почему я добавил ссылку на «transitionstart».Если вы добавите еще один прослушиватель, который прослушивает 'transitionstart' в том же элементе, а внутри' 'fn()' устанавливает переменную 'hasEnded' в' false', все внутри 'mousemove' останавливается, потому что в нем ничего не происходит, а' hasEnded' не является «истинным». Но поддержка 'frontstart' слаба, поэтому для большинства браузеров (для IE10 и выше) требуется многозаполнение, и это то, на что ссылаются ссылки в нижней части моего ответа. – wscourge

+0

gotcha заглянет в это большое спасибо! – giantqtipz