2011-04-04 32 views
15

tldr: 爲什麼(inputElemnt中的'placeholder')在IE8中等於true,儘管沒有對佔位符屬性的本地支持?不是(元素中的屬性)檢查本機支持的好方法嗎? Javascript庫Modernizer使用它。Javascript檢查在IE8中的原生佔位符支持

長: 我有一個小的jQuery插件叫做型默認值(http://unwrongest.com/projects/defaultvalue/)。我有一個名爲Placeholder的小型jquery插件(https://github.com/janjarfalk/jquery.placeholder.js)。它基本上是HTML5佔位符屬性的後備。

在最近更新的我添加了這三行代碼。希望如果瀏覽器對佔位符屬性具有本機支持,Defaultvalue將不會運行。

 
if('placeholder' in this){ 
    // this is an input-element 
    return false; 
} 

它似乎在除IE8和IE7以外的大多數瀏覽器都能正常工作。出於某種原因,它在這裏找到了關鍵的'佔位符',但是我認爲沒有任何對IE7/IE8中佔位符屬性的支持。

我的代碼受到JavaScript庫Modernizer(http://www.modernizr.com/)中此代碼的啓發。

 
(function(props) { 
    for (var i = 0, len = props.length; i < len; i++) { 
     attrs[ props[i] ] = !!(props[i] in inputElem); 
    } 
    return attrs; 
})('autocomplete autofocus list placeholder max min multiple pattern required step'.split(' ')); 

我錯過了什麼?

+3

IE是無能的屬性和特性,它認爲它們是同一個東西(一樣的jQuery)。非標準屬性被添加爲「expando」屬性。使用for..in遍歷主機對象的屬性不是一個好主意。 IE <9不支持hasAttribute,所以也不起作用。 – RobG 2011-04-04 08:46:18

+0

謝謝!您的評論導致了一個工作解決方案。 – janjarfalk 2011-04-04 10:16:18

+1

佔位符屬性沒有在IE9中實現... – 2011-04-04 12:15:34

回答

14

創建新的原始輸入元素解決了我的問題。

 
var nativePlaceholderSupport = (function() { 
    var i = document.createElement('input'); 
    return i.placeholder !== undefined; 
})(); 

if(nativePlaceholderSupport){ 
    return false; 
} 
 
var nativePlaceholderSupport = (function(){ 
    var i = document.createElement('input'); 
    return ('placeholder' in i); 
})(); 

if(nativePlaceholderSupport){ 
    return false; 
} 

感謝RobG,你領我到它。

+0

這不是一個好的解決方案。 HTML5 **草稿**說:「屬性,如果指定,...」,所以它不是一個強制屬性,並且沒有理由相信一個元素如果該屬性不是組。因此,它的缺席並不表示它不被支持,只是它沒有被設置。並且不要在主機對象上使用for..in,無論你想要做什麼,都可能通過更多種瀏覽器支持的其他方式解決。 – RobG 2011-04-04 10:43:08

+0

@RobG他不是用來......的。 – 2011-04-04 12:09:47

+0

@ŠimeVidas:好的,如果..,不管。這與關於本地對象屬性以特定順序返回的爭論類似,因爲一些瀏覽器以這種方式返回,即使ECMA-262說不依賴它。如果在規範中定義了某些東西,則可以預計,隨着時間的推移,瀏覽器將聚集在這種行爲上並處理異常。如果一種行爲很普遍,但沒有明確說明,那麼你只是希望每個人都跟隨領導。也許他們會,也許他們不會。他們並不都遵循IE的對象屬性順序,所以爲什麼要關注DOM屬性/屬性上的Gecko/WebKit? – RobG 2011-04-04 12:30:15

1

它沒有。它在IE9和IE8中均等於false。

現場演示:http://jsfiddle.net/JVSgx/

+2

IE 9是否支持佔位符屬性?據我所知,事實並非如此。 – RobG 2011-04-04 12:32:29

+0

@RobG號我的演示證實了這一點。 – 2011-04-04 12:40:41