为什么浏览器嗅探不是推荐的做法?

nic*_*ckf 15 javascript browser sniffing

你在整个地方听到它:使用javascript来嗅探用户代理字符串以检测浏览器版本是一件非常糟糕的事情.最新版本的jQuery现在已经弃用了它的$.browser对象$.support.但如果有一个只影响IE而不影响其他浏览器的错误或问题我应该怎么做,我不知道为什么?

在我的例子中,一些jQuery代码使鼠标悬停和鼠标移动时出现工具提示并消失动画.在Internet Explorer中,它看起来很糟糕,而且很紧张,工具提示div在隐藏之前会变成一个非常大的大小,并且如果你用鼠标在一堆项目上运行鼠标它会真正杀死浏览器.我不知道IE没有"支持"我应该测试的特定功能,所以只是嗅探IE并使用不同的方法要容易得多.我可以/应该做什么呢?

kky*_*kyy 10

因为只是嗅探用户代理(这是jquery填充$ .browser对象所做的)并不能告诉你全部真相.

用户代理字符串可以在很多浏览器中轻松更改,因此,如果您例如禁用某些似乎使用IE浏览器的IE中无法使用的功能,您可能会意外地禁用某些未来浏览器或仅使用这些功能的用户,出于某种原因(例如,基于浏览器嗅探来克服限制),假装使用IE.

这似乎不是一个太大的问题,但它仍然是不好的做法.

是的,我也是IE嗅探器.我用

$.browser.msie && document.all
Run Code Online (Sandbox Code Playgroud)

只是要确定.

  • 为什么有人假装是IE?哈哈 (18认同)
  • 好吧,一个很好的例子是使用用户浏览器嗅探并拒绝非IE用户访问的网站:) (2认同)

oll*_*iej 6

首先要注意的是,用户代理嗅探并不仅仅意味着navigator.userAgent,它是一个通用术语,用于描述人们用来根据他们认为的浏览器更改行为的大量方法.

所以问题在于用户代理字符串,问题在于根据您认为的浏览器决定您的网站应该做什么.这意味着您将来不可避免地限制或破坏您的网站; 例如,我见过多个阻止IE的画布演示.他们没有检查是否支持画布,他们是明确地寻找IE,如果他们看到它们说IE被破坏,这意味着即使IE最终支持画布这些网站仍然无法工作.

您应该始终尝试检测您感兴趣的功能或错误,而不是浏览器嗅探.这些测试的最常见示例是"对象检测",例如.document.createElement("canvas").getContext是如何检测画布的存在,并将在任何浏览器中正确选取画布,即使当前版本不支持它.


ale*_*lex 2

因为如果你弄错了,你可能会意外地切断未来支持它们的浏览器的功能。

我经常发现它很有用。我知道IE6 不支持 Alpha 透明度,因此我使用浏览器嗅探来检测 IE6 并隐藏/更改使用它们的元素。

另外,如果要多次快速移动鼠标,请尝试HoverIntent。我相信它的用户 setTimeout() 只会在鼠标短暂停留在某个元素上时触发事件,从而节省周期并避免事件排队并可能冻结浏览器。

就我个人而言,我更喜欢 jQuery 的浏览器版本/类型方法。它可用于显示基于浏览器的友好问候消息。也许 jQuery 因“浏览器嗅探是邪恶的”的压力而弃用了它。

更新

John Resig(jQuery 的创建者)是这样说的:

在可预见的未来,我们将保留 jQuery.browser,但我们希望开发人员不再使用它 - 让开发人员这样做的最佳方法是成为正确开发模式的良好示例。

需要明确的是:$.support 中包含的要点主要是特定于浏览器错误的(无法通过正常对象检测进行测试的 IE 错误) - 并且它们并不涵盖所有可能的错误(只有大约十几个)。预计其他开发者将来会添加自己的测试点。

另外,在该提交中,我忘记了实际的 support.js 文件 - 可以在这里找到它: http://dev.jquery.com/browser/trunk/jquery/src/support.js ?rev=5986

来源:http ://www.reddit.com/r/programming/comments/7l2mr/jquery_removes_all_browser_sniffing/

另请参阅: http: //dev.jquery.com/changeset/5985