IT戦記 このページをアンテナに追加 RSSフィード Twitter

2009-01-20

Google Chrome ではてなスターコメントの出現位置がおかしい件とその原因

Google Chrome ではてなスターコメントの出現位置がおかしい

f:id:amachang:20090120104536j:image

こんな感じ

原因は Ten.js の以下の箇所

    getMousePosition: function(pos) {
        // pos should have clientX, clientY same as mouse event
        if ((navigator.userAgent.indexOf('Safari') > -1) &&
            (navigator.userAgent.indexOf('Version/') < 0)) {
            return {
                x: pos.clientX,
                y: pos.clientY
            };
        } else {
            var scroll = Ten.Geometry.getScroll();
            return {
                x: pos.clientX + scroll.x,
                y: pos.clientY + scroll.y
            };
        }
    },

この if 文は、 Safari 2 系かどうかを見ているんだが、 'Safari' という文字列があって 'Version/' という文字列がないかどうかを判断基準にしてしまっている。

そして、 Google Chrome には Version/ という文字列が含まれていない(僕の環境では)。

なので、 Google Chrome = Safar 2 系という判定をされて、 event.client[XY] を意図しない値として扱う。

これはいけない><

レンダリングエンジンを見るべき

オープンソースブラウザでは、ブラウザのバージョンで判定してはいけない。

レンダリングエンジンのバージョンで判定すべきだ。(自戒も込めて)

なので、 Safari という文字を見てはいけない。あくまでレンダリングエンジン AppleWebKit という文字を見るべき。

なので、 Safari 2 以前かどうかを知りたければ以下のようにするのがいい。

var m;
if ((m = navigator.userAgent.match(/AppleWebKit\/(\d+(\.\d+)?)/)) && m[1] < 500) {
    alert('Safari 2 Compat');
}
else {
    alert('Modern');
}

バージョン判定は uai.js が参考になる

JavaScript によるユーザエージェント判別

JavaScript-XPath でもお世話になっています

あと

この例の場合に限っては、 page[XY] があったらそっち使うって判定を入れてもいい気がする。ただ、保守性の問題か。

trshugutrshugu 2009/01/20 15:00 参考になりました!!
はてなの人も見るとよかったですね!

shingotadashingotada 2009/01/20 22:38 画像のスターをつけた本人です。
意外なところにピックアップされてうれしいっす。

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。

トラックバック - http://d.hatena.ne.jp/amachang/20090120/1232417020