Конспект JS-course

Устранение IE-несовместимостей: "fixEvent"

Источник: http://learn.javascript.ru/fixevent

Если собрать все несовместимости для событий, свойственные IE, которые описаны в этой главе — их устранение можно описать единой функцией fixEvent.

Эта функция работает так:

elem.onclick = function(e) {
  e = fixEvent(e); // в начале обработчика
  ...
}

Объект события, при необходимости, будет взят из window.event.

Функция fixEvent добавляет объекту события в IE следующие стандартные свойства:

  • target
  • relatedTarget
  • pageX/pageY
  • which

Можно также передать this вторым аргументом, и он будет записан в currentTarget:

elem.onclick = function(e) {
  e = fixEvent(e, this);
  alert(e.currentTarget == this); // true, как и должно быть по стандарту
  ...
}

Код функции:

function fixEvent(e, _this) {
  e = e || window.event;

  if (!e.currentTarget) e.currentTarget = _this;
  if (!e.target) e.target = e.srcElement;

  if (!e.relatedTarget) {
    if (e.type == 'mouseover') e.relatedTarget = e.fromElement;
    if (e.type == 'mouseout') e.relatedTarget = e.toElement;
  }

  if (e.pageX == null && e.clientX != null ) {
    var html = document.documentElement;
    var body = document.body;

    e.pageX = e.clientX + (html.scrollLeft || body && body.scrollLeft || 0);
    e.pageX -= html.clientLeft || 0;

    e.pageY = e.clientY + (html.scrollTop || body && body.scrollTop || 0);
    e.pageY -= html.clientTop || 0;
  }

  if (!e.which && e.button) {
    e.which = e.button & 1 ? 1 : ( e.button & 2 ? 3 : (e.button & 4 ? 2 : 0) );
  }

  return e;
}