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:弃用在同步 $.ajax 中使用 Deferred/Promise
  • #11402: evalScript 函数在 IE 中出现错误 80020101
  • #11743: jQuery 在 $.appendTo() 中对 script 标签 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: width、innerWidth、innerHeight、outerWidth、outerHeight 对于 box-sizing: border-box 的隐藏父元素的子元素不准确
  • #10679: CSS3 供应商前缀支持
  • #11004: getWH 在 box-sizing 为 border-box 时错误地删除了填充和边框宽度
  • #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: 在 $.when() 中传递多个 Deferred 对象时保留上下文对象

Dimensions

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

Effects

  • #7109: animate width 在 WebKit 中以无效宽度开始
  • #7157: 动画回调显示元素仍然为“:animated”
  • #8387: 使用 WebKit 中的内联和内联块元素时,hide/show 问题导致闪烁
  • #8627: .animate() 在 IE 中对 letterSpacing 失败(1.5.1 中的回归)
  • #8892: 在 clone() 之后调用 appendTo() 和类似方法返回错误的 jQuery 集合
  • #9217:在动画完成前移除元素时,IE8 中出现 javascript 错误
  • #9505: 在 WebKit 中混合百分比和像素时出现 animate() 问题
  • #11635: 动画期间显式 overflow:auto 被内联 overflow:hidden 覆盖
  • #11755: animate 及其别名不应使用 :hidden 选择器
  • #11797:新的动画相关事件
  • #11854: 百分比动画跳转到结束
  • #11971:在 IE8 中动画 background-position 失败
  • #11999:在 Chrome 中对固定 div 进行增量动画时,执行减法而不是加法。
  • #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:鼠标进入事件在禁用的输入元素上无法触发
  • #11500: 错误:手动触发 IE7 和 IE8 中的“change”事件处理程序未执行
  • #11621: 在 document 上触发事件不会冒泡到 window
  • #11718: 弃用 .data() 事件
  • #11719: 弃用 .bind("ready") 事件
  • #11731: 弃用“hover”伪事件
  • #11733: 弃用 .load()、.unload() 和 .error() 方法
  • #11764:允许在禁用的元素上委托非原生事件
  • #11786: 弃用 .toggle( handler, handler, … ) 签名

操作

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

Offset

  • #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 引入的回归/BC 破坏
  • #10074:链式调用两个 [] 选择器并使用 :first 不起作用
  • #10499::nth-child() 在 :has() 内部被视为在外部
  • #10570:当页面上有跨域 iframe 时,:text 选择器在 IE7 中会抛出错误
  • #10697:Sizzle 重构
  • #10799:带有 [name="name"] 选择器的结果不一致(也破坏 .has)

jQuery 1.8 Beta 2 发布

发布于 作者

在 jQuery Central,过去几周一直很疯狂,发布了 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 的帮助下,我们发现了一些错误并修复了它们。我们不能过分强调从那里获得反馈的重要性,因为您测试这些 beta 版本。我们不喜欢发布最终版本,这些版本会在您将其放入网页时导致问题,而防止这种情况发生的方法是使用 beta 进行测试,并提前告知我们问题。

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

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

除了 Beta 1 中报告的错误修复外,此新 beta 还对 Sizzle 引擎进行了重大重写,以提高性能。它修复了与 IE 6、7 和 8 相关的许多错误,并使这些浏览器更一致地使用。与 oldIE 的完美将永远是一种难以捉摸的事情,但我们仍在努力使您的开发生活尽可能轻松,无论使用什么浏览器。

如果您按照 Github 上的 README 文件 中描述的那样构建自己的自定义版本,现在可以选择排除未来版本中将被删除的一些已弃用功能。我们将根据隔离其他已弃用功能时添加此文件。

以下是自 jQuery 1.7.2 以来所有更改的完整列表。

jQuery 1.8b2 变更日志

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

Ajax

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

属性

  • #5571:允许在将未定义的值传递给 jQuery 中的任何 setter 时进行链式调用
  • #10828:attr("coords") 在 IE7 中返回 undefined
  • #10870:$.removeAttr("selected") 的行为不正确
  • #11316:考虑首先按元素类型,然后按 nodeName 查找 valHooks

构建

  • #10692:配置 jshint 选项以更准确地匹配风格指南
  • #10693:将单元测试中“在 iframe 中测试某些内容”的代码通用化
  • #10901:单元测试不应需要互联网访问
  • #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:十六进制格式的数据-* 属性解析不正确

Deferred

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

Effects

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

事件

  • #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:悬停 hack 破坏了名为 "hover" 的命名空间
  • #11076:.clone(true) 丢失委托过滤器
  • #11130: jQuery.fn.on: 使用 null 选择器的映射忽略数据
  • #11145: $(document).on() 在 name="disabled" 时不起作用

操作

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

其他

  • #10952: .fired() 在 Callbacks 对象上不起作用,当它被标记为 "once" 时
  • #11257: 测试套件中缺少 PHP 时,源文件路径错误

队列

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

支持

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

Traversing

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

全新的 Sizzle

发布于 作者:

为了让你的7月4日更加火热(不客气),jQuery 团队很高兴地宣布 Sizzle,jQuery 的 CSS 选择器引擎,比以往更好、更快、更可靠!Sizzle 已经进行了大幅重写,将包含在 jQuery 1.8 的发布版本中。

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

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

在此期间,还推出了其他一些令人印象深刻的选择器引擎,包括但不限于 NWMatcher(由 Diego)、dojo.query、Slick、base2、qwery 和 YUI。虽然它们各有优点,但 NWMatcher 和 Dojo 尤其突出,是优秀的引擎。虽然两者在每次选择时并非总是最快的,但它们几乎对每个选择器都始终保持快速。我的目标是为 Sizzle 实现相同的性能水平,保留 John 和 bug 团队多年来收集的所有边缘情况错误修复,并覆盖更多由其他引擎发现或排队中的错误。现在我可以放心地说,这个目标已经实现。

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

发生了什么变化

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

一个编译的选择器函数

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

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

注意:这不会影响简单选择器(仅 ID、仅标签、仅类),因为 Sizzle 已经为这些选择器提供了快捷方式,只要可能,就会使用 getElementByIDgetElementsByTagNamegetElementsByClassName。这没有改变(除了为元素根 ID 选择器添加了一个快捷方式),并且这些仍然是最快的选择器。任何其他选择器如果可用,将通过 querySelectorAll 或通过编译器运行。

querySelectorAllmatchesSelector

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

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

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

改进的选择器验证

验证选择器是一项棘手的工作。过于严格可能会令人恼火,但过于灵活可能会产生意想不到的结果。过去,Sizzle 在不同的用例中既有过严格,也有过灵活的情况。最近的更改旨在尽可能地遵守 W3C 选择器规范,但也允许规范中没有的一些内容(例如在 :not() 伪选择器内使用复杂的选择器)。

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

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

组合器可能会变得非常复杂,但新的策略可以很好地处理这些问题。在 jQuery 1.8 beta 发布版中(以及今年的 jQuery 会议上),我声称 Sizzle 改进了对组合器的支持。虽然准确性得到了提高,但我说得太早了,幸运的是,github 上只有一位名为 Yaffle 的人指出了这一点。显然,对于非常大且深的文档,原始修订正在检查太多的元素,导致包含多个组合器的选择器出现堆栈溢出。为了保持可能的匹配,每次组合器都会按指数级增加检查的元素数量。情况很糟糕。Sizzle 现在解决了这个问题,并获得了非常令人满意的结果。

可扩展性

虽然这次重写中 Sizzle 的旧 API 大部分没有改变(除了删除不再需要的 Sizzle.filter 从私有 API 中),但有一些更改使 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 暴露出来,以便你可以缓存选择器,然后再使用它们。虽然不进行缓存的编译仍然很快,但你可以确保在运行选择之前跳过该步骤。使用选择器和上下文调用 compile

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

并将其添加到缓存中。你甚至可以通过设置 Sizzle.selectors.cacheLength 来增加/减少缓存大小。

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

获取代码!

代码现在可以在 jQuerySizzle 的 git 版本中获得。预计 jQuery 1.8 将在本月发布。Sizzle 相关的 issue 可以在 GitHub 上提交,并且与 jQuery 整体相关的 issue 始终可以在我们的 bug tracker 上提交。自己尝试一下,并告诉我们你是否遇到任何问题。享受并祝你独立日快乐!

jQuery 1.9 和 2.0 — TL;DR 版本

发布于 作者:

看来很多人对 上一篇帖子 提出了问题和误解,所以让我们尝试一种简短的问答形式来回答那里留下的一些评论。

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

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

当 jQuery 2.1 发布并添加 API 时,jQuery 1.9 会支持它们吗? 我们可以借用你的水晶球吗?jQuery 2.1 可能要到 2014 年才会发布,所以很难说 2012 年年中我们坐在这里时 jQuery 2.1 会是什么样子。我们的总体目标是保持 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! 听起来像某种人权侵犯。哦,而且那不是一个问题。