Событие завершения перехода Webkit называется webkitTransitionEnd, Firefox - transitionEnd, Opera - oTransitionEnd. Как лучше всего решить их все на чистом JS? Стоит ли анализировать браузер? или реализовать каждый отдельно? Другой способ, который мне не приходил в голову?
то есть:
//doing browser sniffing
var transitionend = (isSafari) ? "webkitTransitionEnd" : (isFirefox) ? "transitionEnd" : (isOpera) ? "oTransitionEnd";
element.addEventListener(transitionend, function(){
//do whatever
},false);
или
// Assigning an event listener per browser
element.addEventListener("webkitTransitionEnd", fn);
element.addEventListener("oTransitionEnd", fn);
element.addEventListener("transitionEnd", fn);
function fn() {
//do whatever
}
javascript
css
css-transitions
dom-events
метод действия
источник
источник
Ответы:
В Modernizr есть улучшенная техника:
function transitionEndEventName () { var i, undefined, el = document.createElement('div'), transitions = { 'transition':'transitionend', 'OTransition':'otransitionend', // oTransitionEnd in very old Opera 'MozTransition':'transitionend', 'WebkitTransition':'webkitTransitionEnd' }; for (i in transitions) { if (transitions.hasOwnProperty(i) && el.style[i] !== undefined) { return transitions[i]; } } //TODO: throw 'TransitionEnd event is not supported in this browser'; }
Затем вы можете просто вызвать эту функцию всякий раз, когда вам понадобится событие завершения перехода:
var transitionEnd = transitionEndEventName(); element.addEventListener(transitionEnd, theFunctionToInvoke, false);
источник
transition
иtransitionend
хватит. См .: caniuse.com/#search=transitionsundefined
?Согласно комментарию Matijs, самый простой способ обнаружения событий перехода - с помощью библиотеки, в данном случае jquery:
$("div").bind("webkitTransitionEnd.done oTransitionEnd.done otransitionend.done transitionend.done msTransitionEnd.done", function(){ // Unlisten called events by namespace, // to prevent multiple event calls. (See comment) // By the way, .done can be anything you like ;) $(this).off('.done') });
В javascript без библиотеки он становится немного подробным:
element.addEventListener('webkitTransitionEnd', callfunction, false); element.addEventListener('oTransitionEnd', callfunction, false); element.addEventListener('transitionend', callfunction, false); element.addEventListener('msTransitionEnd', callfunction, false); function callfunction() { //do whatever }
источник
msTransitionend
здесь не нужен.Обновить
Следующее - более чистый способ сделать это, и не требует modernizr.
$(".myClass").one('transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd', function() { //do something });
Альтернативно
var transEndEventNames = { 'WebkitTransition': 'webkitTransitionEnd', 'MozTransition': 'transitionend', 'OTransition': 'oTransitionEnd otransitionend', 'msTransition': 'MSTransitionEnd', 'transition': 'transitionend' }, transitionEnd = transEndEventNames[Modernizr.prefixed('transition')];
Это основано на коде, предложенном Modernizr, но с дополнительным событием для более новых версий Opera.
http://modernizr.com/docs/#prefixed
источник
one
вместоon
. Это было так очевидно!Если вы используете jQuery, и Bootstrap
$.support.transition.end
вернет правильное событие для текущего браузера.Он определен в Bootstrap и используется в обратных вызовах анимации , хотя в документации jQuery сказано, что на эти свойства нельзя полагаться:
источник
По состоянию на 2015 год этот однострочный интерфейс должен работать (IE 10+, Chrome 1+, Safari 3.2+, FF 4+ и Opera 12+): -
var transEndEventName = ('WebkitTransition' in document.documentElement.style) ? 'webkitTransitionEnd' : 'transitionend'
Присоединить прослушиватель событий просто: -
источник
transitionend
поддерживается ли он вообще:var transEndEventName = ('WebkitTransition' in document.documentElement.style) ? 'webkitTransitionEnd' : ('transitionend' in document.documentElement.style) ? 'transitionend' : false;
А затем выполните простую проверку:if(transEndEventName) element.addEventlistener(transEndEventName, theFunctionToInvoke)
Второй способ. Только одно из этих событий будет запускаться в каждом браузере, поэтому вы можете установить их все, и все будет работать.
источник
Вот более чистый способ
function transitionEvent() { // Create a fake element var el = document.createElement("div"); if(el.style.OTransition) return "oTransitionEnd"; if(el.style.WebkitTransition) return "webkitTransitionEnd"; return "transitionend"; }
источник
закрытие Google гарантирует, что вам не нужно этого делать. Если у вас есть элемент:
goog.events.listen(element, goog.events.EventType.TRANSITIONEND, function(event) { // ... your code here });
глядя на источник goog.events.eventtype.js, TRANSITIONEND вычисляется путем просмотра агента пользователя:
// CSS transition events. Based on the browser support described at: // https://developer.mozilla.org/en/css/css_transitions#Browser_compatibility TRANSITIONEND: goog.userAgent.WEBKIT ? 'webkitTransitionEnd' : (goog.userAgent.OPERA ? 'oTransitionEnd' : 'transitionend'),
источник
Я использую такой код (с jQuery)
var vP = ""; var transitionEnd = "transitionend"; if ($.browser.webkit) { vP = "-webkit-"; transitionEnd = "webkitTransitionEnd"; } else if ($.browser.msie) { vP = "-ms-"; } else if ($.browser.mozilla) { vP = "-moz-"; } else if ($.browser.opera) { vP = "-o-"; transitionEnd = "otransitionend"; //oTransitionEnd for very old Opera }
Это позволяет мне использовать JS для добавления вещей, указав vP, объединенный со свойством, и если он не попал в браузер, он просто использует стандарт. События позволяют мне легко привязать так:
object.bind(transitionEnd,function(){ callback(); });
источник
object.bind('transitionend oTransitionEnd webkitTransitionEnd', function() { // callback } );
transitionend
, а неTransitionEnd
.переопределение jquery:
(function ($) { var oldOn = $.fn.on; $.fn.on = function (types, selector, data, fn, /*INTERNAL*/ one) { if (types === 'transitionend') { types = 'transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd'; } return oldOn.call(this, types, selector, data, fn, one); }; })(jQuery);
и использование вроде:
$('myDiv').on('transitionend', function() { ... });
источник
Принятый ответ верен, но вам не нужно заново создавать этот элемент снова и снова и ...
Создайте глобальную переменную и добавьте функцию (ы):
(function(myLib, $, window, document, undefined){ /** * @summary * Returns the browser's supported animation end event type. * @desc * @see {@link https://jonsuh.com/blog/detect-the-end-of-css-animations-and-transitions-with-javascript/} * @function myLib.getAnimationEndType * @return {string} The animation end event type */ (function(){ var type; myLib.getAnimationEndType = function(){ if(!type) type = callback(); return type; function callback(){ var t, el = document.createElement("fakeelement"); var animations = { "animation" : "animationend", "OAnimation" : "oAnimationEnd", "MozAnimation" : "animationend", "WebkitAnimation": "webkitAnimationEnd" } for (t in animations){ if (el.style[t] !== undefined){ return animations[t]; } } } } }()); /** * @summary * Returns the browser's supported transition end event type. * @desc * @see {@link https://jonsuh.com/blog/detect-the-end-of-css-animations-and-transitions-with-javascript/} * @function myLib.getTransitionEndType * @return {string} The transition end event type */ (function(){ var type; myLib.getTransitionEndType = function(){ if(!type) type = callback(); return type; function callback(){ var t, el = document.createElement("fakeelement"); var transitions = { "transition" : "transitionend", "OTransition" : "oTransitionEnd", "MozTransition" : "transitionend", "WebkitTransition": "webkitTransitionEnd" } for (t in transitions){ if (el.style[t] !== undefined){ return transitions[t]; } } } } }()); }(window.myLib = window.myLib || {}, jQuery, window, document));
источник