检测浏览器特性支持的最可靠方法是什么?

10

假设我想在JavaScript库中检测对通知的支持 (http://notifications.spec.whatwg.org/)。

我可以使用 window.Notification !== undefined。但是,如果该库的用户(或另一个库)还定义了某种全局 Notification 对象来完成完全不同的任务怎么办呢?

另一方面,如果另一个库是一个polyfill呢?那么他们的 Notification 对象是可以接受的。我是否应该除了检查全局对象外,还测试所有方法呢?

更新:
我在一个通知 polyfill中注意到了一个有趣的事情:

ret[toString] = function() {
    return 'function Notification() { [native code] }';
};

依靠这种方式来检测一个对象是原生对象还是polyfill对象的可靠性如何?


5
您应该清晰地列出您的图书馆的环境要求,然后您就无需过多担心了。让用户确保其他库将互相配合。 - user2437417
1
我同意。如果用户足够疯狂,使用会污染全局命名空间的库,那么你能做的就不多了,对吧? - Lim H.
这是一个不错的答案,但只有在没有其他选择时才是如此。我喜欢尽可能地帮助人们避免潜在的错误。 - Andrey Shchekin
@CrazyTrain 是的,但我不是在防范恶意代码或专业脚枪,而是在防范简单的错误。Notification 对于类似的东西来说是一个非常常见的名称,因此冲突是很可能的。 - Andrey Shchekin
@CrazyTrain:好的,顺便说一下,你可以把你的意见(没有可靠的方法)发表为答案,如果我在合理的时间内找不到/得到其他选项/答案,我会接受它。 - Andrey Shchekin
显示剩余4条评论
2个回答

1
所以基本上有两个选择。
第一个是尝试依赖'function Notification() { [native code] }'toString值,因为至少一些polyfill正在设置它。不幸的是,这不可靠,因为我没有找到关于它是否是polyfill作者常用的方法以及它在浏览器中是否是可靠的返回值的信息。
另一个选择,正如评论中建议的那样,是忽略潜在的冲突,只需测试存在性并继续前进。这就是我现在采取的做法。

0

你可以采用jQuery的方法,重新定义任何引用预先存在的window.Notifications的内容,例如:

window._Notification = window.Notification;

Paul Irish在这个视频中讲解了这个过程,讲得非常好。

这样,你就可以继续实现其他功能,同时也包括你的功能。

希望这有所帮助。 :)


我认为你误解了问题。他想知道是否可以使用 Notification,而不是如何在不破坏任何东西的情况下覆盖它。 - John Dvorak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接