2014-09-02 45 views
1

我正在重構別人寫的一些代碼。有使用功能:爲什麼窗口中的'ontouchstart'被大多數瀏覽器支持?

!!('ontouchstart' in window) 

我已經看到了這個用在其他項目:https://github.com/Modernizr/Modernizr/blob/master/feature-detects/touchevents.js#L40 而在出現StackOverflow的答案:https://stackoverflow.com/a/4819886/1127635

但現在看來似乎可能比替代品慢:http://jsperf.com/hasownproperty-vs-in-vs-undefined/12

那麼爲什麼使用這個可能更慢的選擇?哪些瀏覽器不支持其他解決方案?

+1

我真的不明白你的帖子的主要問題。你想知道爲什麼使用'x in y'方法,或者它是否足以檢查'window'對象中的'ontouchstart'屬性? – VisioN 2014-09-02 11:57:01

+0

對此感到抱歉。問題是:爲什麼使用它而不是其他可用選項? – conradkdotcom 2014-09-02 12:02:46

+0

嗯...顯然要檢查瀏覽器是否支持觸摸事件,這在觸摸屏設備中是必不可少的。爲了更好的可讀性,我使用'x in y'。 – VisioN 2014-09-02 12:04:15

回答

4

你的替代試驗都以某種方式存在缺陷:

  • window.ontouchstart !== null試驗非null聽衆。測試ontouchstart的值是一種有風險的方法,因爲庫或其他代碼可能會更改ontouchstart的值。測試價值是一種不好的方法;它會更好,以測試該屬性本身,它給我們帶來了你的下一個提出的測試的存在......

  • window.hasOwnProperty('ontouchstart')測試,如果window對象都有自己ontouchstart財產。在某些瀏覽器中(我剛剛在Chrome 37和IE9上確認了這一點),window不是有其自己的on -event屬性;相反,它們屬於window.__proto__

我們不應該測試值(因爲之前我們運行的代碼前面的代碼可能已經改變的值),我們不能測試window自己的財產,因爲瀏覽器在執行過程中的不同在window的原型鏈中存在事件監聽器屬性。因此,我們最一致的選擇是測試window的原型鏈中是否存在該屬性(不論其值是多少)。這正是我們對in運營商所做的。

當然,如果別人的代碼在我們的測試之前運行,他們可以添加一個ontouchstart屬性,其中最初不是一個。嚴格測試對事件的支持是不可能的,這是一件糟糕的事情。

+0

'window.ontouchstart!== void 0'如何? – conradkdotcom 2014-09-02 12:19:08

+0

它不太清楚。 – 2014-09-02 12:19:47

+0

是的,但可能跨瀏覽器和更快。這是跨瀏覽器? – conradkdotcom 2014-09-02 12:24:02