Преобразование собственного объекта события браузера в объект события jQuery - PullRequest
24 голосов
/ 01 марта 2012

Я назначаю функцию обработчика событий элементу через свойство onclick собственного браузера:

document.getElementById('elmtid').onclick = function(event) { anotherFunction(event) };

Когда я нахожусь в anotherFunction(event), я хочу иметь возможность использовать объект события, как я, с объектом события, который вы получаете в jQuery с помощью метода .on(). Я хочу сделать это, потому что у объекта события jQuery есть свойства и методы, такие как .pageX, .pageY и .stopPropagation(), которые работают во всех браузерах.

Итак, мой вопрос: после того, как я передал объект события собственного браузера в anotherFunction(), как я могу превратить его в событие jQuery? Я пытался $(event), но это не сработало.

Очевидный вопрос здесь: почему бы вам просто не использовать jQuery .on, .bind, .click и т. Д. Для назначения функций обработки событий? Ответ: я создаю страницу с огромной таблицей, на которой много кликабельных вещей. К сожалению, этот проект требует, чтобы страница ДОЛЖНА отображаться быстро в IE6 и IE7. Использование .on и др. В IE6 и IE7 создает утечки DOM и очень быстро потребляет память (проверьте себя с помощью Drip: http://outofhanwell.com/ieleak/index.php?title=Main_Page). Настройка поведения при нажатии с помощью .onclick - единственная опция, которую мне нужно быстро отрендерить в IE6 и IE7.

Ответы [ 3 ]

15 голосов
/ 01 марта 2012

Слишком долго для комментария ... Поскольку документация немного расплывчата по этому вопросу ... (я смотрю на 1.7.1 в следующем)

jQuery.Event(event, props):

  • создает новый объект
  • устанавливает его свойство type для свойства type события.
  • устанавливает isDefaultPrevented посредством нормализованных вызовов для всех способов проверить, установлен ли по умолчанию
  • устанавливает originalEvent для ссылки на событие, которое вы передали.
  • добавляет произвольный набор свойств, предоставленных аргументом props объекта.
  • устанавливаетотметка времени.
  • помечает объект как «фиксированный».

В основном вы получаете новый объект с несколькими дополнительными свойствами и ссылкой на исходное событие - без нормализации, кроме isDefaultPrevented.

jQuery.event.fix(event):

  • игнорирует объекты, которые уже были помечены как "исправленные".
  • делает доступную для записи копию (в виде jQuery.Event())и нормализует упомянутые свойства здесь .

ETA:

На самом деле, выглядит сПроигравший с кодом, jQuery.event.fix() должен работать - так, как описано @ Beetroot-Beetroot.Это все, что делает jQuery для создания объекта события jQuery в диспетчере событий.

10 голосов
/ 01 марта 2012

Вы хотите jQuery.event.fix.

new jQuery.Event(nativeEvent)

Обратите внимание, что на данный момент у события нет никаких "событийных" свойств, просто originalEvent, timeStamp и функции пузырьков / предотвращения по умолчанию.

jQuery.event.fix(nativeEvent)

6 голосов
/ 01 марта 2012

Попробуйте:

document.getElementById('elmtid').onclick = anotherFunction;

с:

function anotherFunction(evt){
    evt = $.event.fix(evt || window.event);//Note need for cross-browser reference to the native event
    ...
}

http://jsfiddle.net/Wrzpb/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...