2016-03-28 23 views
1

我正在構建一個函數,在該函數中,我發現確定字符串是否用於指定事件類型是非常有用的。 (例如,'點擊','按鍵','模糊')。目前,我將它與我從標準中獲得的一系列名稱進行比較,但由於以下原因,我不喜歡該解決方案:獲取當前環境中可用的事件類型

  • 這是醜陋的。一個包含167個條目的硬編碼數據看起來非常不雅。

  • 不同的瀏覽器環境可能支持不同的事件。我可能每個瀏覽器使用不同的(或額外的)列表,但這只是加劇了先前的問題,並且會維護。

  • 有,我相信,事件可以動態創建的情況。我不可能事先檢測到這些。

我的搜索功能似乎在這一點上失敗了,所以我轉向我聰明和慷慨的StackOverflow用戶。簡而言之,我的問題是:

如何在運行時獲取當前識別的事件類型的列表?

+0

也許不是一個確切的重複,但我認爲它有你尋求的答案:[* Javascript IN運營商兼容性*](http://stackoverflow.com/questions/2920765/javascript-in-operator-compatibility/2920832# 2920832)。 – RobG

回答

1
Object.keys(HTMLElement.prototype).filter(function(k) { return /^on/.test(k); }); 
+0

這很聰明,我喜歡它。但由於某種原因,它在Firefox Developer Edition中返回的唯一內容是'onwheel'。而對於Chrome,它會返回11個項目,缺少一些常見事件,如'onclick'。 –

+1

@JonCarter:對不起,這應該是'HTMLElement' – SLaks

+0

這裏的缺點是它假定主機實現DOM對象的原型繼承(不需要這麼做),並且所有事件都可以作爲* HTMLElement.prototype *的成員它在Safari中)。 – RobG

0

這是我的轉到reference,非常全面。

+0

這就是我目前用來加載數組的自己。但是我發現這個解決方案不完美,正如問題中所描述的那樣。 –

1

與SLaks的答案類似,但您可以在窗口對象上運行它,而不是獲取詳盡的事件列表。

Object.keys(window).filter(function(k) { return /^on/.test(k); });

1

你不說你爲什麼要做到這一點,所以答案只能解決具體問題「如何判斷一個字符串是一個‘對’事件」。

我不認爲有一個明確的策略。使用從實現,標準或規範中整理出來的所有可能的事件類型的列表可能是合理可靠的,但是並不完美,因爲JavaScript實現可以自由地引入他們希望的任何新類型的事件。因此,這個列表需要經常更新,您必須至少測試並可能更新每個發佈的新瀏覽器和版本的列表。此外,所有瀏覽器都可能不支持所有事件。

使用諸如收集DOM對象的可枚舉「on」屬性或其原型的策略也不適合,因爲不需要主機在DOM對象上實現繼承,有些不會使它們可枚舉(例如Safari至少v9)。

另一種方法是看是否'on' + string是一個DOM對象的標準屬性,所以:

function isPossibleEventName(s) { 
 
    var div = document.createElement('div'); 
 
    return ('on' + s) in div; 
 
} 
 

 
['click','input','blur','foo','bar','paste'].forEach(function(s){ 
 
    document.write('<br>Possible event ' + s + ': ' + isPossibleEventName(s)); 
 
});

至少會告訴你,如果主機支持特定的事件類型,但它可能需要在不同的元素類型上進行測試,因爲並非所有元素都必須支持所有事件。此外,它不會告訴你該字符串是否可能是某個其他主機中的「on」事件(但是它們都不會對元素原型的「on」屬性進行整理)。

雖然這應該適用於所有瀏覽器,但如果上述內容適用於舊版Firefox,則可以使用some doubt。但是,this post另有說法,在版本43中似乎還可以。您應該儘可能測試版本,只要您認爲合理。

+0

下面是對我的目標的更完整的描述,而不是我在問題中給出的非常簡短的描述:我需要確定對象鍵是事件類型還是其他。 [這是代碼](https://github.com/borkabrak/attachEvents.js)在github上 - 有爭議的是「attachEvents()'的參數。 我可以通過不同的方式解決問題,但這並不能滿足我對這是否可能的好奇心 - 我可以想象一個可能不可避免的情況,而且它似乎應該是一個這樣做的方法。 :) –

+0

我最初不理解這個道歉。這是一個很好的答案。但請看我對SLakS的回答,因爲我不知道它是否實質上更好。 –

相關問題