Показать сообщение отдельно
  #3 (permalink)  
Старый 08.10.2012, 16:07
at- at- вне форума
Новичок на форуме
Отправить личное сообщение для at- Посмотреть профиль Найти все сообщения от at-
 
Регистрация: 07.10.2012
Сообщений: 5

Сообщение от devote Посмотреть сообщение
читайте об addEventListener и attachEvent
Спасибо за наводку, по собственной дурости посчитал, что подобный функционал в фреймворках реализован.

Но возник вопрос по логике работы removeEventListener/deatachEvent.
Для добавления\удаления обработчиков использую две функции из админки django (core.js):
function addEvent(obj, evType, fn)
{
    if (obj.addEventListener)
		obj.addEventListener(evType, fn, false);
    else if (obj.attachEvent)
		var r = obj.attachEvent('on' + evType, fn);
}

function removeEvent(obj, evType, fn)
{
    if (obj.removeEventListener)
        obj.removeEventListener(evType, fn, false);
    else if (obj.detachEvent)
        obj.detachEvent('on' + evType, fn);
}


В описании к removeEventListener говорится, что для отписки от события нужно передать сам обработчик

Цитата:
element.removeEventListener(type, listener, useCapture)
Parameters
listener
The listener parameter indicates the EventListener function to be removed.
Для тестов в document.onclick ввожу 3 события

// Вызывается при onload
function init() {
	addEvent(document, 'click', function(){console.log('init');});
}

function closeCalendar(calendar) {
        ...
       // вместо функции отдаю null/ function(){}
	removeEvent(document, 'click', null);
	calendar.parentNode.removeChild(calendar);
}


function openCalendar(clr) {
	if (!clr || !clr.id) return;
	var id = clr.id.split('_').slice(2).join('_');

	var f = function(e)
	{
		var targ = getTarget(e);
		if (targ != document.getElementById('open_calendar_' + id))
			closeCalendar('calendar_' + id);
	};

	addEvent(document, 'click', function(){console.log('opencalendar0');});
	addEvent(document, 'click', f);
	addEvent(document, 'click', function(){console.log('opencalendar1');});


В конечном итоге в лог попадают все сообщения init/opencalendarN, а удаляется событие для закрытия календаря, которое явно не указано. Пробовал в опере, фф и хроме - везде календарь открывается и закрывается правильно, а в лог падают три сообщения. Почему на удаление попадает именно var f = function(e)?
Ответить с цитированием