jquery 1.8

9 Августа вышел релиз jQuery версии 1.8. Подробнее в полной новости.

Как обычно, Google и Microsoft CDNs будут тоже раздавать эти файлы, но пока не известно когда. Если очень хочется, воспользуйтесь нашей копией из JQuery CDN.

Мы не ждем от вас сообщения об ошибках в релиз-версии, так как было несколько бета-версий и релиз-кандидат; у вас было много возможностей для тщательного тестирования (ха-ха, шутка). Мы знаем, что слишком многие из вас ждали финального релиза. Так что теперь нет никаких оснований ждать, и вы можете узнать, нет ли ошибок, о которых сообщалось ранее в багрепортах.


Если вы найдёте ошибку, пожалуйста, создайте тест на jsFiddle или jsbin и отправьте отчет об ошибке в наш багтрекер. Если вы не уверены, что нашли ошибку — приглашаем на наш форум. Ядро JQuery 1.8.0 совместимо с последними версиями JQuery UI (1.8.22) и JQuery Mobile (1.1.1). Не забудьте обновить их, если вы сообщаете ошибки на страницах, которые связаны с ними.

Быстрый обзор JQuery 1.8

Перечислим важные изменения в этом релизе:

Рефакторинг Sizzle. Селекторы в JQuery стали ещё быстрее благодаря переписыванию кода Тимми Виллисоном (в действительности, два автора). Конечно, большинство браузеров имеют querySelectorAll, но почти каждая реализация кое-где отстает по скорости и имеет кроссбраузерные особенности. Sizzle все упрощает. К тому же, вы можете пользоваться селекторами типа :has() со сложным селектором или :contains(). Ах да, IE6/7 всё ещё поддерживаются.
Перерисована анимация. Со временем код анимации в JQuery стал довольно беспорядочным. Кори Франг (Corey Frang) с головой погрузился в это болото и прикончил почти всех аллигаторов, ну, то есть ошибки. Большинство изменений не очевидны, интерфейс не затрагивают, поэтому прежние анимации должны работать (и работать лучше). Но есть и некоторые отличные доработки, делающие анимацию мощнее и расширяемее. Одна из заметных и полезных функций — использование progress callbacks в Promises. Мы все еще работаем над подробной документацией, но у нас есть предварительный проект. И пример нового кода в действии: jsbin.com/odocid/1/edit.

Автоматическая префиксация CSS. При использовании свойства CSS — .css() или .animate(), мы делаем в стилях браузера при необходимости правильный префикс. Например, возьмем .css(«user-select», «none»). В Chrome / Safari установим значение "-webkit-user-select", в Firefox — "-moz-user-select", а ИЕ10 будет использовать "-ms-user-select".

Более гибкий $(HTML, свойства). В JQuery 1.8 вы можете использовать любой метод или плагин для объектов из $(html, props). Раньше допускался краткий список методов, и не было его документирования. Теперь такой список не нужен! Но имейте в виду, что это может привести к другому поведению вашего кода, если плагин будет добавлен позже и имеет то же имя, что и атрибуты HTML.

Закрыто более 160 багов. В частности, переписывание Sizzle и анимаций дало толчок к исправлению нескольких старых ошибок, некоторым из которых уже 2-3 года. Майк Шеров (Mike Sherov) решил большинство ошибок CSS и позиционирования и свёл их почти к нулю. Кроме того, мы не отказались от своей линии устранения раздражающих различий между IE 6/7/8 и современными браузерами, так что вам не придется иметь дело с ними.

Меньший объём кода. Несмотря на все рефакторинги, новые функции и устранения ошибок, сжатый файл JQuery 1.8 стал на несколько сот байт меньше, чем в версии 1.7.2. Сокращение размера не было самоцелью в этой версии, но мы чувствовали, что важно следить за ростом объёма кода, и это дало плоды. Большое спасибо Ричарду Гибсону, контролирующему размер кода по всему проекту.

Модульность: Если вы хорошо знаете JQuery-зависимости своего проекта, можно использовать новую grunt-систему, чтобы вырезать часть JQuery, которая точно не понадобится. То, что мы сделали сейчас на 1.8 — в действительности, только начало; всё еще гибче в следующих версиях.

Полный список изменений приведён ниже, на случай, если вам будет интересно, устранена ли ваша любимая ошибка.

Что было удалено

Короткий ответ: «очень мало». Мы хотели бы предоставить полный список уведомлений об устаревших функциях, которые будут удалены в 1.9, чтобы дать время для адаптации кода. Некоторые из вещей, удаленных в 1.8 — недокументированные внутренние функции, которые некоторыми успешно использовались через реверс-инжиниринг, но это всегда рискованно — использовать недокументированные функции. Вот что удалено:

$(element).data(“events”). В версии 1.6 JQuery стала отделять свои внутренние данные от данных пользователя, для предотвращения конфликта имен. Тем не менее, некоторые люди используют недокументированные внутренние «события» структуры данных, поэтому мы давали возможность всё ещё получать их, через .data(). Это сейчас отменяется в 1.8, но вы все еще можете получить данные к событиям для отладки с помощью $._data(element, «events»). Заметим, что это не поддерживается открытым интерфейсом — фактическая структура данных может быть несовместимой от версии к версии.

Deferred.isResolved() и Deferred.isRejected(). Вызывать N-1 методов, возвращающих Boolean, чтобы получить состояние N-й переменной становилось немного глупо, поэтому мы добавили Deferred.state() в JQuery 1.7, чтобы сказать вам состояние за один вызов. Таким образом, эти два старых метода больше не нужны. Это намного удобнее для отладки сценариев, в которых часто хотят знать состояние Deferred в виде строки.

$(element).closest(Array), возвращающий Array. Это было странной особенностью метода .closest(), нужной для устаревшего .live(), но насколько мы знаем, не использовавшейся другим кодом. Сейчас, как и везде, .closest() будет возвращать объект JQuery.

$.CurCSS. Этот метод был просто псевдонимом для jQuery.css(), начиная с JQuery 1.3. Хотя свойство никогда не было частью документации API, некоторые его использовали. Теперь его больше нет.

$.AttrFn: Еще одно недокументированное свойство, используется для определения, какие методы могут быть использованы в сочетании с $(html, props). Хотя это не работает в JQuery 1.8, мы оставляем пустыми $.attrFn в JQuery, чтобы избежать ошибок в коде, который его использует. Внимание: Это будет полностью удалено в JQuery 1.9, поэтому обновляйте свой код!

Участники

Этот релиз не мог произойти без напряженной работы талантливой команды Основные участники разработки JQuery: Джулиан Aubourg (jaubourg), Кори Frang (gnarf), Ричард Гибсон (gibson042), Майк Шеров (mikesherov), Рик Уолдрон (rwaldron), и Тимми Willison (timmywil).

Журнал изменений: blog.jquery.com/2012/08/09/jquery-1-8-released/

Ajax

  • #8205: случайный результат JSONP вызывает утечку памяти в IE8
  • #8653: jQuery.param выводит "null" и "undefined" в строке запроса
  • #9399: jqXHR.success и jqXHR.error _не рекомендуются_
  • #10285: замена evalScript -> cleanScript (?) не работает в IE8
  • #10524: jQuery.fn.load не объединяет параметр data c jQuery.ajaxSetup
  • #10944: $.ajax не всегда возвращает объект, реализующий интерфейс Promise
  • #11013: _не рекомендуется_ использование Deferred/Promise с синхронным $.ajax
  • #11402: функция evalScript завершается с ошибкой 80020101 в IE
  • #11743: JQuery молча игнорирует ошибки в теге <script> при Ajax-запросе в $.appendTo()
  • #11778: кэшированные XHR-запросов всегда выполняются асинхронно
  • #12122: асинхронный jQuery.ajax() _не рекомендуется_ использовать с $.Deferred

Атрибуты

  • #11153: поведение JQuery 1.7 при нескольких переносах строки в IE 8
  • #11212: Sizzle.getText преобразует неразрывные пробелы на пробелы в IE
  • #11547: XML DOM .removeAttr() не удаляет атрибуты с изменённым регистром букв
  • #11962: Стандартизация возврата геттерами пустых значений
  • #12127: clone() некорректно копирует состояние checked в ИЕ10

Build

  • #11767: Поддержка custom build без эффектов
  • #11789: Обновление README до описания «grunt build» системы
  • #11856: модульность dimensions
  • #11857: модульность css
  • #11865: модульность offset
  • #11965: Создание deprecated.js перечисляющего максимум устаревших конструкций
  • #12059: `grunt custom` должен быть минифицирован, + добавление/удааление модулей из заголовков
  • #12158: jQuery 1.8rc1 не работает с YUICompressor 1.4.7

Ядро

  • #10657: _Не рекомендуется_ JQuery...size(), _рекомендуется_ JQuery...length
  • #11290: селектор интерпретируется как HTML
  • #11470: Добавление встроенного readyP promise
  • #12018: $(document).ready() срабатывает слишком рано в IE8
  • #12026: Позволить $(html, props) использовать любой jQuery.fn метод

Css

  • #10373: `document.defaultView` => `window`
  • #10394: jQuery.cssHooks.opacity выбрасывает исключение в не-IE браузерах
  • #10413: width, innerWidth, innerHeight, outerWidth, outerHeight неточны для "box-sizing: border-box" потомков (DOM) невидимых родителей
  • #10679: поддержка CSS3 vendor prefix
  • #11004: getWH неправильно удаляет отступы и границы, когда box-sizing есть border-box
  • #11787: удаление jQuery.curCSS
  • #12088: Webkit теперь возвращаются проценты по нескольким свойствам getComputedStyle
  • #12148: hide event не срабатывает при toggle

«data»

  • #7579: jQuery.data() обрезает числа, взятые из data-xxx атрибутов
  • #10589: удалить $.fn.data(«events»)
  • #11435: Устаревший код теста для удаления toJSON из возвращаемых значений .data

Deferred

  • #11010: Сделать Deferred.then == Deferred.pipe подобно Promise/A
  • #11011: Сделать традиционные варианты объектов для флагов $.Callbacks
  • #11736: Удаление отложенных .isResolved() и .isRejected()
  • #11749: сохранить контекст объекта, когда несколько отложенных объектов передаются в $.when()

Размеры в DOM

  • #6724: неправильное $(window).height() в Mobile Safari (iPhone)
  • #10877: Сделать сеттер для outerWidth/Height
  • #11293: Чтение width или outerWidth пустых TD изменяет ширину колонок
  • #11604: $(elem).width(-val) сменяется из отсутствич операции на $(elem).width(0)
  • #11724: $(document).height() изменилась в Firefox 12

Эффекты

  • #7109: animate width starts with invalid width on webkit
  • #7157: Animation callback shows element is still ":animated"
  • #8387: flickering problem with jQuery 1.5 hide/show issue with inline and inline-block elements on webkit browsers
  • #8627: .animate() fails on letterSpacing in IE (regression in 1.5.1)
  • #8892: Callback is raised before objects are shown with fadeIn() and jQuery.fx.off = true
  • #9217: javascript error in IE8 when animating element is removed before animation finishes
  • #9505: animate() issue when mixing percentages and pixels in WebKit
  • #11635: Explicit overflow:auto is overridden by inline overflow:hidden during animation
  • #11755: animate and it aliases should not use :hidden selector
  • #11797: New animation related events
  • #11854: percentage animations jump to end
  • #11971: Animating background-position fails in IE8
  • #11999: Incremental animation on fixed div does subtraction instead of addition in Chrome.
  • #12117: overflow hidden not properly set when animating to 0 height or width
  • #12138: fadeOut doesn't work in Chrome on basic SVG elements
  • #12150: border-spacing property accumulates when rows are shown and hidden

События

  • #8545: Leak with events in IE
  • #10067: Firing $.ready on document.readyState === 'interactive' too
  • #10895: The doScrollCheck ie hack in bindReady degrades ie7 performance for no reason whatsoever
  • #11101: Deprecate «exclusive» events option from trigger method
  • #11315: Problems with delegate() and :first in nested elements with equivalent classes
  • #11328: Ctrl key doesn't set event.metaKey to true on Windows
  • #11382: Mouseenter doesn't fire on a disabled input element
  • #11500: Bug: «change» event handler not executed when triggered manually on IE7 & IE8
  • #11621: Triggering a event on document doesn't bubble to window
  • #11718: Deprecate .data() events
  • #11719: Deprecate .bind(«ready») event
  • #11731: Deprecate «hover» pseudo-event
  • #11733: Deprecate .load(), .unload(), and .error() methods
  • #11764: Allow delegated non-native events on disabled elements
  • #11786: Deprecate .toggle( handler, handler, … ) signature
  • #12203: .undelegate() with no arguments unbinds all handlers from the parent element

Манипуляции (в DOM)

  • #8894: appendTo() and alike methods called after clone() returns incorrect jQuery set in IE
  • #10324: Clone does not copy innerHTML of object element in IE9
  • #11231: Append, Prepend, After, Before should accept an array as first argument
  • #11325: Improve domManip/buildFragment/clean
  • #11338: Inconsistent behavior with .replaceWith() and disconnected nodes.
  • #11528: ie8 serialization bug with .html() also hitting html5 tags
  • #11566: node.append et al. does not work when node is a DocumentFragment
  • #11617: Define a $.parseHTML method for creating HTML fragments
  • #11809: Memory leak in .text(val) setter?
  • #11898: prevAll() with a complicated :not() selector returns results in wrong order
  • #12132: IE10 bug when cloning an object element without a parentNode

Offset

  • #10996: Simplify offset()
  • #11823: Remove webkitConvertPointFromNodeToPage

Селекторы

  • #3778: selector matching issues
  • #5568: Selectors behave differently with comments tags on FF/IE
  • #7596: xpath selector attribute name with brackets [] fails
  • #8473: In IE9rc *[tabIndex] select all elements without tabindex also
  • #8906: .(prevAll('span:has(input,select,textarea)')
  • #9400: Deprecate :text, :radio, :checkbox, etc. selector extensions
  • #9810: Rewrite Positional Selector Logic
  • #10003: Regression/BC break from #6963
  • #10074: Chaining two [] selector with :first not working
  • #10499: :nth-child() inside :has() treated as if outside it
  • #10570: :text selector throws an error in IE7 when there is a cross domain iframe on the page
  • #10697: Sizzle revamp
  • #10799: Inconsistent results with [name=«name»] selectors (also breaks .has)
  • #10809: incorrect test using ".activeElement" in the :focus pseudo-class resolver
  • #11109: Sizzle: Expr.relative truncates prematurely
  • #11120: Tabs in some selectors break in IE7
  • #11814: Sizzle's element-rooted QSA strategy (i.e. attaching a temporary id) does not account for comma and other other selector divisions
  • #11826: Explore a parsed caching system for matchesSelector within Sizzle
  • #11902: :not + :contains selectors
  • #11918: :eq selector problem when using tag name with ':'
  • #11959: Add support for :active selector
  • #11961: «Maximum call stack size exceeded» when using jQuery#is
  • #11966: descendant selector
  • #11969: Missing null check when gathering siblings
  • #12054: Uncaught TypeError: Object #<HTMLDocument> has no method 'getAttribute'
  • #12057: Sizzle Regression
  • #12082: .find() POS selector no longer working in 1.8b2
  • #12153: Error occurs in the selector

Support

  • #9385: Deprecate jQuery.browser
  • #11163: jQuery.support.checkClone always true
  • #11249: CSP error in Chrome 18 when loading jQuery 1.7.1
  • #11439: jQuery.support.parentNode used, but not defined any more.
  • #11721: deprecate and remove internal uses of jQuery.support.boxModel
  • #11757: IE 8 memory accumulation in iframes with jQuery 1.7.2
  • #11766: Move jQuery.support to «unstable» status

Traversing

  • #9800: New method: .addBack (supersedes .andSelf)
  • #11539: All version of jQuery don't support .has() on $([text Element].parentNode).has?(other_element)
  • #11543: .has doesn't work on detached elements
  • #11706: `.has()` fails on document fragments
  • #11738: Remove .closest(Array) returning Array

Источник: http://habrahabr.ru/post/149403/ | http://blog.jquery.com/2012/08/09/jquery-1-8-released/