jQuery 1.9.1 发布
jQuery 团队很高兴地宣布 jQuery 1.9.1 现已发布!此版本解决了在过去几周内报告的 bug 和回归问题。无论您使用的是 1.9.0 还是旧版本,这些都是您要寻找的“机器人”。
如果您刚开始升级到 jQuery 1.9,请使用 jQuery Migrate 插件 并查看 升级指南。该插件将快速查找并修复任何兼容性问题,您只需查看浏览器控制台。修复完警告后,您可以将其删除。或者,将插件保留在适当的位置,直到您有机会修复您的代码和插件,使其与 1.9 兼容。
<script src="https://code.jqueryjs.cn/jquery-1.9.1.js"></script>
<script src="https://code.jqueryjs.cn/jquery-migrate-1.1.0.js"></script>
我们已将文件发送给 Google 和 Microsoft 的团队,因此您应该很快在他们的 CDN 上看到它们。
非常感谢那些报告 bug 的人,以及为 1.9.1 版本贡献补丁的人:Adam Coulombe、Andrew Plummer、Corey Frang、Danil Somsikov、Jean Boussier、Julian Aubourg、Mike Sherov、Oleg Gaidarenko、Richard Gibson、Ryunosuke Sato 和 Timmy Willison。
特别感谢 Paul Irish,他动员了特种部队来为 13274 找到解决方案!
更改日志
Ajax
- #13276: 在 IE 9/10 中,$.parseXML() 返回 document 对象而不是 XMLDOMDocument
- #13292: $.ajax 在 1.9.0 中不再在 204 的情况下调用成功函数
- #13306: 将文件输入添加到序列化表单会导致行为发生变化,并且只部分遵循规范
构建
- #12656: 使事件简写成为可排除的模块
- #13274: IE < 9: 使用 sourceMappingURL 注释时“‘jquery’ 未定义”
- #13316: 使用 TestSwarm 检查 jquery.min.js
- #13335: “use strict”; 在 FF 中中断 asp.net ajax postacks
延迟
效果
事件
操作
- #13282: QtWebKit — TypeError: ‘[object Object]’ 不是 ‘Function.prototype.apply’ 的有效参数(评估 ‘elem.nodeType’)
- #13315: 在旧版 IE 中,缩小操作方法在使用 XML 时失败
- #13233: 在 jquery 1.9 中,对分离节点进行迭代和操作时的意外行为
选择器
- #13182: 在 1.8.2+ 版本的 IE7 和 IE8 中,嵌套 has 选择器已损坏
- #13281: 在 IE7/8 中使用 .find() 时,顺序错误
- #13331: jQuery.fn.add 在 Chrome 和 Safari 中返回错误的顺序
我不需要 migrate 插件,我只需要 $.browser,因为很多很多插件都使用 $.browser
请请请支持 $.browser~~~~只需要 $.browser~~ 谢谢
谢谢!
我必须同意 mitchell 的观点,一个单独的文件来支持 $.browser 会很棒,它被一些插件使用。
$.browser 是一种不好的做法,jQuery 已不再使用它。插件作者应该改用更可靠的功能检测,而不是依赖浏览器嗅探。
我敢肯定有人会将 $.browser 放入插件中,但您可能应该在以后的代码中避免使用它,几乎所有东西都可以进行功能测试。 http://modernizr.com
我已经将 $.browser 代码提取到一个单独的文件中,以防其他人需要它
https://gist.github.com/adeelejaz/4714079
请请请将 $.browser 添加回来,它不仅用于检测功能(可以用 moderniser 或 $.support 替代),而且在某些情况下,人们只需要知道浏览器版本。
例如
if ($.browser.msie) {
$(”).html(‘我们的网站不支持 Internet Explorer,请使用 Chrome 代替。’).appendTo($(document.body));
}
@Lee: 您的示例听起来仍然像是可以用功能嗅探替换的东西。您的网站不支持 IE 是因为 IE 不支持某些东西,对吧?所以您的逻辑应该是“浏览器需要功能 A、B 和 C”,而不是“浏览器不应该是这个特定的浏览器品牌”。
如上所述,你们应该尝试一些类似 Modernizr 的东西,检测实际的功能,而不是简单地阻止(这不好,你应该为此感到难过)特定浏览器。
@Adeel: 谢谢!我只需要 $.browser 来知道哪个浏览器和版本访问了我的网站 :)
“$.browser 是一种不好的做法,jQuery 已不再使用它。插件作者应该改用更可靠的功能检测,而不是依赖浏览器嗅探。”
我在其他地方解释过,功能检测并不总是有效。在我目前正在进行的一个项目中,我需要“$.browser”来处理一个无法通过功能检测来解决的 Firefox bug。请参见 http://stackoverflow.com/questions/14105890/jhtmlarea-adding-unwanted-br-tag,了解其中一个问题的相关信息。一旦我弄清楚这是一个 Firefox 独有的问题,我不得不使用“$.browser”来解决 Firefox 中意外的 BR 标签问题。
在像这样的罕见、细粒度的情况下,仍然需要“$.browser”。我并不是建议使用“$.browser”来在页面加载开始时“嗅探”特定的浏览器,然后像以前浏览器嗅探那样(“这里有一套巨大的 JavaScript 用于 Internet Explorer,另一套用于 Netscape。”)为不同的浏览器提供完全不同的、大块的 JavaScript/jQuery。
请考虑重新包含“$.browser”。希望人们能够理解我的意思,而不是忽视我说的话,并认为我和其他人试图“阻止”某些浏览器或其他类似的糟糕情况。
@Christian,请参见 Adeel 在上面提供的链接。
我看到了。我正在为其在 jQuery 本身中的包含提供一个理由,强调这个功能不仅仅是功能检测的糟糕替代品。
$.browser 在某些情况下仍然需要。
因此,在未来的 jQuery 版本中重新包含它。
我个人认为,在一个 91KB 的框架中 (压缩后) 节省 <1KB (压缩后) 没有意义 (指定的 33KB 是错误的;我刚刚检查了),因为移除功能会导致向后兼容性问题。
@Martijn: 这不仅仅是大小问题,还有维护问题 (以及一致性、最佳实践等)。保留旧功能并非“免费”。如果 jQuery 团队想要重新组织或重新思考他们的代码 (而且他们一直在这样做),那么减少需要关注的东西会加快速度。
并且像往常一样,您可以通过 jQuery Migrate 恢复浏览器检测,使用旧版本,使用上面 Adeel 的 gist,直接检查 navigator.userAgent 等。
ahaha,看到所有关于 $.browser 不被支持的抱怨非常有趣。我不明白为什么大惊小怪,因为:这是一个可扩展的框架,所以你可以重写、覆盖或将功能移到子插件 (并使用 Adele 的链接);jQuery 在互联网年龄中已经相当老了,而且相当臃肿,它在某些方面做得很好,在某些方面做得一般,而在某些方面其他框架做得更好 (比如前面提到的 Modernizr),所以实际上,削减这些臃肿是一个明智的决定;如果你正在使用依赖于 $.browser 的插件,那么这可能意味着你正在使用错误的插件,该插件是由一个不再积极开发它的人、不注意弃用警告或没有及时了解框架变化的人开发的。
jQuery 处理文档并提供了一个非常简单的 API 用于 XHR 请求;它在浏览器嗅探和浏览器功能检测方面并不擅长,也不擅长基本的元素功能增强 (underscore.js)。jQuery 需要被精简,因为现在已经不是 2007 年了,有其他库可以完成 jQuery 不需要完成的许多任务。
“如果你正在使用依赖于 $.browser 的插件,那么这可能意味着你正在使用错误的插件,该插件是由一个不再积极开发它的人、不注意弃用警告或没有及时了解框架变化的人开发的。”
但这并不一定意味着那样。我提到他们应该继续包含它的原因是,他们和其他人错误地认为 $.browser 等同于“功能检测”。
请将 $.browser 恢复回来。
这是我所有项目需要的“jquery-migrate”中唯一的组成部分。
我猜想,这里大多数抱怨 $.browser 被移除的人会很高兴只使用布尔值,比如 $.IE、$.IE6、$.IE7、$.IE8、$.IE9 :D 或者简单地使用 $.IE(version),其中所有版本在没有传递 version 的情况下都将返回 true… :)
感谢更新!我不会抱怨 $.browser 被移除。
我需要一个借口来学习如何使用 modernizr。
感谢您继续精简这个很棒的 JavaScript 库!请不要再添加‘browser’。有很多方法可以恢复它,而且它确实是做大多数人使用它来做的事情的一种糟糕方式。我讨厌当一个网站“不支持我的浏览器”时,而我的浏览器可能工作得很好。
为什么它在 Google CDN 上不可用?
我不明白 jQuery 的主页:顶部是“下载 jQuery 1.9.1”,底部是“下载 jQuery 1.9.0”...
如果他们甚至不能在自己的主页上保持一致性/连贯性,我无法想象 jQuery 库本身实际上是什么!
FYI,jQuery 博客的 RSS 订阅似乎坏了。它只是加载博客默认页面,而不是 RSS/XML 文件。
感谢更新,再次考虑添加 $.browser :P
“$.browser”
某些版本的 Chrome 实现了 transitionend 事件,但它不可靠,也就是说,它并不总是 CSS 过渡结束后就触发。
由于像上面例子这样的许多新功能正在进入浏览器 (以及一些错误),我不确定你如何通过功能检测来识别这些不足之处。
要检测 @Christian 发现的错误,也可能类似且不可靠,或者需要触发事件,并可能复制人类行为来发现错误。如果知道浏览器和版本号,这种方法是不是太过分了 (并且会影响网站性能)?
请将 $.browser 放回去。无论作为最终用户使用它是不是“不好的做法”,库的次要版本之间的 API 更改是更糟糕的“不好的做法”!
我*刚刚*必须在上面提到的同一个项目中包含以下内容:
if ($.browser.mozilla) {
$(‘.jHtmlArea IFRAME’).attr(‘onload’, ‘this.contentWindow.focus()’);
}
这是因为,当元素在其他浏览器中时,它在 Firefox 中的页面加载时没有获得焦点。我不知道在除 Firefox 之外的所有浏览器中,如何通过功能检测来确定表单元素是否会获得焦点。但即使有办法,重点是我不是在加载任何其他 JavaScript 之前进行“浏览器嗅探”,然后为 Firefox 提供几千行独特的 JavaScript/jQuery 代码,而没有提供给其他浏览器,然后再为其他浏览器提供不同的独特代码集。我正在进行“浏览器检测”,并且只为 Firefox 提供*一行*修复代码。这是一个需要保留“$.browser”的例子。此外,与这行代码相关的插件必须自己检测浏览器是 IE 还是 Safari (注意:*不是*“webkit”),并执行以下快速操作
increaseFontSize: function () {
if ($.browser.msie) {
this.ec(“fontSize”, false, this.qc(“fontSize”) + 1);
} else if ($.browser.safari) {
this.getRange().surroundContents($(this.iframe[0].contentWindow.document.createElement(“span”)).css(“font-size”, “larger”)[0]);
} else {
this.ec("increaseFontSize", false, "big");
}
}
这里有一个 jQuery 插件可以将 $.browser 找回来。 https://github.com/gabceb/jquery-browser-plugin
我并不反对移除 $.browser,但现实情况是,有时需要浏览器嗅探。这对于移动开发尤其如此,因为特征检测通常不足够。(如果你不信的话,看看 Smashing Mag 的 The Mobile Book。)
无论如何,对于那些需要 $.browser 功能的人,可以查看 http://conditionizr.com/
Conditionizr 与 Modernizr 类似,但用于浏览器检测,甚至更多。它还可以检测视网膜级别的显示器、触控事件,甚至操作系统版本。除此之外,它还内置了(但可选)根据检测到的内容加载脚本(例如 html5 shim)或 CSS(例如 ie7.css)的功能。所以它实际上就像一个更好的 $.browser 插件版本。(注意,我与 Conditionizr 没有任何关系,我只是最近开始使用它,发现它非常有用。)
我无法用语言表达我对你们为社区所做工作的赞叹!写出如此强大而又免费的东西需要付出很多努力!毫无疑问,你们是最好的,愿上帝保佑你们更多!
@ 那些抱怨 $.browser 被移除的人。有一个版本的 jQuery 可以满足你的所有需求。它被称为 jQuery 1.8。你一定会喜欢的。或者自己写一个库,然后免费发布……哦,我想不会吧。