2011-04-04 31 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