10

jQuery 2.0 越来越成熟:http ://blog.jquery.com/2013/03/01/jquery-2-0-beta-2-released/

jQuery 2.0 打破了与旧浏览器的兼容性,因此必须知道何时继续使用 jQuery 1.9。推荐的做法是使用 IE 的条件注释:

<!--[if lt IE 9]>
    <script src="jquery-1.9.1.js"></script>
<![endif]-->
<!--[if gte IE 9]><!-->
    <script src="jquery-2.0.0b2.js"></script>
<!--<![endif]-->
  • 当前的 Web 开发最佳实践建议我们应该避免浏览器嗅探或用户代理字符串解析,但这不就是条件注释吗?

  • jQuery 2.0 是否只会破坏与旧 Internet Explorer 的兼容性?还是有其他浏览器会在 2.0 中变得更糟?

  • 如果这不仅仅影响 Internet Explorer(这是条件注释唯一起作用的地方),那么我们应该使用什么策略来选择最好的 jQuery?

  • JavaScript 环境中是否存在全局可访问的值/对象/函数/等,其存在可用于表示与 jQuery 2.0 的兼容性(例如功能检测)?

主要问题

我的项目目前使用 Require.JS 来模块化我的代码。我的代码当前仅在遇到需要它的第一部分时才加载 jQuery。

使用 Require.JS 加载正确版本的 jQuery 的最佳方法是什么?

我目前正在考虑:

  • 在加载 Require.JS 之前使用 IE 条件注释,然后手动“定义”jQuery

  • 在设置Require.JS路径的代码中使用JS功能检测(在任何需要的jQuery之前)将路径设置为1.9或2.0(我的首选方法)

  • 无论如何总是使用1.9(最安全和最无聊的方法)

4

2 回答 2

13

Adaptation of niaccurshi's answer to AMD spec.

// Do this before your first use of jQuery.

var pathToJQuery
if('querySelector' in document
    && 'localStorage' in window
    && 'addEventListener' in window) {
    pathToJQuery = '//cdn/jQuery2.0'
} else {
    pathToJQuery = '//cdn/jQuery1.9'
}

require.configure({'paths':{
    'jquery': pathToJQuery
}})

require(['jquery'], function($){ /* you get the one you need here */ })
于 2013-03-05T18:48:11.647 回答
6

实际上有一个更优雅的解决方案,它被用于BBC他们的响应式新闻网站。

它本质上检测被认为是 的浏览器new,因此将与 兼容jQuery 2.0+,因此将其他所有内容都保留为old浏览器。您也许可以使用 复制此Require.js内容,但事实是您不需要...

if(querySelector in document
    && localStorage in window
    && addEventListener in window) {
    //Add jQuery 2.0+
} else {
    //Add jQuery 1.9.0+
}

//This is intended to be a flag that can be checked against to see if the jQuery library has been loaded into the browser.
var jQueryVersion = 0;
function jQueryRunning(ver) {
    //This could be "true", or could be a version number, it's largely down to your own system needs!
    jQueryVersion = ver;
}

来源: 链接

您应该为 的每个脚本添加一个回调函数,该函数使用等于其版本号的参数进行jQuery调用,这可以帮助您决定进一步运行的函数,并有利于让您知道何时 jQuery 代码jQueryRunning已嵌入(just in case the connection is slow and it takes a while to download)

如果使用Require.js它可能不是您要关心的事情!

我说这是一个优雅的解决方案,因为你是对的,问题不仅在于旧版本IE,还在于旧版本Firefox (before 3.5)和旧移动浏览器(如果它们甚至处理 javascript!)

于 2013-03-05T00:07:24.553 回答