IE8中本机占位符支持的Javascript检查

IE8中本机占位符支持的Javascript检查,javascript,placeholder,Javascript,Placeholder,tldr: 为什么inputElemnt中的('placeholder')在IE8中等于true,尽管本机不支持占位符属性?(元素中的属性)不是检查本机支持的好方法吗?Javascript库现代化者使用它 长: 我有一个名为Defaultvalue()的小Jquery插件。我有一个名为Placeholder()的小Jquery插件。它基本上是HTML5占位符属性的回退 if('placeholder' in this){ // this is an input-element r

tldr: 为什么inputElemnt中的('placeholder')在IE8中等于true,尽管本机不支持占位符属性?(元素中的属性)不是检查本机支持的好方法吗?Javascript库现代化者使用它

长: 我有一个名为Defaultvalue()的小Jquery插件。我有一个名为Placeholder()的小Jquery插件。它基本上是HTML5占位符属性的回退

if('placeholder' in this){ // this is an input-element return false; } 在最近的一次更新中,我添加了这三行代码。希望如果浏览器对占位符属性具有本机支持,Defaultvalue不会运行

if('placeholder' in this){ // this is an input-element return false; } 如果(本文件中的“占位符”){ //这是一个输入元素 返回false; } 除了IE8和IE7之外,它似乎在大多数浏览器中都能工作。出于某种原因,它在这里找到了键“占位符”,但我认为,IE7/IE8中不支持占位符属性

我的代码受Javascript库Modernizer()中的代码启发

(功能(道具){ for(变量i=0,len=props.length;i我缺少什么?

创建一个新的原始输入元素解决了我的问题

var nativePlaceholderSupport = (function() { var i = document.createElement('input'); return i.placeholder !== undefined; })(); if(nativePlaceholderSupport){ return false; } var nativePlaceholderSupport=(函数(){ var i=document.createElement('input'); 返回i.占位符!==未定义; })(); if(本机占位符支持){ 返回false; } var nativePlaceholderSupport=(函数(){ var i=document.createElement('input'); 返回(i中的“占位符”); })(); if(本机占位符支持){ 返回false; }
谢谢罗布,是你带我去的。

没有。它在IE9和IE8中都等于false


现场演示:

IE对属性和属性一无所知,它认为它们是一样的(jQuery也是如此)。非标准属性被添加为“expando”属性。使用for..in来迭代宿主对象的属性不是一个好主意。IE<9不支持hasAttribute,因此也不起作用。谢谢!您的评论导致了一个有效的解决方案。占位符属性也没有在IE9中实现…这不是一个好的解决方案。HTML5草案说:“属性,如果指定,…”,因此它不是强制属性,没有理由相信如果属性没有设置,元素将具有占位符属性。因此,它的缺失并不表示它不受支持,只表示它尚未被设置。不要在主机对象上使用for..in,无论您试图做什么,都可以通过其他方式解决,而这种方式可以得到更多浏览器的支持。@RobG他不使用for..in。@Šime Vidas:好的,如果..in,不管怎样。这类似于关于以特定顺序返回本机对象属性的争论,因为有些浏览器以这种方式返回本机对象属性,尽管ECMA-262表示不依赖它。如果某个规范中定义了某个内容,您可以预期,随着时间的推移,浏览器将收敛于该行为并处理异常。如果一种行为很常见,但没有具体说明,你只是希望每个人都跟随领导者。也许他们会,也许他们不会。在对象属性顺序方面,它们并不都遵循IE,那么为什么要在DOM属性/属性上遵循Gecko/WebKit呢?@RobG这不是Gecko/WebKit的事情。这是跨浏览器的,这就是浏览器的工作方式。规则是:如果浏览器在Y类型的DOM元素上实现了属性X,那么Y类型的每个DOM元素都将包含属性X,而不管是否在HTML源代码中对应的HTML元素上设置了属性X。如果未定义属性,则相应属性的值将为falsy(
false
0
,等等),但该属性将存在于该DOM元素上。虽然浏览器行为是证据,但它本身并不足以说服我。对相关W3C草案的搜索表明,事实上,至少就HTML5而言,浏览器应该为所有受支持的属性在DOM元素上创建属性,即使它们没有被赋值或不在标记中。IE 9支持占位符属性吗?据我所知,它没有。@RobG没有。我的演示证实了这一点。 var nativePlaceholderSupport = (function(){ var i = document.createElement('input'); return ('placeholder' in i); })(); if(nativePlaceholderSupport){ return false; }