2011-11-23 125 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