Ваш вопрос немного расплывчат, но я думаю, вы спрашиваете, как jQuery реализует preventDefault
и отправляет пользовательские события. Вот что я отвечу.
Предотвращение действия и распространения по умолчанию
Я думаю, что вы имеете в виду, когда говорите об отключении событий по умолчанию, как предотвращение действия по умолчанию для стандартного события. Нет никакого способа предотвратить запуск стандартного события. Однако для большинства событий слушатели могут запретить браузеру выполнять действие по умолчанию для этого события. Действия по умолчанию - это переход по ссылкам или открытие контекстных меню. Также обработчик может остановить дальнейшее распространение события, что предотвратит вызов прослушивателей, зарегистрированных на предках элемента, на котором он зарегистрирован. Как и в большинстве случаев JavaScript, есть два способа сделать это: стандартный способ W3C и путь Microsoft.
Стандартный способ обработки событий в JavaScript определен в спецификациях W3C DOM Level 2 и, позже, DOM Level 3 Events . Вы присоединяете слушателя события к элементу с помощью метода addEventListener
. Когда событие вызывается, ваша функция слушателя будет вызвана и передана объекту события. Вы можете предотвратить действие по умолчанию, вызвав метод preventDefault
события и остановив его распространение, вызвав метод stopPropagation
.
Версии Internet Explorer до 9 не поддерживают систему событий W3C. Вы присоединяете слушателя события к элементу с помощью метода attachEvent
. Когда событие запускается, ваша функция слушателя может получить доступ к событию через объект window.event
. Вы можете предотвратить действие по умолчанию, назначив false
его свойству returnValue
и остановив распространение, назначив true
его свойству cancelBubble
.
Например, вы можете создать прослушиватель событий, который выглядит следующим образом:
function handleClick (event) {
if (event && event.stopPropagation) {
event.preventDefault();
event.stopPropagation();
} else {
event = window.event;
event.returnValue = false;
event.cancelBubble = true;
}
// the default action has been prevented and propagation has been stopped
// do something interesting here...
}
Затем вы можете зарегистрировать его на таком элементе:
var elem = document.getElementById( 'some-element' );
if (elem.addEventListener) {
elem.addEventListener( 'click', handleClick, false );
} else {
elem.attachEvent( 'onclick', handleClick );
}
jQuery обрабатывает это в своем файле event.js
. Регистрация прослушивателей событий обрабатывается частной add
функцией , которая вызывается jQuery.bind
через jQuery.on
. Остановка распространения и предотвращение по умолчанию обрабатываются соответствующими методами jQuery.Event
класса .
Создание пользовательских событий
Существует два способа создания пользовательских событий в JavaScript. Можно попросить браузер запустить пользовательское событие для элемента в системах W3C и Microsoft . Это работает, но обычно это излишне. Намного проще создать объект, который отслеживает список функций слушателя и предоставляет методы для добавления и удаления слушателей и диспетчеризации событий. Вот простой:
var EventSource = function() {}
EventSource.prototype = {
attach: function (name, callback) {
if (!this.listeners) this.listeners = {};
if (!this.listeners[ name ]) this.listeners[ name ] = [];
this.listeners[ name ].push( callback );
},
detach: function (name, callback) {
if (!this.listeners || !this.listeners[ name ]) return;
var listeners = this.listeners[ name ];
for (var idx = 0; idx < listeners.length; idx++) {
if (listeners[ idx ] === callback) {
listeners.splice( idx, 1 );
break;
}
}
},
dispatch: function (name, event) {
if (typeof event === 'undefined') event = {};
event.event = name;
if (!this.listeners || !this.listeners[ name ]) return false;
var listeners = this.listeners[ name ];
for (var idx = 0; idx < listeners.length; idx++) {
try {
listeners[ idx ]( event );
} catch (caught) {
// ignore it and keep calling the rest of the listeners
}
});
return true;
}
};
Это более или менее то, что делает jQuery, хотя, конечно, их гораздо сложнее.