Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 23.04.2020, 18:55
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,134

Сообщение от Янковиц
Интересно, в чём причина?
на момент установки плагина
на странице ещё не было элемента, jquery продолжает работать, кто - то считает что это минус jquery, и всё должно было рухнуть , кто - то что это плюс что ничего не случилось.
Ответить с цитированием
  #12 (permalink)  
Старый 27.04.2020, 16:57
Профессор
Отправить личное сообщение для Янковиц Посмотреть профиль Найти все сообщения от Янковиц
 
Регистрация: 17.11.2014
Сообщений: 403

Небольшое дополнение. Добавил в плагин callback функции moveStart и moveEnd.
(function($){
	// настройки со значением по умолчанию
	var defaults = {
		speed: 500,
		moveStart: function() {},
		moveEnd: function() {},
	};

	// наши будущие публичные методы
	var methods = {
		xDown: null,                                                        
		yDown: null,
		// инициализация плагина
		init: function( options, args ) {
			// настройки, будут индивидуальными при каждом запуске
			var options = $.extend({}, defaults, options);				
			// инициализируем лишь единожды
			if (!this.data('sSlider')) {
			
				this.data('sSlider', options);
				
				// добавим событий
				var slider      = this,
					child_class = slider.find('*[data-element="box"]').children().eq(0).attr('class');
					
				$(document)
					.on('mousedown touchend', '*[data-direction]', function(e){
						methods.move( slider, $(this).data('direction'), options );
					})
			}
			return this;
		},
		// двигаем слайдер
		move: function( slider, direction, options ) {
			var block  = slider.find('*[data-element="box"]'),
				items  = block.children(),
				first  = items.eq(0),
				last   = items.eq(-1);
			
			if( first.is( ':animated' ) ) {
				return;
			}
			items.stop(true, true);
			
			options.moveStart.call( slider, direction );
			
			if ( direction === 'prev' ) {	
				first.animate({
					marginLeft: 0 - first.outerWidth()
				}, options.speed, function() {
					first.css('margin-left', 0)
						.appendTo( first.parent() );
				});
			} else {
				last.prependTo(last.parent())
					.css('margin-left','-'+last.outerWidth()+'px')
						.animate({marginLeft:0}, options.speed);
			}
			
			setTimeout(function () {
				options.moveEnd.call( slider, direction );
			}, options.speed);
		},
	};

	$.fn.sSlider = function(method){
		if ( methods[method] ) {
			// если запрашиваемый метод существует, мы его вызываем
			// все параметры, кроме имени метода прийдут в метод
			// this так же перекочует в метод
			return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
		} else if ( typeof method === 'object' || ! method ) {
			// если первым параметром идет объект, либо совсем пусто
			// выполняем метод init
			return methods.init.apply( this, arguments );
		} else {
			// если ничего не получилось
			$.error('Method "' + method + '" not found');
		}
	};
})(jQuery);

Затем вызываю слайдер:

$(function() {
		$('.glider').sSlider({
			moveStart: function( slider, direction ) {
				console.log( slider );
				console.log( direction );
			},
		});
	});


При этом console.log из строки 04 показывает "prev" или "next", а в строке 05 "undefined". Хотя сначала я ожидал увидеть DOM элемент $('.glider'), а затем направление direction. Что я делаю не так?

Последний раз редактировалось Янковиц, 27.04.2020 в 17:00.
Ответить с цитированием
  #13 (permalink)  
Старый 27.04.2020, 17:22
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,134

Янковиц,
$(function() {
		$('.glider').sSlider({
			moveStart: function(direction ) {
				console.log( this );
				console.log( direction );
			},
		});
	});
Ответить с цитированием
  #14 (permalink)  
Старый 27.04.2020, 17:25
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,134

Янковиц,
или так
options.moveStart.call( null  , slider, direction );

или так
options.moveStart.call( slider , slider, direction );

для moveStart: function( slider, direction )
Ответить с цитированием
  #15 (permalink)  
Старый 27.04.2020, 17:29
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,134

Янковиц,
Метод call
func.call(context, arg1, arg2, ...) сначала идёт контекст (this), а потом уже аргументы.
Ответить с цитированием
  #16 (permalink)  
Старый 27.04.2020, 17:48
Профессор
Отправить личное сообщение для Янковиц Посмотреть профиль Найти все сообщения от Янковиц
 
Регистрация: 17.11.2014
Сообщений: 403

Спасибо большое
Ответить с цитированием
  #17 (permalink)  
Старый 28.04.2020, 17:27
Профессор
Отправить личное сообщение для Янковиц Посмотреть профиль Найти все сообщения от Янковиц
 
Регистрация: 17.11.2014
Сообщений: 403

Стало необходимо запускать процессы более 1 раза на странице. Я понимаю, что нужно использовать что-то вроде этого:
return this.each(function() {
                var $this = $(this);
            });

Но совершенно не знаю, в какой момент
Ответить с цитированием
  #18 (permalink)  
Старый 28.04.2020, 17:32
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,134

Янковиц,
вместо строк 18 - 31
Ответить с цитированием
  #19 (permalink)  
Старый 28.04.2020, 17:37
Профессор
Отправить личное сообщение для Янковиц Посмотреть профиль Найти все сообщения от Янковиц
 
Регистрация: 17.11.2014
Сообщений: 403

На строку 20 ругается: index.html:20 Uncaught TypeError: this.data is not a function
Ответить с цитированием
  #20 (permalink)  
Старый 28.04.2020, 17:43
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,134

Сообщение от Янковиц
this.data is not a function
Сообщение от Янковиц
var $this = $(this);
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает if(true){}, что не так? switch001 Javascript под браузер 5 09.08.2013 10:17
Баги Opera пишем сюда devote Оффтопик 101 08.08.2013 05:56
Извините что создаю еще одну тему, но мне нужна помощь и ваше мнение megaupload Оффтопик 11 27.05.2013 12:58
Посоветуйте новику, что я делаю не так danil-n2 Общие вопросы Javascript 5 26.04.2013 21:22
http://gigalit.info - Мои контакты Маэстро Ваши сайты и скрипты 70 08.12.2011 03:12