Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 03.01.2014, 19:07
Аватар для Hapson
Кандидат Javascript-наук
Отправить личное сообщение для Hapson Посмотреть профиль Найти все сообщения от Hapson
 
Регистрация: 23.07.2013
Сообщений: 122

Не работает detachEvent в IE7/8
Всем привет!
Такая проблема, почему-то не работает detachEvent в IE7/8.
Вот скрипты в порядке подключения
var EventHandler = {
	add: function(element, eventType, handler){
		if(element.addEventListener){
			element.addEventListener(eventType, handler, false);
			return handler;
		}
		var IEhandler = function(){handler.call(element);}
		element.attachEvent("on"+eventType, IEhandler);
		return IEhandler;
	},
	remove: function(element, eventType, handler){
		if(element.addEventListener){
			element.removeEventListener(eventType, handler, false); return;
		}
		element.detachEvent("on"+eventType, handler);
	}
}


Дальше
EventHandler.add(window, "load", js1func);

function js1func(){
	var div = document.getElementById("div1");
	EventHandler.add(div, 'click', viewDiv1);
}

function viewDiv1(event){
	var div = document.getElementById("div1");
	EventHandler.remove(div, 'click', viewDiv1);
	var evt = event || window.event
	var str = "<h3>THIS:</h3>";
	for(z in this){
		str += z +' => '+ this[z] +"<br />";
	}
	str += "<h3>EVENT:</h3>";
	for(z in evt){
		str += z +' => '+ evt[z] +"<br />";
	}
	div.innerHTML = str;
}


И HTML страничка
Код:
<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="content-type" content="text/html; charset=utf-8" />
	<title>Обработчик событий</title>
	<style type="text/css">
		#div1, #div2{float: left; width: 50%;}
	</style>
	<script type="text/javascript" src="eventHandler.js"></script>
	<script type="text/javascript" src="js1.js"></script>
	<!--<script type="text/javascript" src="js2.js"></script>-->
</head>
<body>
	<div id="div1">DIV 1</div>
	<div id="div2">DIV 2</div>
	<script type="text/javascript">
	
	</script>
</body>
</html>
Во всех браузерах все работает. То есть после загрузки страницы я кликаю по DIV1, в него загружается результат работы функции viewDiv1() и эта же функция снимает обработчик. То есть дальше DIV1 уже не реагирует на клики. Но вот в IE7/8 подписка на onclick не снимается, почему?
Ответить с цитированием
  #2 (permalink)  
Старый 03.01.2014, 19:59
Аватар для Hapson
Кандидат Javascript-наук
Отправить личное сообщение для Hapson Посмотреть профиль Найти все сообщения от Hapson
 
Регистрация: 23.07.2013
Сообщений: 122

Что-то я не понял...
Вроде как пишут, что attachEvent не передает this в функцию-обработчик. Собственно для этого и написал
var IEhandler = function(){handler.call(element);}

И поэтому и не срабатывал detachEvent потом.
Но когда сделал так, все заработало
var EventHandler = {
	add: function(element, eventType, handler){
		if(element.addEventListener){
			element.addEventListener(eventType, handler, false);
			return handler;
		}
		element.attachEvent("on"+eventType, handler);
		return handler;
	},
	remove: function(element, eventType, handler){
		if(element.addEventListener){
			element.removeEventListener(eventType, handler, false); return;
		}
		element.detachEvent("on"+eventType, handler);
	}
}


Причем this присутствует в функции-обработчике. Где косяк? Работает во всех IE от 6
Ответить с цитированием
  #3 (permalink)  
Старый 03.01.2014, 20:02
Аватар для Hapson
Кандидат Javascript-наук
Отправить личное сообщение для Hapson Посмотреть профиль Найти все сообщения от Hapson
 
Регистрация: 23.07.2013
Сообщений: 122

Нет... ошибся.
This есть, но ничего интересного в нем нет
Ответить с цитированием
  #4 (permalink)  
Старый 03.01.2014, 23:15
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от Hapson
Причем this присутствует в функции-обработчике
This то всегда есть )) Его просто не может не быть. А вот указывать он может на разные объекты (и если не ошибаюсь может даже быть null)
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #5 (permalink)  
Старый 03.01.2014, 23:18
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Как просто фикс - сохраняй ссылку на функцию-обертку в самой функции:
handler._wrapper = wrapper
и детачь уже handler._wrapper.

Грязный трюк конечно, но иначе только создание реестра обработчиков.
Можешь еще нагуглить костыль для добавления addEventListener в IE
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #6 (permalink)  
Старый 04.01.2014, 02:08
Аватар для Hapson
Кандидат Javascript-наук
Отправить личное сообщение для Hapson Посмотреть профиль Найти все сообщения от Hapson
 
Регистрация: 23.07.2013
Сообщений: 122

danik.js,
Спасибо!
Уже разобрался. Сейчас в этом копаюсь
http://javascript.ru/tutorial/events/crossbrowser
почти разобрался.

А проблема была именно в ссылке на функцию-обработчик. Вобщем теперь все работает.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
innerHTML для TR в InternetExplorer не работает? Непонятливый Элементы интерфейса 3 15.10.2012 17:14
JS: работает на сервере, не работает из папки -majestic- Общие вопросы Javascript 2 02.08.2012 14:41
Не работает push! Динамическая вставка TSEH25 ExtJS 5 03.07.2012 13:00
jQyery функция странно работает! Midel Общие вопросы Javascript 4 08.04.2012 13:40
помогите найти ошибку (работает в IE но не работает в Firefox) Len4ik Javascript под браузер 2 11.05.2010 15:41