2011-11-23 114 views
11

我需要測試佔位符支持。下面的作品在所有現代瀏覽器大,以及IE7,IE8,IE9:HTML5佔位符功能檢測問題

$.support.placeholder = (function() { 
    var i = document.createElement("input"); 
    return "placeholder" in i; 
}()); 

它的工作原理,但JSLint的抱怨使用in

意外 '中'。與undefined比較,或者使用hasOwnProperty 方法。

很好,所以我要把它重構到這一點:

$.support.placeholder = (function() { 
    var i = document.createElement("input"); 
    return i.hasOwnProperty("placeholder"); 
}()); 

現在這種通過JSLint的沒有任何錯誤或警告,但它在IE7和IE8打破這個老生常談:

對象不支持屬性或方法「hasOwnProperty」

任何想法如何使JSLint的快樂,因爲我們如IE7和IE8?

+2

製作一個像jslint開心的工具並不一定意味着只要你知道自己在做什麼就可以讓你的代碼更好。如果你的老闆想要它,給他們一些很好的例子,證明他們愚蠢。 – ThiefMaster

+0

我不爲什麼jslint建議不要'in'。它已經有一段時間了,所以應該有全面的支持,而且非常直觀。對於佔位符支持,這是堅實的:https://github.com/mathiasbynens/jquery-placeholder – ryanve

回答

15

您也可以使用其他的解決方案的JSLint提示:

return typeof i.placeholder !== 'undefined'; 

這應該工作的跨瀏覽器沒有問題。

+0

這也很好,而且非常簡潔,如果我有麻煩閱讀錯誤信息,我應該想出來:) – karim79

+2

其實JSLint希望你使用'return i.placeholder!== undefined;'它'如果你嘗試使用'typeof i.placeholder!=='undefined';'。 – MHollis

3

您可以通過Object.prototype獲取該功能,然後在元素上獲取call。這使得該功能是可用你能夠調用它的i.hasOwnProperty - 時尚的方式(即在幕後this值時調用它i):

Object.prototype.hasOwnProperty.call(i, "placeholder"); 
+0

這很好。謝謝你的回答:) – karim79

+0

嗯,你會選擇哪一個。 – karim79

+0

@ karim79:這個允許將屬性設置爲「未定義」,但另一方面確實引入了函數調用開銷。 – pimvdb

5

我的答案是不要」噸。不要讓JSLint高興。 JSLint是Crockford如何看待JavaScript的工作。這是他的個人標準。如果你想要JavaScript的某種皮棉,請使用JSHint。它是JSLint的分支版本,完全可配置,並且沒有瘋狂的要求。它的主頁:

JSHint是JSLint的一個分支,由Douglas編寫和維護的工具 Crockford。

該項目最初開始作爲一個努力使JSLint的,在一個更 配置的版本,不會強制其一個 特定的編碼風格的用戶,但後來改造成自己的一個 單獨的靜態分析工具目標和理想。

+0

同意,但不幸的是我的決定。我必須忍受這一點,至少目前是這樣。無論如何。 – karim79