Исправить нативные события Javascript - PullRequest
0 голосов
/ 30 ноября 2011

Мне интересно, есть ли какой-нибудь устоявшийся способ исправить несоответствия браузера с событиями DOM.Как лучше всего исправить события?

Ниже приведено то, с чем я сейчас играю (хотя все еще не работает).

Event.prototype.fix = function()
{
    //if ( ! event) var event = window.event;

    // Fix target property, if necessary (IE 6/7/8 & Safari2)
    if ( ! this.target)
    {
        this.target = this.srcElement || document;
    }

    // Target should not be a text node (Safari)
    if (this.target.nodeType === 3)
    {
        this.target = event.target.parentNode;
    }

    // Add which for key events
    if (this.which == null)
    {
        this.which = this.charCode != null ? this.charCode : this.keyCode;
    }

    // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8)
    if (this.metaKey === undefined)
    {
        this.metaKey = this.ctrlKey;
    }

    this.posx = 0;
    this.posy = 0;

    if (this.pageX || this.pageY)
    {
        this.posx = this.pageX;
        this.posy = this.pageY;
    }
    else if (this.clientX || this.clientY)
    {
        this.posx = this.clientX + document.body.scrollLeft
            + document.documentElement.scrollLeft;
        this.posy = this.clientY + document.body.scrollTop
            + document.documentElement.scrollTop;
    }
};

Ответы [ 3 ]

4 голосов
/ 30 ноября 2011

Это будет jQuery .

Убийца несоответствий браузеров с 2006 года.

Редактировать

Если вас интересует 32 КБ, используйте CDN Google . Многие сайты используют его, поэтому есть большая вероятность, что файл будет кэширован на большинстве компьютеров ваших пользователей.

1 голос
/ 30 ноября 2011

Похоже, вы говорите об объекте события, а не о событиях в целом.

В javascript собственным объектом является объект, предоставленный реализацией ECMAScript или созданный с помощью кода ECMAScript (например, function fred(){}, var obj = {}). Все остальное предоставляется хост-средой и, следовательно, является хост-объектом (например, окном, элементами DOM).

Следовательно, объект события является хост-объектом, а не объектом «нативного JavaScript».

Разумный подход в большинстве сред программирования - беспокоиться только о вещах, которые непосредственно влияют на разрабатываемую программу. Эта стратегия приводит только к «исправлению» объектов событий, когда их несоответствия влияют на определенные части кода. Не имеет смысла беспокоиться о свойствах, которые не используются, чьи несоответствия не влияют на написанную программу или которые не применимы к конкретному событию (например, каково значение pageX для события загрузки и почему если оно будет установлено в 0, а не в undefined ).

Вид программирования, в котором каждое возможное несоответствие записывается в одну функцию, приводит к программированию культа груза , где причина для выполнения определенных действий (если когда-либо была веская причина для их выполнения вообще) теряется, и они увековечены просто потому, что они существуют в некой «наилучшей» версии «кроссбраузерного» кода.

Например, кто-нибудь помнит, какие версии Safari устанавливают свойство target для текстовых узлов, если они были целью события? Если нет, и такой браузер не используется, почему он все еще находится в таком коде?

Если он включен, потому что какой-то будущий браузер может также делать цели событий текстовыми узлами, и по какой-то причине решено, что цели событий всегда должны быть элементами (или, по крайней мере, узлами, которые реализуют интерфейс элемента), тогда не будет разумнее будет сделать:

if (this.target.nodeType != 1 && this.target.parentNode) {
  this.target = this.target.parentNode;
}

как более общее исправление вероятности того, что цель события не является элементом?

При каких обстоятельствах будет event.srcElement == false, и почему он должен быть задан для узла документа, а не для элемента body или head ?

1 голос
/ 30 ноября 2011

Похоже, вы уже извлекаете код из jQuery. (Точные совпадения строк из event.js). Кажется, это лучший подход, который вы могли бы использовать.

Посмотрите на mouseHooks и keyHooks , чтобы узнать о кросс-браузерных исправлениях этих типов событий.

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