Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.03.2017, 12:30
Профессор
Отправить личное сообщение для Роман Андреевич Посмотреть профиль Найти все сообщения от Роман Андреевич
 
Регистрация: 12.08.2016
Сообщений: 299

событие transitionend не срабатывает
Коллеги доброго времени суток, есть скрипт:
var PLUGIN= (function() {
"use strict";
	function _CROSS_EVENTS(element, type, func) {
		this.add = function(element, type, func) {
			if(typeof addEventListener !== 'undefined') {
				element.addEventListener(type, func, false);
			} else if(typeof attachEvent !== 'undefined') {
				element.attachEvent('on' + type, func);
			} else {
				element['on' + type] = func;
			}
		},
		this.default = function(e) {
			if(typeof e.preventDefault !== 'undefined') {
				e.preventDefault();
			} else {
				e.returnValue = false;
			}
		},
		this.remove = function(element, tp, func) {
			if(typeof removeEventListener !== 'undefined') {
				element.removeEventListener(tp, func, false);
			} else if(typeof detachEvent !== 'undefined') {
				element.detachEvent('on' + tp, func);
			} else {
				element['on' + tp] = null;
			}
		}
	};

	var _crossy = new _CROSS_EVENTS();

	var _EVENTS_TYPE = {
			start: '',
			move: '',
			end: '',
			resize: 'resize',
			transitionend: 'transitionend'
		};

	function _SLIDER() {
        this.bullets = false,
        this.arrows = false,
        this.dragDrop = false,
        this.autoSwitch = false,
        this.deadZone = false,
        this.standartDuration = 100
	}

	_SLIDER.INIT = function(element, params) {
		_sliderSize(element);
		var  slider = new _SLIDER();
		slider.element = element.querySelector('.slider_list');
		_setOptions(slider, params);
		_getEvenetsType(element);

		function _sliderStart(e) {
            e = e || window.e;

	        if (slider.action && !slider.element) return;

			if (!slider.dragDrop) return;

	        slider.action = true;

	        var coords = _getOffset(slider.element),
	        	downX = e.clientX;

			slider.shiftX = downX - coords.left;

			slider.element.classList.add('move');

		}

		function _sliderGo(e) {
            e = e || window.e;
            if (!slider.action) return;
	       	slider.distanceX = e.clientX - slider.shiftX;
			_sliderMove(slider.element, slider.distanceX);
			_crossy.default(e);
		}

		function _sliderStop(e) {
            e = e || window.e;
	       	if (slider.action) {
				_getTransition(slider.element, slider.standartDuration);
				_sliderMove(slider.element, 0);
			}
		}

		function _transitionStop() {
            if (slider.action) {
	            _getTransition(slider.element, 0);
	            slider.element.classList.remove('move');
	            slider.action = false;
            }
		}

		function _sizeCrew(e) {
			e = e || window.e;
			_sliderSize(element);
		}

		_crossy.add(slider.element, 'mousedown', _sliderStart);
		_crossy.add(document, 'mousemove', _sliderGo);
		_crossy.add(document, 'mouseup', _sliderStop);
		_crossy.add(slider.element, 'transitionend', _transitionStop);
		_crossy.add(window, _EVENTS_TYPE.resize, _sizeCrew);

	};


    function _getTransition(element, duration) {
    	element.style.webkitTransition = '-webkit-transform ' + duration + 'ms linear';
    	element.style.mozTransition = '-moz-transform ' + duration + 'ms linear';
    	element.style.msTransition = '-ms-transform ' + duration + 'ms linear';
    	element.style.oTransition = '-o-transform ' + duration + 'ms linear';
    	element.style.transition = 'transform ' + duration + 'ms linear';
    }

    function _sliderMove(element, distance) {
		element.style.webkitTransform = "-webkit-translate(" + distance + "px, 0)";
		element.style.mozTransform = "-moz-translate(" + distance + "px, 0)";
		element.style.msTransform = "-ms-translate(" + distance + "px, 0)";
		element.style.oTransform = "-o-translate(" + distance + "px, 0)";
		element.style.transform = "translate(" + distance + "px, 0)";
    }

	function _sliderSize(element) {
		var screenWidth = _getScreenSize(),
			list = element.querySelector('.slider_list'),
			items = list.children;
		for (var i = 0;i < items.length;i++) {
			items[i].style.width = screenWidth + 'px';
		}
		list.style.width = (screenWidth * items.length) + 'px'
	}

    function _getScreenSize() { // выяснить разрешение экрана пользователя
    	return document.documentElement.clientWidth;
    }

	function _setOptions(object, params) {
		if (params && _isObject(params)) {
		    for (var key in params) {
	            object[key] = params[key];
	        }
		}
	};

    function _isObject(object) {
        if (object.toString == Object.prototype.toString) {
            return true;
        } else return false;
    };

	function _getOffset(element) {
	  var box = element.getBoundingClientRect();
	  return {
	    top: box.top + pageYOffset,
	    left: box.left + pageXOffset
	  };
	}

	return {
		sliderINIT: _SLIDER.INIT,
		crossEvent: _crossy,
	}
}());
			PLUGIN.crossEvent.add(document,'DOMContentLoaded', function() {
				var main = document,
					slider_one = main.querySelector('.slider_block.one'),
					slider_two = main.querySelector('.slider_block.two');

				_RMS.sliderINIT(slider_one, {
					dragDrop:true
				});
				_RMS.sliderINIT(slider_two);
			});

Собственно по коду наверное ясно, что это слайдер. Суть вопроса в том, что по событию transitionend должно все "обнуляться", а оно не "обнуляется". Помогите разобраться. Заранее благодарю
Ответить с цитированием
  #2 (permalink)  
Старый 28.03.2017, 12:35
Профессор
Отправить личное сообщение для Роман Андреевич Посмотреть профиль Найти все сообщения от Роман Андреевич
 
Регистрация: 12.08.2016
Сообщений: 299

Вернее, сказать срабатывает, но когда курсор выходит за пределы документа почему то. А когда отпускаю курсор над document слайдер встает на месте, где его отпустил
Ответить с цитированием
  #3 (permalink)  
Старый 28.03.2017, 13:19
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

Роман Андреевич,
может пример полностью?
Ответить с цитированием
  #4 (permalink)  
Старый 28.03.2017, 13:28
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

Сообщение от Роман Андреевич
но когда курсор выходит за пределы документа почему то.
может строка 105 мешает?
Ответить с цитированием
  #5 (permalink)  
Старый 28.03.2017, 13:33
Профессор
Отправить личное сообщение для Роман Андреевич Посмотреть профиль Найти все сообщения от Роман Андреевич
 
Регистрация: 12.08.2016
Сообщений: 299

рони,
Ну тут логика по-мойму проста. сначала mousedow потом mousemove а в конце mouseup. Почему она мешает?????
Ответить с цитированием
  #6 (permalink)  
Старый 28.03.2017, 13:40
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

Роман Андреевич,
гадание ... логика вашего слайдера известна только вам.
Ответить с цитированием
  #7 (permalink)  
Старый 28.03.2017, 13:40
Профессор
Отправить личное сообщение для Роман Андреевич Посмотреть профиль Найти все сообщения от Роман Андреевич
 
Регистрация: 12.08.2016
Сообщений: 299

при событии mousemove нужно отобразить смещение блока. а при mouseup он куда то должен уехать. В этом случае вернуться на место.
По событию transitionend анулируются все флаги и т.д.
Вот и не могу понять почему если курсор за пределами документа, то все ок, а если на документе, то пока не остановиться курсор, то ничего не анулируется, но при этом сам блок остается на том месте где остановился курсор.
Ответить с цитированием
  #8 (permalink)  
Старый 28.03.2017, 13:46
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

Роман Андреевич,
может какой slider.action установлен неправильно, сложно понять о чём вы говорите.
Ответить с цитированием
  #9 (permalink)  
Старый 28.03.2017, 13:48
Профессор
Отправить личное сообщение для Роман Андреевич Посмотреть профиль Найти все сообщения от Роман Андреевич
 
Регистрация: 12.08.2016
Сообщений: 299

Сейчас ссылку сделаю
Ответить с цитированием
  #10 (permalink)  
Старый 28.03.2017, 13:49
Профессор
Отправить личное сообщение для Роман Андреевич Посмотреть профиль Найти все сообщения от Роман Андреевич
 
Регистрация: 12.08.2016
Сообщений: 299

https://jsfiddle.net/19tdd6y4/1/
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Событие onresize не срабатывает vadval15 Общие вопросы Javascript 3 16.11.2015 18:23
Не срабатывает событие mouseup в chrome Евгений_Лазаренко Events/DOM/Window 6 28.01.2015 12:06
Вопрос по backbone - не срабатывает событие vuler Общие вопросы Javascript 4 28.12.2014 21:20
Событие на теге input срабатывает несколько раз hrundel Events/DOM/Window 3 15.12.2013 14:49
Некорректно срабатывает событие DZHETIGAPA Events/DOM/Window 4 12.05.2011 22:28