2011-11-29 47 views
0

我想知道是否有任何已確定的方法來解決與DOM事件的瀏覽器不一致問題。 修復事件的最佳方法是什麼?修復本機Javascript事件

下面是我現在玩的東西(雖然還是壞了)。

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; 
    } 
}; 
+0

還發現了一個類似的功能[相關問題](http://stackoverflow.com/questions/4643249/cross-browser-event-object-normalization)。 – Xeoncross

回答

4

那將是jQuery

瀏覽器的殺手不一致自2006年以來

編輯

如果你關心32KB,然後使用Google's CDN。許多站點都使用它,所以很可能該文件將緩存在大多數用戶的計算機上。

+1

哈哈,那是一種方式。但我不喜歡添加30kB +來修復簡單的DOM事件。 – Xeoncross

+1

夠公平的,但它是一個受歡迎的選項 –

1

看起來你已經把代碼從jQuery中拉出來了。 (來自event.js的確切的行匹配)這似乎是您可以採取的最佳方法。

請查看mouseHookskeyHooks瞭解針對這些事件類型的跨瀏覽器修補程序。

1

看來你是在談論事件對象,而不是一般的事件。

在javascript中,本地對象是由ECMAScript實現提供的或由ECMAScript代碼創建的對象(例如function fred(){},var obj = {})。其他一切都由主機環境提供,因此是主機對象(例如窗口,DOM元素)。

因此,事件對象是一個主機對象,而不是「原生javascript」對象。

大多數編程環境中的一個合理的方法是隻擔心直接影響正在開發的程序的事情。該策略只會導致「修復」不一致影響特定代碼部分的事件對象。對未使用的屬性,其不一致性不影響正在編寫的程序,或不適用於特定事件的屬性(例如,對於加載事件,pageX的值是什麼,以及爲什麼應該設置爲0而不是undefined)。

這種編程將每一種可能的不一致都寫入單個函數中導​​致cargo cult programming,其中做特定事情的原因(如果有的話是有充分的理由去做的話)會丟失,並且它們會永久存在因爲它們存在於某些「最佳實踐」版本的「跨瀏覽器」代碼中。

例如,有誰還記得其中的Safari版本設定的目標財產如果他們是活動對象爲文本節點?如果沒有,並且沒有使用這樣的瀏覽器,爲什麼它仍然在這樣的代碼中?

如果包含它是因爲某些將來的瀏覽器也可能使文本節點成爲事件目標,並且出於某種原因決定事件目標必須始終是元素(或者至少是實現元素接口的節點),那麼將不會t將其進行更明智的事:

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

作爲該事件的目標是不是一個元素的可能性更廣泛的解決?

在什麼情況下會event.srcElement == false,爲什麼它應該被設置爲文檔節點,而不是說元素?