2014-05-05 74 views
2

因爲我一直在閱讀關於本地拖放事件的教程,所以在調用e.preventDefault()之前,我遇到了一個有條件的檢查e.preventDefault。這個條件是寫無論是作爲:e.preventDefault && e.preventDefault()

e.preventDefault && e.preventDefault(); 

if (e.preventDefault) { 
    e.preventDefault(); 
} 

的教程由雷米夏普,Drag and Drop and Automatically Send to the Server通過雷米夏普,並Implementing Native Drag and Drop由馬特·西都Native Drag and Drop

我從來沒有遇到過這種模式。我習慣於在沒有條件的情況下看到e.preventDefault()e.preventDefault什麼時候會是虛假的,在每個調用e.preventDefault的實例中最好使用這種措辭?

+0

爲了將來的參考,還發現:'e.preventDefault? e.preventDefault():e.returnValue = false;' – maxhallinan

回答

1

看起來的preventDefault行爲是not standardized跨瀏覽器。它解釋了爲什麼jQuery在其Event對象包裝器中有一個wrapper for the native preventDefault(),使其始終存在並且更具可預測性。在這種情況下,您不必爲preventDefault進行額外的測試,並且它的價值,但可以假設它在事件發生時可用。但是如果你的工作沒有像jQuery這樣的抽象庫,你仍然需要做額外的測試。 jQuery的代碼似乎是一個很好的指導。

1

這將是錯誤的,如果JavaScript不能找到功能(瀏覽器不具備此功能),但無論如何,它應該是「不確定」,這將被轉換爲false。如果您想保持與舊版瀏覽器的兼容性,每次調用此函數時都應該使用它。

e.preventDefault && e.preventDefault() 

如果第一個條件爲真,它將被執行。無論如何,在jQuery中你可以找到一個通用的方法來做到這一點。

例如,如果我不記得了錯,一些瀏覽器(IE?)可以使用e.returnValue避免的默認操作代碼的執行。

您添加的兩個代碼是同樣的事情,做了同樣的。

1

何時e.preventDefault是falsy?

在不尊重DOM規範的非常古老的瀏覽器(如IE<=8)中,它將是未定義的。

在e.preventDefault被調用的每個實例中使用這種措辭是否是最佳實踐?

不可以。通過標準DOM方法附加的聽衆也可以期望這種方法存在。如果你關心的是舊版瀏覽器,那麼你通常會使用一個框架來提供這些功能。