2013-06-25 112 views
2

我只是偶然發現了我的軟件中只發生在Firefox上的錯誤。原因是該事件沒有定義offsetX和offsetY。爲什麼Firefox event.offsetX和offsetY未定義?

我設法解決它,這要歸功於this

無論如何,我的問題不是編程幫助請求。我只是好奇爲什麼這些屬性在Firefox中未定義?它背後的原因是什麼?

我看過:DOM3 UIEvent Spec.DOM3 MouseEvent Spec.DOM2 MouseEvent Spec.

看來這裏沒有提到任何屬性,所以,我想這是在其他瀏覽器中引入的非官方屬性?

回答

7

儘管在W3 specification中提到,但是在不同瀏覽器中實現的屬性本身並不一致。雖然在IE,Webkit瀏覽器和Opera中都支持,但它們的功能與規範要求略有不同,IE除外 - according to the "Calculating offsetX, offsetY" section here

該屬性在Firefox中根本不被支持 - 它似乎是a long-time bug尚未解決。

「我想這是在其他 瀏覽器中引入的非官方財產?」

我相信這是一個官方屬性,只是沒有在Firefox中實現。如果它是一個非官方的IE屬性,它將不會在W3規範中提到的Webkit/Opera瀏覽器中實現,Firefox也不會實際嘗試實現它(請查看上面的錯誤鏈接)。

+2

FYI:歌劇現在是一個WebKit瀏覽器[\ [1 \] ](http://my.opera.com/ODIN/blog/300-million-users-and-move-to-webkit),[\ [2 \]](http://business.opera.com/press /發行/通用/歌劇齒輪-UP-AT-300百萬用戶)。 Chrome不再是Webkit,它是Blink [1](http://www.chromium.org/blink)。而且,歌劇似乎會跟隨Chromium,也會轉向Blink [\ [1 \]](http://thenextweb.com/insider/2013/04/04/opera-confirms-it-will-follow-谷歌和 - 溝-webkit的換眨眼-AS-部分 - - 它承諾到鉻/)。 – jolt

+0

@joltmode哇,感謝您的鏈接。看起來我有一些趕上的事情。 – lifetimes

+1

+1鏈接到傑克摩爾的解決方法。 –

1

OFFSETX和OFFSETY是在Firefox不一致,所以你可以做這樣

document.body.onclick = function(e) { 
    e = e || window.event; 

    var target = e.target || e.srcElement, 
     rect = target.getBoundingClientRect(), 
     offsetX = e.clientX - rect.left, 
     offsetY = e.clientY - rect.top; 

    console.log([offsetX, offsetY]); 
}; 

你可以找到更多信息Herehere