jQuery 1.8 RC1 发布

发布于 作者

jQuery 1.8RC1 现已发布。是的,RC 代表 *候选发布版*。好消息是,这个版本比我预期的晚几天发布。好消息是因为我们收到了几个宝贵的但最后一分钟的错误报告,我们能够修复它们。非常感谢那些花时间用您的代码测试 Beta 2 的人,尤其是那些发现并报告错误的人。

现在我知道有很多你们在想,“天哪,从来没有人让我发现过错误。” 好了,这是您成为 jQuery 社区英雄的机会。在这个 *候选发布版* 中,我们可能已经拿走了某些工作功能,并插入了一些如此模糊的问题,甚至我们自己也不知道它们在哪里。请找到它们!只需从这里获取代码

https://code.jqueryjs.cn/jquery-1.8rc1.js

在您使用 jQuery 的任何地方尝试这个 *候选发布版* 代码,并通过 错误跟踪器 告知我们您发现的任何问题。请务必提及您正在针对 jQuery 1.8 RC1 进行测试,并请使用 jsFiddle.net 创建一个显示错误的测试用例,以便我们可以重现并调查它。您可以在 jsFiddle 中使用“jQuery(edge)”框架选项,它代表最新代码。

哦,我有没有提到这是一个 *候选发布版*?是的,我提到了。谁知道是否会有 jQuery 1.8.1?如果您在我们发布 jQuery 1.8 后发现错误,可能要过六个月才能修复它。六个月的痛苦,这一切都因为您没有测试 *候选发布版*!在您等待修复这个关键错误的这段时间里,一个半女人都可以生个孩子!为了您自己的利益,请尝试一下吧!

jQuery 1.8rc1 变更日志

1.8rc1 版本的当前变更日志。

Ajax

  • #8205: JSONP 随机结果导致 IE8 中出现内存泄漏
  • #8653: jQuery.param 在查询字符串中输出“null”和“undefined”
  • #9399: 弃用 jqXHR.success 和 jqXHR.error
  • #10285: evalScript rcleanScript 替换在 IE8 中失败
  • #10524: jQuery.fn.load 不会将 data 参数与 jQuery.ajaxSetup 合并
  • #10944: $.ajax 并不总是返回一个实现 Promise 接口的对象
  • #11013: 弃用使用 Deferred/Promise 与同步 $.ajax
  • #11402: evalScript 函数在 IE 中出现错误 80020101
  • #11743: jQuery 在 $.appendTo() 中的脚本标签 ajax 请求期间静默忽略错误
  • #11778: 缓存的 XHR 请求仍应异步解析
  • #12122: jQuery.ajax() 异步弃用使用 $.Deferred

属性

  • #11153: jQuery 1.7 在 IE 8 中删除回车符
  • #11212: Sizzle.getText 在 IE 上将不可分割的空格转换为空格
  • #11547: XML DOM .removeAttr() 不会删除大小写敏感属性
  • #11962: 标准化空集的 getter 返回值。
  • #12127: 克隆在 IE10 中没有正确复制选中状态

构建

  • #11767: 支持没有效果的自定义构建
  • #11789: 更新 README 以描述 grunt 构建系统
  • #11856: 模块化尺寸
  • #11857: 模块化 css
  • #11865: 模块化偏移
  • #11965: 创建 deprecated.js 来包含尽可能多的已弃用内容

核心

  • #10657: 弃用 jQuery#size(),转而使用 jQuery#length
  • #11290: 选择器被解释为 HTML
  • #11470: 添加内置的 readyP promise
  • #12018: $(document).ready() 在 IE8 中过早触发
  • #12026: 允许 $(html, props) 使用任何 jQuery.fn 方法

Css

  • #10373: `document.defaultView` => `window`
  • #10413: 当隐藏父元素的 "box-sizing: border-box" 子元素时,width、innerWidth、innerHeight、outerWidth、outerHeight 不准确
  • #10679: CSS3 供应商前缀支持
  • #11004: 当 box-sizing 为 border-box 时,getWH 错误地删除了填充和边框宽度
  • #11787: 删除 jQuery.curCSS
  • #12088: Webkit 现在为更多 getComputedStyle 属性返回百分比
  • #12148: hide 事件在切换时不触发

数据

  • #7579: jQuery.data() 截断从 data-xxx 属性中获取的数字
  • #10589: 删除 $.fn.data("events")

Deferred

  • #11010: 使 Deferred.then == Deferred.pipe 像 Promise/A 一样
  • #11011: 允许为 $.Callbacks 标志使用传统的选项对象
  • #11736: 删除 Deferred .isResolved() 和 .isRejected()
  • #11749: 当多个 Deferred 对象传递给 $.when() 时,保留上下文对象

尺寸

  • #6724: 移动 Safari(iPhone)中的 $(window).height() 错误
  • #10877: 使 outerWidth/Height 成为 setter
  • #11293: 读取空 TD 的 width 或 outerWidth 会改变列的宽度值
  • #11604: 将 $(elem).width(-val) 从无操作更改为 $(elem).width(0)
  • #11724: $(document).height() 在 Firefox 12 中更改

效果

  • #7109: 在 Webkit 上,animate 宽度从无效宽度开始
  • #7157: 动画回调显示元素仍然是 ":animated"
  • #8387: jQuery 1.5 hide/show 与 Webkit 浏览器中的内联和内联块元素存在闪烁问题
  • #8627: .animate() 在 IE 中的 letterSpacing 上失败(在 1.5.1 中出现回归)
  • #8892: 当 fadeIn() 和 jQuery.fx.off = true 时,回调在对象显示之前被调用
  • #9217: 当动画元素在动画完成之前被移除时,IE8 中出现 javascript 错误
  • #9505: 当在 Webkit 中混合使用百分比和像素时,animate() 问题
  • #11635: 明确的 overflow:auto 在动画过程中被内联的 overflow:hidden 覆盖
  • #11755: animate 及其别名不应使用 :hidden 选择器
  • #11797: 与动画相关的全新事件
  • #11854: 百分比动画跳到末尾
  • #11971: 在 IE8 中,动画 background-position 失败
  • #11999: 在固定 div 上的增量动画在 Chrome 中执行减法而不是加法。
  • #12117: 动画到 0 高度或宽度时,overflow hidden 没有正确设置
  • #12150: 当行显示和隐藏时,border-spacing 属性累积

事件

  • #8545: IE 中事件泄漏
  • #10067: 在 document.readyState === 'interactive' 上也触发 $.ready
  • #10895: bindReady 中的 doScrollCheck ie hack 无缘无故地降低了 ie7 性能
  • #11101: 弃用 trigger 方法中的“exclusive”事件选项
  • #11315: delegate() 和 :first 在具有相同类的嵌套元素中存在问题
  • #11328: 在 Windows 上,Ctrl 键不会将 event.metaKey 设置为 true
  • #11382: Mouseenter 在禁用的输入元素上不触发
  • #11500: 错误:“change”事件处理程序在 IE7 和 IE8 中手动触发时没有执行
  • #11621: 在文档上触发事件不会冒泡到窗口
  • #11718: 弃用 .data() 事件
  • #11719: 弃用 .bind("ready") 事件
  • #11731: 弃用“hover”伪事件
  • #11733: 弃用 .load()、.unload() 和 .error() 方法
  • #11764: 允许在禁用的元素上委派非原生事件
  • #11786: 弃用 .toggle( handler, handler, … ) 签名

操作

  • #8894: 在克隆() 之后调用的 appendTo() 及类似方法在 IE 中返回错误的 jQuery 集
  • #10324: 克隆在 IE9 中不会复制 object 元素的 innerHTML
  • #11231: Append、Prepend、After、Before 应该接受数组作为第一个参数
  • #11338: .replaceWith() 和断开连接的节点的行为不一致。
  • #11528: ie8 序列化错误与 .html() 也会影响 html5 标签
  • #11566: 当节点是 DocumentFragment 时,node.append 等不工作
  • #11617: 定义 $.parseHTML 方法来创建 HTML 片段
  • #11809: .text(val) setter 中存在内存泄漏?
  • #11898: 具有复杂 :not() 选择器的 prevAll() 以错误的顺序返回结果
  • #12132: 当克隆没有 parentNode 的 object 元素时,IE10 错误

偏移

  • #10996: 简化 offset()
  • #11823: 删除 webkitConvertPointFromNodeToPage

选择器

  • #3778: 选择器匹配问题
  • #5568: 选择器在 FF/IE 中对注释标签的行为不同
  • #7596: xpath 选择器属性名称带有方括号 [] 失败
  • #8473: 在 IE9rc 中,*[tabIndex] 也选择所有没有 tabindex 的元素
  • #8906: .(prevAll('span:has(input,select,textarea)')
  • #9400: 弃用 :text、:radio、:checkbox 等选择器扩展
  • #9810: 重写位置选择器逻辑
  • #10003: 来自 #6963 的回归/向后兼容性破坏
  • #10074: 连接两个 [] 选择器和 :first 不起作用
  • #10499: :nth-child() 在 :has() 内部被视为外部
  • #10570: :text 选择器在 IE7 中遇到跨域 iframe 时会抛出错误
  • #10697: Sizzle 重构
  • #10799: [name="name"] 选择器结果不一致(也会破坏 .has)

jQuery 1.8 Beta 2 发布

发布日期: 作者:

jQuery 中心这几个星期可真够疯狂的,先是 Beta 1 发布,接着又是旧金山举行的 jQuery 大会。别担心!在所有旅行、会议、会谈和关于 jQuery 未来的博客文章中,我们实际上还写了一些代码。作为证据,我们发布了 jQuery 1.8 Beta 2

https://code.jqueryjs.cn/jquery-1.8b2.js

这是程序的关键部分,我们呼吁您,jQuery 社区,帮助我们一起完成它。请在旧浏览器、新浏览器、红色浏览器和蓝色浏览器中使用 Beta 2。(分别是 IE6、Chrome Canary、Opera 和 Internet Explorer。)请用您所有的代码测试此文件,请在每种模式下都好好测试。Beta 2 中是否有东西坏了?请在完成之前告诉我们!

在那些测试 Beta 1 的人帮助下,我们发现了一些错误并修复了它们。我们无法强调测试这些测试版时,您的反馈对我们来说有多么重要。我们不喜欢发布最终版本,因为当您将其放入网页时会导致问题,而防止这种情况的方法是在测试版中进行测试,并在问题发生之前让我们知道。

注意:此版本需要与 jQuery UI 协同修复一些问题。因此,使用 jQuery UI 的页面需要包含最新的 UI 主版本才能针对 jQuery 1.8b2 进行测试。您可以从这里获取:https://code.jqueryjs.cn/ui/jquery-ui-git.js。jQuery UI 1.8 将有一个维护版本,其中包含 jQuery 核心 1.8 支持,但鼓励用户在 jQuery UI 1.9 发布后更新到 jQuery UI 1.9。

如果您发现问题,请尝试将其简化为一个简单的测试用例。 jsFiddle 是我们首选的获取测试用例的方式,因为它允许我们调整测试用例,诊断问题并探索解决方案。(为框架选择jQuery (edge),这是最新的代码。)有了测试用例,请前往 错误跟踪器 并告诉我们发生了什么。谢谢!

除了 Beta 1 中报告的错误修复之外,这个新的测试版还对 Sizzle 引擎进行了重大重写,以实现更好的性能。它修复了与 IE 6、7 和 8 相关的许多错误,并使这些浏览器的使用更加一致。与旧版 IE 的完美匹配将永远是一件难以捉摸的事情,但我们仍在努力使您的开发生活尽可能轻松,无论浏览器如何。

如果您按照 Github 上的 README 文件 中的描述构建您自己的自定义版本,您现在可以选择省略将在未来版本中删除的一些已弃用功能。当我们隔离更多已弃用功能时,我们将向该文件添加内容。

以下是自 jQuery 1.7.2 以来的更改列表。

jQuery 1.8b2 更改日志

1.8b2 版本的当前更改日志。

Ajax

  • #4624: default ajaxSettings.contentType 中的字符集
  • #10978: jQuery.param() 应该允许非原生构造对象作为属性值
  • #11264: evalScript() 使用 ajaxSetup() 设置的默认值
  • #11426: jQuery.ajax() 在 IE 中请求 JPG 图片时总是失败

属性

  • #5571: 在 jQuery 中向任何 setter 传递 undefined 时允许链式调用
  • #10828: attr("coords") 在 IE7 中返回 undefined
  • #10870: $.removeAttr("selected") 的行为不正确
  • #11316: 首先考虑按元素类型,然后按节点名称查看 valHooks,而不是反过来

构建

  • #10692: 将 jshint 选项配置为更准确地匹配样式指南
  • #10693: 将单元测试中的“在 iframe 中测试某事”代码泛化
  • #10901: 如果测试器从 file:// 运行或没有 PHP,则使单元测试失败
  • #10902: 能够在单元测试中测试 jQuery 的构建版本
  • #10931: 单元测试不应该需要互联网访问

核心

  • #10466: jQuery.param() 将包装的基元误认为深层对象

Css

  • #10639: outerWidth(true) 和 css('margin') 在 Webkit 中返回 % 而不是 px
  • #10754: 让 jQuery.swap 返回回调的返回值,而不仅仅是执行它
  • #10782: 计算宽度不正确
  • #10796: IE7 中 $('#el').css.('background-position') 的错误
  • #10858: css.js 正则表达式不完整
  • #11119: curCSS 函数只需要 2 个参数

数据

  • #11309: 十六进制格式的 data-* 属性解析错误

Deferred

  • #11306: 在 $.Callbacks 对象上调用 .disable() 或 .lock() 会破坏其 fired() 状态

效果

  • #8498: 动画钩子
  • #10006: 当针对文档片段调用时,方法 show 在所有浏览器中都不能按预期工作
  • #10848: 动画切换在某些原子边缘情况下会丢失状态跟踪
  • #11415: 在 CSS 值非法的情况下静默忽略负值
  • #11469: 动画 (.animate) 中的负边距

事件

  • #8165: .live('click', handler) 在 Chrome 中对包含子元素的禁用按钮触发
  • #10819: 消除“this.on.call(this, ”
  • #10878: $("select").live("change", function(){ …在 jQuery 1.7 中 IE8 中损坏
  • #10961: 在 IE6-9 中使用 jQuery 1.7.1 时,XRegExp 出现错误
  • #10970: .on() 选择器参数不适用于 :not(:first) 选择器
  • #10984: 无法关闭自定义事件 ($.event.special)
  • #11021: 悬停黑客会破坏一个名为“悬停”的命名空间
  • #11076: .clone(true) 会丢失委托过滤器
  • #11130: jQuery.fn.on: 绑定具有空选择器的映射会忽略数据
  • #11145: $(document).on() 不适用于 name="disabled"

操作

  • #9427: 向 .text() 传递 undefined 不会触发 setter
  • #10753: 将 evalScript 函数内联到 manipulation.js 中,因为它只使用一次
  • #10864: 文档片段上的 text() 方法始终返回空字符串
  • #11055: 更新 HTML5 Shim 元素列表以支持最新的 html5shiv
  • #11217: Webkit 中的附加问题
  • #11291: 在 IE 上克隆具有 HTML5 节点名称的 XMLDoc 会破坏
  • #11323: 具有 type="text/ecmascript" 的脚本标签会泄漏到 DOM 中
  • #11356: safeFragment 内存泄漏

其他

  • #10952: 当 Callbacks 对象用“once”标记时,.fired() 无法正常工作
  • #11257: 如果缺少 PHP,则测试套件中源文件的路径错误

队列

  • #10967: .promise() 不会将方法附加到目标

支持

  • #7986: 如果页面有 DIV-element CSS,则 $.support.boxModel 存在错误
  • #11048: 支持测试会影响 IE6-9 中定位元素的布局
  • #11337: $.support.reliableMarginRight 中的错误

遍历

  • #11370: $('<div>').siblings() 抛出异常

新的 Sizzle

发布日期: 作者:

为了让您的 7 月 4 日更加“sizzlin’”(欢迎使用),jQuery 团队很高兴地宣布,Sizzle,jQuery 的 CSS 选择器引擎,比以往任何时候都更好、更快、更可靠!Sizzle 已经过全面重写,并将包含在 jQuery 1.8 版本中。

首先,应该感谢 Diego Perini 指引我前进的方向,以及 Samuel Lebeau 在 3 年前创建了一个名为 Bouncer 的项目,这是一个“用于 Javascript 的快速自下而上的元素匹配器”。

jQuery 与 Sizzle 一同于 2006 年发布,大约在 Simon Willison 发布 getElementsBySelector 之后 3 年,它几乎为我们今天拥有的每个选择器引擎奠定了基础。随着时间的推移,Sizzle 为了性能进行了多次重写,并且随着使用人数的增加,越来越多的错误被修复。

在这段时间里,出现了其他一些非常出色的选择器引擎,包括但不限于 NWMatcher(由 Diego 开发)、dojo.query、Slick、base2、qwery 和 YUI。虽然它们都有各自的优势,但 NWMatcher 和 Dojo 尤其以卓越的引擎脱颖而出。虽然它们在每个选择中都不是最快的,但它们在几乎所有选择中都始终很快。我的目标是为 Sizzle 达到相同的性能水平,保留 John 和错误团队多年来收集的所有边缘情况错误修复,并涵盖更多已排队或由其他引擎涵盖的错误。我现在可以自信地说,这个目标已经实现。

虽然我不会说 Sizzle 完全没有错误,或者它在每种情况下都是最快的,但它的可靠性和 性能提升 非常具有竞争力。 http://jsfiddle.net/timmywil/s7rN4/ 是一个简单的测试,用于快速观察一些选择器引擎在几种选择器上的差异(应该在打开控制台的浏览器中运行)。

更改了什么

以下是 Sizzle 在 jQuery 1.7.2 和 jQuery 1.8 之间主要代码差异的简化列表。

一个编译后的选择器函数

选择器解析器将选择器编译成一个函数,其中包含每个选择器部分的函数。这意味着对于任何给定的选择器(不包括位置(POS)选择器,例如:first:eq(3)),只需要检查一次可能的元素集。这主要是在 速度提升 和提高稳定性的地方。

此外,Sizzle 会维护一个最近编译函数的缓存。缓存有一个最大大小(可以调整,但有默认值),因此在使用大量不同选择器时不会出现内存不足错误。

注意:这不会影响简单选择器(仅 ID、仅标签、仅类),因为 Sizzle 针对这些选择器进行了快捷方式,尽可能地使用 getElementByIDgetElementsByTagNamegetElementsByClassName。这并没有改变(除了为元素根 ID 选择器添加快捷方式),它们仍然是最快的选择器。任何其他选择器都将通过 querySelectorAll(如果可用)或运行编译器。

querySelectorAllmatchesSelector

通过最新的重写,querySelectorAllmatchesSelector 的代码路径比以前更好,并产生了出色的性能。

有些人问我们为什么要使用 Sizzle,因为现代浏览器有 querySelectorAllmatchesSelector,并且接受广泛的 CSS3 选择器。问题是,每个浏览器(不仅仅是 IE)在这些方法中都有一些错误。选择器引擎必须提前知道这些错误是什么,并在这些方法返回不正确的结果之前绕过它们(尽管并非所有引擎都这样做)。Sizzle 现在已经解决了这个问题。

此外,querySelectorAllmatchesSelector 不知道如何处理 [attr!=value]jQuery 选择器扩展。每次使用选择器扩展时,Sizzle 都需要本地处理选择。

改进的选择器验证

验证选择器是一件棘手的事情。过于严格可能会令人讨厌,但过于灵活可能会产生意想不到的结果。在过去,Sizzle 在不同的用例中都表现出这两种特点。最近的更改旨在尽可能地遵守 W3C 选择器规范,但也允许一些规范中没有的东西(例如,在 :not() 伪类中使用复杂选择器)。

具体来说,我们正在匹配所有必要的空白字符,包括换行符、制表符、回车符和换页符(http://www.w3.org/TR/selectors/#whitespace),验证属性选择器中的标识符和运算符(http://www.w3.org/TR/selectors/#attribute-selectors),并提供与规范匹配的字符编码(http://www.w3.org/TR/css3-syntax/#characters)。

组合器(空格、~、>、+)

组合器可能非常复杂,但新策略以极佳的姿态处理了这些问题。在 jQuery 1.8 beta 版本(以及今年的 jQuery 大会上),我声称 Sizzle 改进了对组合器的支持。虽然准确性有所提高,但我过早地说话了,幸运的是,这个问题被我在 github 上只认识为 Yaffle 的人指了出来。显然,对于非常大而深的文档,最初的修订版检查了太多元素,导致具有多个组合器的选择器出现堆栈溢出。对于每个组合器,为了保持可能的匹配,检查的元素数量呈指数级增长。这是不好的。Sizzle 现在解决了这个问题,并获得了非常令人满意的结果。

可扩展性

虽然这次重写中 Sizzle 的大多数旧 API 没有改变(除了从私有 API 中删除现在不再需要的 Sizzle.filter),但也有一些变化让 Sizzle 更具可扩展性。扩展 Sizzle 的最常见方法是添加自定义伪选择器。现在,使用解析器编译函数的函数,您可以在创建自定义选择器时获得更多信息。例如,在 Sizzle 中,:not 伪选择器的实现非常类似于

// Using the createPseudo function tells the compiler
//   to pass the pseudo argument, context, and whether the current context is xml
//   to the function passed to createPseudo and trusts
//   that a function to be used for filtering will be returned.
// Note: the use of createPseudo is only necessary for creating custom
//   pseudo selectors with arguments.
Sizzle.selectors.pseudos.not =
    Sizzle.selectors.createPseudo(function( selector, context, isXml ) {
        var matcher = Sizzle.compile( selector, context, isXml );
	return function( elem ) {
		return !matcher( elem );
	};
    });

这是新解析器在公共 API 中的唯一破坏性更改,但我认为使用参数创建自定义伪选择器现在更加简洁。有关更多信息,请参阅 Sizzle 文档

也许有些人认为预先编译自己的选择器会很好。嗯,你可以。Sizzle.compile 是公开的,这样你就可以在选择器使用之前缓存它们。虽然编译仍然非常快,没有缓存,但你可以在选择器运行之前确保跳过这一步。使用你的选择器和上下文调用编译

Sizzle.compile(“my>long>complicated:selector(poof)”, document);

它被添加到缓存中。你甚至可以通过设置 Sizzle.selectors.cacheLength 来增加或减少缓存的大小。

注意:大多数用户不需要使用编译器,因为 Sizzle 会维护最近编译的选择器的缓存。覆盖 Sizzle.compile 不会影响 Sizzle,因为它会维护对该方法的内部引用。

获取代码!

该代码现在可以在 jQuerySizzle 的 git 版本中找到。预计 jQuery 1.8 将在本月某个时候发布。Sizzle 的特定问题可以在 GitHub 上提交,而且一如既往,任何与 jQuery 整体相关的问题都可以在我们的 错误跟踪器 上提交。自己试一试,如果遇到任何问题,请告诉我们。祝您使用愉快,并祝您独立日快乐!

jQuery 1.9 和 2.0 — TL;DR 版

发布于 作者

看来很多人对 上一篇文章 有疑问和误解,所以让我们尝试使用简短的问答格式来回答其中的一些评论。

为什么 jQuery 核心团队要放弃对旧 IE(IE 6/7/8)的支持? 我们并没有!jQuery 1.9 在明年发布时将支持旧 IE。即使 jQuery 2.0 发布后,jQuery 团队也会继续支持和维护 1.9 版本。

为什么你让我使用条件注释来包含 jQuery? 我们没有!您可以对我们支持的所有浏览器使用 jQuery 1.9,从 IE6 一直向上到 Chrome、Safari、Opera 或 Internet Explorer 的最新版本。

当 jQuery 2.1 发布并添加 API 时,jQuery 1.9 会支持它们吗? 我们可以借用你的水晶球吗?jQuery 2.1 不太可能在 2014 年之前发布,所以我们很难说 jQuery 2.1 在 2012 年年中会是什么样子。我们的总体目标是让 1.x 和 2.x 系列保持同步,并通过插件添加功能;参见 上周大会上的主题演讲

您将支持 jQuery 1.9 多长时间? 只要旧 IE 在网络上是一个重要因素。甚至有可能 1.x 系列会有进一步的版本发布,但我们还没有收到上一个问题中要求的水晶球。然而,当微软在 2014 年 4 月放弃对 Windows XP 的支持时,旧 IE 的安装基数将会受到影响。

我仍然有很多 IE8 用户,你不能只放弃 IE6 和 IE7 吗? 旧 IE 浏览器共享许多相同的缺陷,因此在 jQuery 2.0 中做任何少于删除所有三个浏览器的事情都没有帮助。如果你需要任何形式的旧 IE 支持,一个受支持的 jQuery 1.9 会在那里等着你。

我的网站在中国,我们 22% 的用户仍在使用 IE6! 看起来像是某种人权侵犯。哦,这不是个问题。