【问题标题】:How to make a jquery plugin, which is written by someone else, work in all the browers it could actually work?如何使一个由其他人编写的 jquery 插件在它可以实际工作的所有浏览器中工作?
【发布时间】:2024-04-23 20:45:01
【问题描述】:

我如何使用功能检测来制作由其他人编写的插件,以便在所有可以实际工作/受支持的浏览器上工作。 plugin 的文档说它在 IE 8 中受支持,但实际上并不起作用。我知道这是因为浏览器检测不可靠,但我能做些什么才能让它在所有可以实际工作的浏览器中工作?

详情

仅举一个特定的例子,我使用的是 jQuery 选择的插件版本 0.9.7,正如文档所述 -

支持所有现代浏览器(Firefox、Chrome、Safari 和 IE9)。 还启用了对 IE8 的旧版支持。

但是,我发现它在许多 IE 8 中不起作用,但在 IE tester IE 8 上起作用。然后在插件代码中我发现了这个浏览器检测逻辑,它只是从插件逻辑中转义 -

if ($.browser.msie && ($.browser.version === "6.0" || $.browser.version === "7.0")) {
   return this;
}

我发现$.browser.version 在我的 IE 8 上返回 7.0,这就是它无法正常工作的原因。好吧,没什么好惊讶的,我知道。我尝试删除 $.browser.version === "7.0" 条件,只是为了检查它是否真的在我的 IE 8 上有效并且有效。但是,我无法删除该条件,因为插件的作者已经这样做了,他一定知道得更好。

现在,我的问题是如何使用功能检测使其在所有可以实际运行的浏览器上运行。我想合乎逻辑的步骤是找出该插件使用了哪些所有浏览器功能。那我怎么发现呢?请原谅我对此的有限知识。我只是有特征检测的理论知识,它比浏览器检测更好等等,但从未真正使用过任何进行特征检测的代码。大约 1-2 年前我就知道了。

而这一次,当我搜索时,我了解到Modernizer。这会有帮助吗?我不确定,因为它说它用于构建下一代 HTML5 和 CSS3 驱动的网站,而我们还没有大量使用 HTML5、CSS3。或者,一旦我知道插件需要哪些所有功能,jQuery.support 对我来说就足够了。

一些进一步的推理

我发现了这个问题Browser detection via object/feature detection,作者询问是否可以使用特征检测来确定浏览器实际上是什么。一条评论说 - “功能检测的重点是让您可以了解浏览器是否确实具有您需要的功能。当您正确执行此操作时,您实际上并不关心它是什么浏览器,您只关心它是否具有完成工作所需的功能。”我理解并同意这一点,但是说这些浏览器支持给定插件有什么意义。为什么插件作者不列出所有需要的功能,从而方便人们使用?但是,在我看来,列出支持的浏览器背后的要点只是通过假设理想的浏览器来给出兼容性的想法。

例如,两个理想的 IE 6 浏览器会有相同的选择下拉 z-index 问题,会干扰弹出 div。假设一个插件有这个问题,那么说这个插件与 IE 6 不兼容意味着一个理想的 IE 6 浏览器,而不是另一个 IE 8 浏览器,它的用户代理经过调整并返回 IE 6 作为浏览器版本。

在这种情况下(列出支持的浏览器只是通过假设理想的浏览器来了解兼容性),使用特征检测来识别浏览器是否有意义?如果,那为什么没有很多可用的示例 sn-ps?

很多问题.. :) 我猜,今天我都问了...

【问题讨论】:

  • 为什么不完全删除浏览器检测并在所有相关浏览器中进行测试?顺便说一句:我不会相信 IE Tester...它只是一个模拟并且包含它自己的渲染错误。
  • 问题是矛盾的:您承认开发人员必须通过浏览器检测来“了解更多”。然后您询问如何在不删除浏览器检测的情况下欺骗它。当您还在寻找绕过它的方法时,将浏览器检测保持在适当的位置是没有意义的。
  • 引用“我发现 $.browser.version 在我的 IE 8 上返回 7.0” 也许真正的问题是你的 HTML是 not validating 并且 IE 正在滑入兼容模式和/或 Quirks 模式。
  • 您的 IE8 浏览器可能会返回 IE7,因为您已将其设置为兼容模式,该模式旨在像 IE7 一样工作,因此该插件可能完全按照它的预期工作。
  • 是的,我的 IE 8 在可组合模式下运行。我关闭了它,现在我的插件工作正常。但是,在不以兼容模式运行时,在某些情况下是否存在不正确的版本检测的可能性?这就是为什么浏览器检测不可靠的原因。我的问题实际上是如何在这里使用特征检测?但是,顺便说一句……我的问题值得结束吗?真的吗?我只是提出了一些推理......

标签: jquery jquery-plugins browser-feature-detection


【解决方案1】:

您可以尝试在插件中或在使用插件之前执行此操作:

var checkString = '<!--[if lt IE 7 ]> <div id="my-id" class="lt-ie7" > <![endif]--><!--[if IE 7 ]> <div id="my-id" class="ie7"> <![endif]--><!--[if IE 8 ]> <div id="my-id" class="ie8"> <![endif]--><!--[if IE 9 ]> <div id="my-id" class="ie9"> <![endif]--><!--[if (gt IE 9)|!(IE)]><!--> <div id="my-id" class="other"> <!--<![endif]-->';

$('body').append(checkString);

$('body').append('Your browser is: '+$('#my-id').attr('class'));

示例:http://jsbin.com/inisol

顺便说一句:没有 IE 来测试它。希望它有效。

【讨论】:

    最近更新 更多