<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>JSToolbox - все о JavaScript &#187; Events</title>
	<atom:link href="http://www.jstoolbox.com/category/events/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.jstoolbox.com</link>
	<description>Блог о программировании вообще и о JavaScript в частности, уроки, статьи, заметки, база знаний.</description>
	<lastBuildDate>Wed, 28 Jul 2010 22:33:40 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Динамическое назначение обработчиков событий в jQuery 1.3</title>
		<link>http://www.jstoolbox.com/2009/02/13/dinamicheskoe-naznachenie-obrabotchikov-sobytij-v-jquery-13/</link>
		<comments>http://www.jstoolbox.com/2009/02/13/dinamicheskoe-naznachenie-obrabotchikov-sobytij-v-jquery-13/#comments</comments>
		<pubDate>Thu, 12 Feb 2009 23:33:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[DOM]]></category>
		<category><![CDATA[Events]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[События]]></category>

		<guid isPermaLink="false">http://www.jstoolbox.com/?p=408</guid>
		<description><![CDATA[<p>В новой версии jQuery - 1.3 появилась новая, полезная функия - <strong>live()</strong>. Это аналог функции <strong>bind()</strong>, но с одной интересной особенностью. Функия способна назначать обработчики событий динамически при создании новых элементов DOM. Такая необходимость часто возникает при использовании AJAX. К примеру, выполняем запрос на сервер, а результат, получаемый в HTML добавляем на страницу. Если добавленным элементам нужно назначить обработчик событий, то приходится писать код, который делает это непосредственно после добавления.</p>]]></description>
			<content:encoded><![CDATA[<p>В новой версии jQuery &#8211; 1.3 появилась новая, полезная функия &#8211; <strong>live()</strong>. Это аналог функции <strong>bind()</strong>, но с одной интересной особенностью. Функия способна назначать обработчики событий динамически при создании новых элементов DOM. Такая необходимость часто возникает при использовании AJAX. К примеру, выполняем запрос на сервер, а результат, получаемый в HTML добавляем на страницу. Если добавленным элементам нужно назначить обработчик событий, то приходится писать код, который делает это непосредственно после добавления.</p>
<p><span id="more-408"></span></p>
<p>Рассмотрим пример. Предположим, у нас имеется ненумерованный список, для каждого из элементов которого должен быть установлен обработчик. Плюс имеется кнопка, которая создает новые элементы списка. Список выглядит следующим образом:</p>
<pre class="prettyprint">
	&lt;ul>
		&lt;li>Один&lt;/li>
		&lt;li>Два&lt;/li>
	&lt;/ul>

	&lt;button id="add">Добавить&lt;/div>
</pre>
<p>Код, который назначает обработчики:</p>
<pre class="prettyprint">
$(function(){
	$('li').click(function(){
		alert($(this).html());
	});

	$('#add').click(function(){
		$('ul').append('&lt;li>Новый элемент '+Math.ceil(Math.random()*1000)+'&lt;/li>');
	});
})
</pre>
<p>В итоге, при щелчке на элементах, которые были в списке с самого начала, будет показан <em>alert</em> с текстом элемента списка. Но новые элементы на щелчок реагировать не будут, так как созданы они уже после назначения обработчиков <a href="/demo/jqlive/before.php">(Смотреть пример)</a>.</p>
<p>Исправляем это следующим образом:</p>
<pre class="prettyprint">
$(function(){
	$('li').click(function(){
		alert($(this).html());
	});

	$('#add').click(function(){
		$('ul').append('&lt;li>Новый элемент '+Math.ceil(Math.random()*1000)+'&lt;/li>');

		$('ul li:last').click(function(){
			alert($(this).html());
		});
	});
})
</pre>
<p>Теперь каждый раз при создании нового элемента, ему будет назначаться обработчик. Одноко, при использовании новой функции <strong>live()</strong>, это можно сделать немного проще и компактнее:</p>
<pre class="prettyprint">
$(function(){
	$('li').live('click', function(){
		alert($(this).html());
	});

	$('#add').click(function(){
		$('ul').append('&lt;li>Новый элемент '+Math.ceil(Math.random()*1000)+'&lt;/li>');
	});
})
</pre>
<p>Результат работы такого кода точно такой же, как в предыдущем варианте, но код получился гораздо понятнее и короче <a href="/demo/jqlive/after.php">(Смотреть пример)</a>. Применив для назначения обработчика <strong>live()</strong>, я тем самым указал, что он должен быть назначен всем элементам <em>&lt;li&gt;</em> как статическим, так и созданным динамически.</p>
<p>Однако при использовании этой функции стоит учитывать её ограничения:</p>
<ul>
<li>пока ещё не все события поддерживаются</li>
<li>применяться она может только по отношению к селекторам, её нельзя использовать с элементами</li>
</ul>
<p>Помимо <strong>live()</strong>, существует и противоположная по назначению функция &#8211; <strong>die()</strong>. Она предназначена для удаления обработчика, назначенного функцией <strong>live()</strong>.</p>
<p>Более подробную информацию можно найти <a href="http://docs.jquery.com/Events/live#typefn" title="jQuery документация - фукнция live">здесь</a>.</p>
<div class="postLinks"><strong>Спонсор статьи:</strong>Продвижение сайтов, поисковая оптимизация, <a href="http://inweb.od.ua/services/seo/">раскрутка сайта одесса</a><br/><a href="http://toptea.ru/">Продажа чая</a><br/>Интернет-магазин мягких игрушек, <a href="http://darling-toy.ru/pages.php?page=Aurora">мягкие игрушки большие</a></div>
]]></content:encoded>
			<wfw:commentRss>http://www.jstoolbox.com/2009/02/13/dinamicheskoe-naznachenie-obrabotchikov-sobytij-v-jquery-13/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mootools для начинающих &#8211; работа с элементами и событиями</title>
		<link>http://www.jstoolbox.com/2008/04/18/mootools-dlya-nachinayushhix-rabota-s-elementami-i-sobytiyami/</link>
		<comments>http://www.jstoolbox.com/2008/04/18/mootools-dlya-nachinayushhix-rabota-s-elementami-i-sobytiyami/#comments</comments>
		<pubDate>Thu, 17 Apr 2008 23:11:46 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[DOM]]></category>
		<category><![CDATA[Events]]></category>
		<category><![CDATA[MooTools]]></category>

		<guid isPermaLink="false">http://www.jstoolbox.com/2008/04/18/mootools-dlya-nachinayushhix-rabota-s-elementami-i-sobytiyami/</guid>
		<description><![CDATA[Этот туториал предназначен для тех, кто делает первые шаги в изучении библиотеки Mootools. Здесь я рассмотрю две основные задачи, без которых практически не обходится ни один скрипт &#8211; это получение ссылок на элементы документа и добавление обработчиков событий к ним.

Получение ссылок на элементы
Для того, чтобы каким либо образом работать с элементами на странице, нужно получить [...]]]></description>
			<content:encoded><![CDATA[<p>Этот туториал предназначен для тех, кто делает первые шаги в изучении библиотеки <a href="http://mootools.net">Mootools</a>. Здесь я рассмотрю две основные задачи, без которых практически не обходится ни один скрипт &#8211; это получение ссылок на элементы документа и добавление обработчиков событий к ним.</p>
<p><span id="more-103"></span></p>
<h4>Получение ссылок на элементы</h4>
<p>Для того, чтобы каким либо образом работать с элементами на странице, нужно получить на них ссылку. Для этого в Mootools существуют две основные функции &#8211; <strong>$()</strong> и <strong>$$()</strong>, при помощи которых можно получать элементы по id, классу, тегу или css селектору. Функция <strong>$()</strong> является аналогом стандартной <strong>document.getElementById()</strong> и предназначена для получения элементов по их ID. При помощи второй функции &#8211; <strong>$$()</strong> можно получить ссылки на несколько объектов сразу, передав ей в качестве аргумента один или несколько CSS селекторов. Следующий пример показывает получение ссылок на все элементы с классом <strong>someClass</strong> и все изображения (тег <strong>&lt;img&gt;</strong>), а также получение элемента по ID:</p>
<pre class="prettyprint">
// получение элемента по ID
var elem = $('myElement');

// получение элементов по классу
var elems = $$('.someClass');

// получение элементов по тегу
var elems = $$('img');
</pre>
<p>Функция <strong>$$()</strong> всегда возвращает массив элементов, следовательно к элементам этого массива можно обращаться при помощи индекса, например так: <strong>$$(&#8217;li&#8217;)[2]</strong>. В следующем примере, мы задаем для этой функции сразу три селектора. В результате функция вернет все ссылки, элемент с id=&#8221;menu&#8221; и элементы списка с классом &#8220;alt&#8221;:</p>
<pre class="prettyprint">
var aElem = $$('a', '#menu', 'li.alt');
</pre>
<p>Обе вышеперечисленные функции производят поиск по всему документу. Однако, если нам нужно выбрать некоторые элементы внутри другого элемента, то нужно воспользоваться функциями <strong>$E()</strong> или <strong>$ES()</strong>, которые могут принимать второй аргумент &#8211; фильтр. Разница между ними лишь в том, что <strong>$E()</strong> возвращает один элемент, а <strong>$ES()</strong> &#8211; все, соответствующие селектору внутри указанного элемента:</p>
<pre class="prettyprint">
// возвращает первую ссылку внутри элемента DOM с id = 'myElement'
$E('a', 'myElement');

// получение всех ссылок внутри $('myElement')
$ES('a','myElement');
</pre>
<p><br/></p>
<h4>Создание и добавление элементов в DOM.</h4>
<p>Новые элементы создаются при помощи класса <strong>Element</strong>:</p>
<pre class="prettyprint">
var myImg = new Element ( 'img' , { 'src' : 'aa.jpg', 'alt': 'Мое фото' }) ;
</pre>
<p>Первый аргумент это имя тега, а второй это список аргументов в виде объекта. В этом примере мы создали новый элемент <strong>&lt;img&gt;</strong>, с двумя атрибутами &#8211; <strong>src</strong> и <strong>alt</strong>. Помимо прочего, во второй аргумент можно передавать специальные атрибуты <strong>styles</strong> и <strong>events</strong>, для установки стилей и обработчиков событий для создаваемого элемента:</p>
<pre class="prettyprint">
new Element('a', {
	'styles': {
		'display': 'block',
		'border': '1px solid black'
	},
	'events': {
		'click': function(){
			//aaa
		},
		'mousedown': function(){
			//aaa
		}
	},
	'class': 'myClassSuperClass',
	'href': 'http://mad4milk.net'
});
</pre>
<p>Теперь, чтобы добавить созданный элемент в документ, можно воспользоваться одной из следующих функций:</p>
<ul>
<li><strong>injectBefore(element);</strong> &#8211; вставляет новый элемент перед элементом <strong>element</strong>.</li>
<li><strong>injectAfter(element);</strong> &#8211; вставляет новый элемент после элемента <strong>element</strong>.</li>
<li><strong>injectInside(element);</strong> &#8211; добавляет новый элемент в элемент <strong>element</strong>. Новый элемент будет последним в списке дочерних (эта функция аналог стандартной <strong>appendChild</strong>).</li>
<li><strong>injectTop(element);</strong> &#8211; добавляет новый элемент в элемент <strong>element</strong>. Новый элемент будет первым в списке дочерних.</li>
</ul>
<p>В качестве примера, покажу создание элемента и добавление в документ с использованием <strong>injectBefore()</strong>, остальные функции работают похожим образом:
</p>
<pre class="prettyprint">
// создаем элемент
var myImg = new Element ( 'img' , { 'src' : 'aa.jpg', 'alt': 'Мое фото' }) ;

// добавляем его в документ перед элементом с id="main"
myImg.injectBefore($('main'));
</pre>
<p>В этом примере сначала создается изображение с двумя атрибутами &#8211; <strong>src</strong> и <strong>alt</strong>, а затем оно добавляется перед элементом с id=&#8221;main&#8221;.</p>
<h4>Добавление обработчиков событий</h4>
<p>В Mootools, обработчики событий, или вернее сказать &#8220;слушатели&#8221; (listeners), добавляются к элементам при помощи функции <strong>addEvent()</strong>, которая имеет следующий синтаксис:</p>
<pre class="prettyprint">
element.addEvent(event, function);
</pre>
<p>Здесь <strong>element</strong> &#8211; элемент DOM, к которому нужно добавить обработчик, <strong>event</strong> &#8211; тип события без приставки &#8216;on&#8217; (&#8217;click&#8217;, &#8216;load&#8217;), <strong>function</strong> &#8211; функция или указатель на функцию, которая должна выполняться при возникновении события. Пример:</p>
<pre class="prettyprint">
$('myElement').addEvent('click', function() {alert('test');} );

// fTest - указатель на функцию
$('myElement').addEvent('click', fTest);

function fTest () {
	alert('test');
}
</pre>
<p>Поскольку <strong>addEvent</strong> использует слушатели событий, то к элементам можно добавлять одновременно несколько функций обработчиков. Особое внимание стоит уделить событию <strong>onload</strong>. Оно возникает при полной загрузке страницы, включая все изображения и флэшки. Это значит, что прежде, чем функция обработчик выполнится, пользователю прийдется ждать пока загрузится все изображения, хотя структура DOM уже полностью готова к работе, и если на сайте большое количество различной графики, то ожидание может затянуться надолго. Для исправления этой ситуации, в <strong>Mootools</strong> существует событие <strong>domready</strong>, которое вызывается сразу же после загрузки структуры документа:</p>
<pre class="prettyprint">
window.addEvent('domready', function(){ ... });
</pre>
<p><br/><br/></p>
<h4>Пример</h4>
<p>В качестве примера создадим простой HTML документ с меню, выполненным в виде маркированного списка. Затем, получив ссылки на элементы меню, добавим к ним простой обработчик. Структура меню выглядит следующим образом:</p>
<pre class="prettyprint">
&lt;div id="accordion">
	&lt;h3 class="toggler menusection">Меню&lt;/h3>
	&lt;div class="element menusection">
		&lt;ul>
			&lt;li>Link 1&lt;/li>
			&lt;li>Link 2&lt;/li>
			&lt;li>Link 3&lt;/li>
			&lt;li>Link 4&lt;/li>
		&lt;/ul>
	&lt;/div>
&lt;/div>
</pre>
<p>Код JavaScript:</p>
<pre class="prettyprint">
window.addEvent('domready', function(){
	$ES('li','accordion').addEvent('click', newItem);
});

function newItem() {
	var el = new Element('li', {
			'events' : {'click' : newItem}
	});
	el.setHTML('Link');
	el.injectInside($E('ul','accordion'));
}
</pre>
<p>Вначале, мы добавляем обработчик к событию <strong>domready</strong> объекта <strong>window</strong>. Этот обработчик получает все элементы <strong>&lt;li&gt;</strong> внутри элемента с id=accordion и в свою очередь добавляет обработчик <strong>newItem</strong> к событию <strong>onclick</strong>. В результате, при щелчке на любом элементе маркированного списка, будет вызываться функция <strong>newItem()</strong>, которая создает новый элемент <strong>&lt;li&gt;</strong> и добавляет его в этот же список.</p>
<p><a href="/demo/mooIntro/index.html" class="demo">смотреть демо</a><a style="margin-left:18px" href="/download/mooIntro.zip" class="download">скачать</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.jstoolbox.com/2008/04/18/mootools-dlya-nachinayushhix-rabota-s-elementami-i-sobytiyami/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Кроссбраузерная работа с событиями.</title>
		<link>http://www.jstoolbox.com/2008/01/25/krossbrauzernaya-rabota-s-sobytiyami/</link>
		<comments>http://www.jstoolbox.com/2008/01/25/krossbrauzernaya-rabota-s-sobytiyami/#comments</comments>
		<pubDate>Thu, 24 Jan 2008 22:55:26 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Events]]></category>

		<guid isPermaLink="false">http://www.jstoolbox.com/2008/01/25/krossbrauzernaya-rabota-s-sobytiyami/</guid>
		<description><![CDATA[О проблемах несовместимости браузеров, я думаю, известно каждому. В данной статье я рассмотрю проблемы несовместимости браузеров и их решения при работе с событиями в JavaScript.

В DOM 1 был определён всего лишь один метод работы с событиями &#8211; это обработчики событий. Подключение функции обработчика было простым делом &#8211; ссылка на функцию или анонимная функция присваивалась соответствующему [...]]]></description>
			<content:encoded><![CDATA[<p>О проблемах несовместимости браузеров, я думаю, известно каждому. В данной статье я рассмотрю проблемы несовместимости браузеров и их решения при работе с событиями в JavaScript.</p>
<p><span id="more-10"></span></p>
<p>В DOM 1 был определён всего лишь один метод работы с событиями &#8211; это обработчики событий. Подключение функции обработчика было простым делом &#8211; ссылка на функцию или анонимная функция присваивалась соответствующему свойству элемента с префиксом &#8220;on&#8221;. Т.е. событие щелчка мыши &#8211; onclick, событие отправки формы &#8211; onsubmit и т.д. Которкий пример:</p>
<pre class="prettyprint">// присваивание анонимной функции
element.onclick = function(){
	alert("Это событие onclick");
}

// присваивание ссылки на функцию
element.onmouseover = hoverMe;

// присваивание в виде тэга элемента
&lt;div onclick="myfunction()">&lt;/div>
</pre>
<p>При таком методе работы с событиями есть большой недостаток &#8211; каждому элементу можно добавлять только один обработчик событий. Поэтому в DOM 2 был добавлен новый метод работы с событиями &#8211; это event listeners или &quot;слушатели событий&quot; (в различных источниках этот термин переводится по разному, либо перехватчик событий либо приемник событий, но на мой взгляд перевод &#8220;слушатель&#8221; более точен). Вот здесь то и начинаются проблемы с совместимостью, и как всегда главным возмутителем спокойствия оказался Internet Explorer, всегда делающий все по своему. Разберемся немного в том, что представляет собой слушатель событий и как он реализован на разных браузерах.</p>
<p>Стандартами DOM level 2 для установки слушателя событий определена функция <strong>addEventListener()</strong>, для удаления &#8211; <strong>removeEventListener()</strong>. В IE, то же самое выполняют функции <strong>attachEvent()</strong> и <strong>detachEvent()</strong>. Здесь напрашивается самый простой метод преодоления этих различий &#8211; определять наличие функций и вызывать соответствующую функцию. В случае, если ни addEventListener ни attachEvent не доступны, применяем простые обработчики событий. Ниже приведен код для этого метода:</p>
<pre class="prettyprint">// добавление и удаление функций-слушателей
// obj - элемент
// type - тип события без префикса "on", т.е. "click", "submit"
// fn - ссылка на функцию, или анонимная функция

// добавление
function addEvent(obj, type, fn){
	if (obj.addEventListener){
		obj.addEventListener( type, fn, false );
	} else if(obj.attachEvent) {
		obj.attachEvent( "on"+type, fn );
	} else {
		obj["on"+type] = fn;
	}
}

// удаление
function removeEvent(obj, type, fn){
	if (obj.removeEventListener) {
		obj.removeEventListener( type, fn, false );
	} else if (obj.detachEvent){
		obj.detachEvent( "on"+type, obj[type+fn] );
	} else {
		obj["on"+type] = null;
	}
}

// **********************
// Пример применения функций

function clickHandler(){
	// первая функция слушатель
	alert("Событие click");
	var oTarget = document.getElementById("testDiv");
	removeEvent(oTarget, "click", clickHandler);
}

function mouseoverHandler(){
	alert("Событие mouseover");
	var oTarget = document.getElementById("testDiv");
	removeEvent(oTarget, "mouseover", mouseoverHandler);
}

// добавляем эти две функции как слушатели к одному элементу DOM
var elem = document.getElemntById("testDiv");

addEvent(elem, "click", clickHandler);
addEvent(elem, "mouseover", mouseoverHandler);</pre>
<p>В данном примере назначаются 2 функции слушателя для одного элемента c id=testDiv. Функции слушатели в этом случае выполняются только один раз, поскольку сразу же удаляются функцией removeEvent прямо в теле функций.</p>
<p>Эти функции позволяют унифицировать работу с назначением слушателей на разных браузерах. Но тут есть небольшой нюанс &#8211; все броузеры за исключением Internet Explorer правильно устанавливают указатель <strong>this</strong> в теле функции слушателя, в то время как <strong>this</strong> в IE указывает на абсолютно бесполезный здесь объект <strong>window</strong>. Но и это также поправимо. Джон Ресиг (John Resig) в своей <a href="http://ejohn.org/projects/flexible-javascript-events/">статье</a> описал замечательный кроссбраузерный метод работы с событиями, который я привожу здесь:</p>
<pre class="prettyprint">
function addEvent(obj, type, fn){
	if (obj.addEventListener){
		obj.addEventListener( type, fn, false );
	} else {
		obj["e"+type+fn] = fn;
		obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
		obj.attachEvent( "on"+type, obj[type+fn] );
	}
}

function removeEvent(obj, type, fn){
	if (obj.removeEventListener){
		obj.removeEventListener( type, fn, false );
	} else {
		obj.detachEvent( "on"+type, obj[type+fn] );
		obj[type+fn] = null;
		obj["e"+type+fn] = null;
	}
}
</pre>
<p>Описание ключевых моментов:<br/></p>
<pre class="prettyprint">obj["e"+type+fn] = fn;</pre>
<p>Это присваивание делает функцию дочерним объектом указанного элемента, следовательно указатель <strong>this</strong> в этой функции указывает на необходимый нам элемент. Генерируемый ключ, помещаемый в хэш является уникальным, что предотвращает коллизии с другими функциями.</p>
<pre class="prettyprint">obj[type+fn] = function(){ obj["e"+type+fn]( window.event ); }</pre>
<p>Эта строка создаёт анонимную функцию, которая, при выполнении вызывает предыдущую, передавая при этом глобальный объект <strong>event</strong>. Эта функция присваивается свойству type+fn объект, чтобы можно было впоследствии её удалить. Таким образом, мы имеем две универсальные функции для работы со слушателями событий.</p>
<p>Разобравшись с обработчиками и функциями слушателями, рассмотрим объект <strong>event</strong>. Реализация этого объекта различается в IE и DOM-совместимых браузерах. Например, такие свойства объекта <strong>event</strong>, как target и relatedTarget заменены в IE свойствами srcElement и fromElement, а методы <strong>preventDefault()</strong> и <strong>stopPropagation()</strong> реализуются при помощи свойств <strong>returnValue</strong> и <strong>cancelBubbling</strong>. Свойства и методы Internet Explorer можно привести в соответствие с DOM при помощи следующей функции (решает проблему только на IE в Windows):</p>
<pre class="prettyprint">// Форматирование события для соответствия параметров в IE и других броузерах
// определение IE
var sUserAgent = navigator.userAgent;
var isIE = sUserAgent.indexOf("compatible") > -1 &#038;&#038; sUserAgent.indexOf("MSIE") > -1 &#038;&#038; sUserAgent.indexOf("Opera") == -1;
var isWin = (navigator.platform == "Win32") || (navigator.paltform == "Windows");

function formatEvent(oEvent){
	if(isIE &#038;&#038; isWin){
		oEvent.charCode=(oEvent.type=='keypress')?oEvent.keyCode:0;
		oEvent.eventPhase=2;
		oEvent.isChar=(oEvent.charCode>0);
		oEvent.pageX=oEvent.clientX+document.body.scrollLeft;
		oEvent.pageY=oEvent.clientY+document.body.scrollTop;
		oEvent.preventDefault=function(){
			this.returnValue=false;
		}
		if(oEvent.type=='mouseout')
			oEvent.relatedTarget=oEvent.toElement;
		else if(oEvent.type=='mouseover')
			oEvent.relatedTarget=oEvent.fromElement;
		oEvent.stopPropagation=function(){
			this.cancelBubble=true;
		}
		oEvent.target=oEvent.srcElement;
		oEvent.time=(new Date).getTime();
	}
	return oEvent;
}</pre>
<p>Теперь лучше всего объединить все вышеназванные методики в один объект, который будет работать с событиями. Вот что у меня получилось:</p>
<pre class="prettyprint">
// определение IE
var sUserAgent = navigator.userAgent;
var isIE = sUserAgent.indexOf("compatible") > -1 &#038;&#038; sUserAgent.indexOf("MSIE") > -1 &#038;&#038; sUserAgent.indexOf("Opera") == -1;
var isWin = (navigator.platform == "Win32") || (navigator.paltform == "Windows");

var Event = {
	// добавление слушателя
	add:function(obj,type,fn){
		if (obj.addEventListener){
			obj.addEventListener( type, fn, false );
		} else if (obj.attachEvent){
			obj["e"+type+fn] = fn;
			obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
			obj.attachEvent( "on"+type, obj[type+fn] );
		} else {
			obj["on"+type] = fn;
		}
	},

	// удаление слушателя
	remove:function(obj, type, fn){
		if (obj.removeEventListener){
			obj.removeEventListener( type, fn, false );
		} else if (obj.detachEvent){
			obj.detachEvent( "on"+type, obj[type+fn] );
			obj[type+fn] = null;
			obj["e"+type+fn] = null;
		} else {
			obj["on"+type] = null;
		}
	},

	// форматирование события для соответствия параметров в IE и других броузерах
	format:function(oEvent){
		if(isIE &#038;&#038; isWin){
			oEvent.charCode=(oEvent.type=="keypress")?oEvent.keyCode:0;
			oEvent.eventPhase=2;
			oEvent.isChar=(oEvent.charCode>0);
			oEvent.pageX=oEvent.clientX+document.body.scrollLeft;
			oEvent.pageY=oEvent.clientY+document.body.scrollTop;
			oEvent.preventDefault=function(){
				this.returnValue=false;
			}
			if(oEvent.type=="mouseout")
				oEvent.relatedTarget=oEvent.toElement;
			else if(oEvent.type=="mouseover")
				oEvent.relatedTarget=oEvent.fromElement;
			oEvent.stopPropagation=function(){
				this.cancelBubble=true;
			}
			oEvent.target=oEvent.srcElement;
			oEvent.time=(new Date).getTime();
		}
		return oEvent;
	}
}

// ******************
// Пример использования
function handler(oEvent){
	var e = Event.format(oEvent || window.event);

	alert(e.target.id);
	e.stopPropagation();
}

// подключение функции-слушателя handler к элементу targetDiv
function attachEvent(){
	Event.add(document.getElementById("targetDiv"), "click", handler );
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.jstoolbox.com/2008/01/25/krossbrauzernaya-rabota-s-sobytiyami/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
