Javascript 检查 IE8 中的原生占位符支持
Posted
技术标签:
【中文标题】Javascript 检查 IE8 中的原生占位符支持【英文标题】:Javascript check for native placeholder support in IE8 【发布时间】:2011-07-29 00:26:51 【问题描述】:tldr: 为什么 ('placeholder' in inputElemnt) 在 IE8 中等于 true,尽管不支持 placeholder 属性? (元素中的属性)不是检查本机支持的好方法吗? javascript 库 Modernizer 使用它。
长:
我有一个名为 Defaultvalue (http://unwrongest.com/projects/defaultvalue/) 的小型 Jquery 插件。我有一个名为 Placeholder (https://github.com/janjarfalk/jquery.placeholder.js) 的小型 Jquery 插件。它基本上是 html5 占位符属性的后备。
在最近的更新中,我添加了这三行代码。如果浏览器对占位符属性具有原生支持,希望 Defaultvalue 不会运行。
if('占位符'在这个) // 这是一个输入元素 返回假;它似乎可以在除 IE8 和 IE7 之外的大多数浏览器中使用。出于某种原因,它在其中找到了关键的“占位符”,但我认为,在 IE7/IE8 中没有对占位符属性的任何支持。
我的代码受到 Javascript 库 Modernizer (http://www.modernizr.com/) 中的这段代码的启发。
(功能(道具) for (var i = 0, len = props.length; i我错过了什么?
【问题讨论】:
IE 对属性和属性一无所知,它认为它们是同一件事(就像 jQuery 一样)。非标准属性被添加为“expando”属性。使用 for..in 来迭代宿主对象的属性不是一个好主意。 IE 谢谢!您的评论带来了一个可行的解决方案。 IE9中也没有实现占位符属性... 【参考方案1】:创建一个新的原始输入元素解决了我的问题。
var nativePlaceholderSupport = (function() var i = document.createElement('input'); 返回 i.placeholder !== 未定义; )(); if(nativePlaceholderSupport) 返回假; var nativePlaceholderSupport = (function() var i = document.createElement('input'); return ('placeholder' in i); )(); if(nativePlaceholderSupport) 返回假;感谢 RobG,是你引导我完成的。
【讨论】:
这不是一个好的解决方案。 HTML5 draft 说:“属性,如果指定,......”,所以它不是一个强制属性,没有理由相信一个元素将具有一个占位符属性,如果该属性没有没有设置。因此,它的缺失并不表示它不受支持,只是它尚未设置。并且不要在主机对象上使用 for..in,无论您尝试做什么,都可能通过更多浏览器支持的其他方式来解决。 @RobG 他没有使用 for...in。 @Šime Vidas:好的,如果..in,随便。这类似于关于以特定顺序返回本机对象属性的争论,因为某些浏览器以这种方式返回,即使 ECMA-262 表示不依赖它。如果在规范中定义了某些内容,您可以预期随着时间的推移浏览器将收敛于该行为并处理异常。如果一个行为很常见但没有具体说明,你只是希望每个人都跟随领导者。也许他们会,也许他们不会。它们在对象属性顺序上并不都遵循 IE,那么为什么在 DOM 属性/属性上遵循 Gecko/WebKit? @RobG 这不是 Gecko/WebKit 的东西。这是跨浏览器,这就是浏览器的工作方式。 Take a look at this demo。规则是:如果浏览器在 Y 类型的 DOM 元素上实现属性 X,那么 每个 类型 Y 的 DOM 元素都将包含属性 X,无论是否在相应的 HTML 元素上设置了属性 X在 HTML 源代码中。如果没有定义属性,则相应属性的值将是虚假的(""
、false
、0
等),但该 DOM 元素上的属性将存在。
虽然浏览器的行为是证据,但它本身并不足以说服我。对相关 W3C 草案的搜索表明,实际上,至少就 HTML5 而言,浏览器应该为所有支持的属性在 DOM 元素上创建属性,即使它们没有被赋值或不存在于标记中。跨度>
【参考方案2】:
它没有。在 IE9 和 IE8 中都等于 false。
现场演示:http://jsfiddle.net/JVSgx/
【讨论】:
IE 9 是否支持占位符属性?据我所知没有。 @RobG 没有。我的演示证实了这一点。以上是关于Javascript 检查 IE8 中的原生占位符支持的主要内容,如果未能解决你的问题,请参考以下文章
Modernizr.load 在 IE7/IE8 中不提供输入和文本区域占位符支持
javascript CasperJs - 检查输入具有正确的占位符值