Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.08.2013, 18:15
Аватар для Arramis
Кандидат Javascript-наук
Отправить личное сообщение для Arramis Посмотреть профиль Найти все сообщения от Arramis
 
Регистрация: 22.07.2013
Сообщений: 104

отмена выполнения обработчика...
приветствую всех...
вопрос такой: как остановить выполнение обработчика события из другого обработчика этого же события ??
конкретно в моем случае - я пишу плеер и нужно чтобы при клике на play устанавливался второй обработчик на ту же кнопку который будет останавлить проигрывание первого обработчика (тоесть обработчика который проигрывает), и наоборот (удалялся второй обработчик и ставился первый обратно чтобы снова начать проигрывание)
привожу пример :
var play = function() {
	doSomething();
	removeHandler(buttonPlay, "click", pause);
}

var pause = function() {
	doAnotherthing();
	removeHandler(buttonPlay, "click", play);
}

addHandler(buttonPlay, "click", play);
addHandler(buttonPlay, "click", pause);

function addHandler(element, event_name, handler) {
	try {
		element.addEventListener(event_name, handler, false);
	}catch(e) {
		element.attachEvent("on" + event_name, handler);
	}
}

function removeHandler(element, event_name, handler) {
	try {
		element.removeEventListener(event_name, handler, false);
	} catch(e) {
		try {
			element.detachEvent("on" + event_name, handler);
		} catch(ee) {
			element["on" + event_name] = null;
		}		
	}
}

но по такой логике второй обработчик начинает выполняться только после того, как первый закончит свое выполнение, как сделать чтобы второй обработчик останавливал (прерывал) первый во время его выполнения второго и наоборот?
Ответить с цитированием
  #2 (permalink)  
Старый 15.08.2013, 19:29
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от Arramis
вопрос такой: как остановить выполнение обработчика события из другого обработчика этого же события ??
event.stopImmediatePropagation() остановит дальнейшую обработку события.
Ответить с цитированием
  #3 (permalink)  
Старый 15.08.2013, 19:48
Аватар для Arramis
Кандидат Javascript-наук
Отправить личное сообщение для Arramis Посмотреть профиль Найти все сообщения от Arramis
 
Регистрация: 22.07.2013
Сообщений: 104

danik.js,
но что писать вместо event ? название события ? (onclick, onmouseover,...) или ссылку на объект которая в обработчике первым параметром ?
Ответить с цитированием
  #4 (permalink)  
Старый 15.08.2013, 20:18
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от Arramis
но что писать вместо event ? название события ? (onclick, onmouseover,...) или ссылку на объект которая в обработчике первым параметром ?
Ссылку на объект класса Event, передаваемый первым аргументом в обработчик события.
Ответить с цитированием
  #5 (permalink)  
Старый 16.08.2013, 11:37
Аватар для Arramis
Кандидат Javascript-наук
Отправить личное сообщение для Arramis Посмотреть профиль Найти все сообщения от Arramis
 
Регистрация: 22.07.2013
Сообщений: 104

danik.js,
этот e.stopImmediatePropagation() в моем случае не помог вообще (((
он работает только в IE и OPERA, и останавливает только тогда когда обработчик закончит выполняться - например если в обработчике вызывается функция которая работает рекурсивно, то этот e.stopImmediatePropagation() ждет пока закончится рекурсия, мне нужно чтобы рекурсия прерывалась на клике на ту же кнопку что и запуска обработчика (в котором запускается эта рекурсивно работающая функция) - мой случай -
function runCycle(callback, timer) {
	if (index < pics.length) {
		buttonPlay.src = "buttons/button_pause.png";
		var id = setTimeout (function() {		
							callback();	
							runCycle(callback, timer);
							}, timer);
	}
	else buttonPlay.src = "buttons/button_play.png";
}

var runAll = function(e) { 		// это главный обработчик
     runCycle(playNext, 1000); 	// это рекурсивно выполняющаяся функция выполняющая все действия						
} 

addHandler(buttonPlay, "click", runAll); // вешаем обработчик
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отмена выполнения ф-ии hoax Элементы интерфейса 14 07.07.2013 11:58
отмена повторного выполнения события frant32 Events/DOM/Window 13 06.10.2012 12:25
Отмена действия события во время выполнения анимации gunsoy Общие вопросы Javascript 2 12.06.2012 13:27
Как правильно подавить событие при подключении своего обработчика? Маэстро Firefox/Mozilla 2 03.09.2011 11:46
[jQuery] [Обработка клика] Как не потерять текущий контекст внутри обработчика? xintrea Events/DOM/Window 1 10.02.2011 16:34