【问题标题】:jQuery as temporary polyfilljQuery 作为临时 polyfill
【发布时间】:2012-03-22 17:31:12
【问题描述】:

我正在编写一个当前需要支持旧浏览器(如 IE 7)的 JavaScript,直到明年所有用户都升级到更现代的浏览器。

我正在考虑使用 jQuery 作为临时 polyfill,如下所示:

var flag=0;
window.JSON||(flag=1);
document.querySelectorAll||(flag=1);
if (flag===1) {
    // load jQuery here
}
else {
    // no need for jQuery
}

这种方法有意义吗?有没有更好的办法?

现场演示在这里http://jsfiddle.net/3mzxr/

【问题讨论】:

  • 你到底在写什么? Jquery 不仅仅适用于 json - 它还有许多其他功能,并且在大多数情况下可以很好地弥补浏览器的缺陷。
  • 我不确定你想做什么。如果您想检测用户的浏览器并更改您的代码。使用api.jquery.com/jQuery.browser
  • @Rup 好点,我还需要编写包装函数,如 myJSON=window.JSON||$.JSON
  • @MarcB 我主要需要 JSON 和 DOM 选择器。在我的情况下,其他 jQuery 函数并没有带来太多价值,最终我不想被绑定到特定的库。
  • @humaknight 浏览器检测还不够,功能可用性还取决于文档类型。关键是我想在加载 jQuery 之前检测它。

标签: javascript jquery json polyfills


【解决方案1】:

整个方法是相当合理的。不过,您并不总是需要使用 jQuery。

对于选择器功能,您可以直接使用Sizzle(5KB 压缩和压缩),而不需要使用 Sizzle 作为选择器引擎的整个 jQuery(30+ KB)。 (但请注意,Sizzle 本身长期存在 bug 与无法使用像 [autofocus] 这样的布尔属性选择器有关。出于某种原因,该错误是在 jQuery 级别上解决的,而不是在 Sizzle 级别上修复它。)

对于 JSON,您可以使用 pure-JS JSON implementation (2.5 KB)。

此外,最好直接检测特征(检查 window.JSON 对象以获取 JSON,检查 document.querySelectorAll 以获取 qSA)而不假设支持 JSON 意味着支持 querySelectorAll()

【讨论】:

  • 我相信这就是我的代码所做的,单独检测功能?我了解特定库的好处,但单独加载它们也有成本。 jQuery 似乎是一个不错的折衷方案。
  • 根据您的代码,window.JSONdocument.querySelectorAll 的缺失导致相同的 1flag。至于单独的文件,没有什么能阻止您将两个 JS 库合并到一个文件中;总大小(~7.5 KB)将比 jQuery 的大小(~32 KB)小得多。
  • 通常只要确保不同库的代码片段之间有一个新行(换行)就足够了。
【解决方案2】:

不,我不会这样做。

如果这是你想要的,请使用 polyfill,它可以很容易地使用像 yepnope 这样的加载器和你想要填充的特定 polyfill 脚本来完成。

【讨论】:

  • 可选的 jQuery 对我来说似乎是一个很好的折衷方案。我担心多个 http 请求的成本(首先是 yepnope 强制,然后可能是几个 polyfill)。
猜你喜欢
  • 2021-09-08
  • 2019-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多