Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   отмена выполнения обработчика... (https://javascript.ru/forum/events/40690-otmena-vypolneniya-obrabotchika.html)

Arramis 15.08.2013 18:15

отмена выполнения обработчика...
 
приветствую всех...
вопрос такой: как остановить выполнение обработчика события из другого обработчика этого же события ??
конкретно в моем случае - я пишу плеер и нужно чтобы при клике на 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;
		}		
	}
}

но по такой логике второй обработчик начинает выполняться только после того, как первый закончит свое выполнение, как сделать чтобы второй обработчик останавливал (прерывал) первый во время его выполнения второго и наоборот?

danik.js 15.08.2013 19:29

Цитата:

Сообщение от Arramis
вопрос такой: как остановить выполнение обработчика события из другого обработчика этого же события ??

event.stopImmediatePropagation() остановит дальнейшую обработку события.

Arramis 15.08.2013 19:48

danik.js,
но что писать вместо event ? название события ? (onclick, onmouseover,...) или ссылку на объект которая в обработчике первым параметром ?

danik.js 15.08.2013 20:18

Цитата:

Сообщение от Arramis
но что писать вместо event ? название события ? (onclick, onmouseover,...) или ссылку на объект которая в обработчике первым параметром ?

Ссылку на объект класса Event, передаваемый первым аргументом в обработчик события.

Arramis 16.08.2013 11:37

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); // вешаем обработчик


Часовой пояс GMT +3, время: 16:00.