2013-02-13 61 views
1

當我不想執行與該事件關聯的默認動作,我用JavaScript - 避免執行事件的默認操作。 `event.cancelable` vs`event.preventDefault`?

function listener(e){ 
    if(e.preventDefault) e.preventDefault(); 
    /* Other code */ 
} 

I have just learnt的事件具有布爾cancelable。那麼,我應該使用這個代碼嗎?

function listener(e){ 
    if(e.cancelable) e.preventDefault(); 
    /* Other code */ 
} 

我在想:

  • 如果event.preventDefaulttrue,它的真正含義,該事件是取消?也許如果它不可取消,則定義該屬性(和true),但它不是函數;或者它是一個函數,但如果我稱之爲拋出錯誤。
  • 是否所有瀏覽器(IE,我正在看你)支持event.cancelable?是否有瀏覽器有方法event.preventDefault但沒有event.cancelable;或者有方法event.cancelable但沒有event.preventDefault;或者event.cancelable並不總是暗示event.preventDefault被定義,它是一個函數,它不會拋出錯誤?

回答

4

此:

if (e.preventDefault) 

僅僅意味着該事件對象有一個名爲 「的preventDefault」 屬性。這是一個瀏覽器功能測試,因爲舊版本的IE沒有這個功能。相反,在IE中,您將事件對象的屬性「returnValue」設置爲false

因此,您測試「preventDefault」的原因是查看該函數是否可用;如果該屬性爲空,那麼顯然不能進行函數調用。所以,當你想阻止默認操作,你的代碼應該是這樣的:

if (e.preventDefault) 
    e.preventDefault(); 
else 
    e.returnValue = false; 

如果「取消」標誌是假的,那麼這意味着你不能防止默認行爲。 「preventDefault」函數仍然存在(如果它通常會),但對於不可取消的事件忽略對其的調用。根本沒有必要檢查國旗,真的;它通常是特定類型事件的靜態特徵。

+1

他不能,但喬恩Skeet可以! – gdoron 2013-02-13 19:35:39

+0

@gdoron哈哈我相信你是對的 – Pointy 2013-02-13 19:36:39

+0

@gdoron誰是Jon Skeet? – Oriol 2013-02-13 19:37:07