サイトマップ

JavaScriptコードスニペット:ブラウザによるイベントの扱いを正規化する

JavaScriptでWWWブラウザ向けの処理を行おうとすると、ブラウザによって異なる挙動に対応するのに一苦労します。そのもっとも顕著なものがイベントの扱いでしょう。ここでは、受け取ったイベントを一旦下記のfixEvent()で正規化することにより、Internet Explorerのイベントの非標準的な振る舞いを吸収するようにしています。

【サンプルコード】

/*
 * event fix
 */
function(evt) {
        if (!window.event) {
            if (typeof evt.offsetX != 'number') { //not safari
                evt.offsetX = evt.pageX;
                evt.offsetY = evt.pageY;
                var el = evt.target;
                while (el) {
                    evt.offsetX -= el.offsetLeft ? el.offsetLeft : 0;
                    evt.offsetY -= el.offsetTop ? el.offsetTop : 0;
                    el = el.offsetParent ? el.offsetParent : el.parentNode;
                }
            }
        } else {
            evt = window.event;
            evt.target = evt.srcElement;
            evt.preventDefault = function() { this.returnValue = false; };
            evt.stopPropagation = function() { this.cancelBubble = true; };
            switch(evt.type) {
            case 'click':
            case 'mousedown':
            case 'mouseup':
            case 'mousemove':
                evt.which = evt.button==4 ? 3 : evt.button;
                if (document.compatMode == 'CSS1Compat') {
                    evt.pageX = evt.clientX + document.documentElement.scrollLeft;
                    evt.pageY = evt.clientY + document.documentElement.scrollTop;
                } else {
                    evt.pageX = evt.clientX + document.body.scrollLeft;
                    evt.pageY = evt.clientY + document.body.scrollTop;
                }
                break;
            }
        }
 
        if (evt) {
                evt.stop = function() {
                    evt.preventDefault();
                    evt.stopPropagation();
                    return evt;
                };
        }
 
        return evt;
}

JavaScriptコードスニペット

 
research/1308704774.txt · 最終更新: 2011/07/22 08:46 by Kazuyuki Matsuda
特に明示されていない限り、本サイトの内容は次のライセンスに従います:Copyright(C) 2011 Shorindo, Inc. All Rights Reserved
Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki