Pull to refresh

Релиз jQuery 1.8

Reading time 11 min
Views 13K
Original author: dmethvin
(Опубликовано на сайте разработчиков 9 августа 2012)
Август стал немного жарче из-за того что зарелизилась библиотека jQuery 1.8! Вы можете брать код из CDN на сайте jQuery:

  code.jquery.com/jquery-1.8.0.min.js (минфицированный и сжатый код — для рабочих версий сайтов)
  code.jquery.com/jquery-1.8.0.js (несжатая библиотека, для отладки)

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

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

Если вы найдёте ошибку, пожалуйста, создайте тест на 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).

Мы признательны членам команды команды и сообщества, внёсших основной вклад в течение цикла разработки jQuery 1.8: Энди Monat, Роберт Катич, Joaoh Бруни, Sindre Sorhus Олег Gaidarenko, Иегуда Кац, Тимо Tijhof Доминик Д. Гейер Скотт Гонсалес, Йорн Zaefferer, Мэтт Фармер, Trey Hunner, Джейсон Луны, Бен Alman, Джеффри Для Крис Борхерса, Даниил Герман, Владимир Журавлев, Яков Торнтон, Чад Killingsworth, Nowres Рафид, Дэвид Беньямин, Ури Гилад, Крис Фолкнер, Илия Manor, и Даниэль Чатфилд.

Мы очень благодарны тем, кто нашел время, чтобы сообщить об ошибках. Однако, мы не можем исправить ошибку, если не воспроизводим её. Если вы ищете простой способ внести ​​вклад в jQuery, посмотрите на ошибки трекера и помогите нам, создав наглядные регрессионные тесты. Как только мы можем воспроизвести проблему, решение обычно следует быстро. Эти тесты станут основанием для модульного тестирования, которые предотвратят ошибки в будущем для кода, не меняющегося в следующих редакциях.

Журнал изменений: #

(Список багов и задач составлен неоднозначно: в заголовках не указано, то ли это свойство, от которого избавились (таких %80), то ли решённая задача на получение нового свойства. Составлен разными людьми в разное время, поэтому нет одинаковой терминологии в описании. По заголовку бага обо всём нужно догадываться самостоятельно, но в 98% случаев это не составляет проблем. Перевод может ухудшить понимание, поэтому пара пунктов оставлена без перевода. Однако, это — практически полный список изменений в библиотеке, чтение которого создаст представление о них. — прим.перев.)

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: анимирование ширины начинается с неправильной ширины в webkit
  •  #7157: callback-функция в анимации показывает элемент всё ешё как ":animated"
  •  #8387: при hide/show в webkit для inline- и inline-block-элементов — проблемы с мерцанием
  •  #8627: .animate() не работает при letterSpacing в IE (в версиях 1.5.1+)
  •  #8892: коллбеки срабатывают раньше при fadeIn() и jQuery.fx.off = true
  •  #9217: ошибка JS в IE8: при анимации элемент удаляется до окончания анимации
  •  #9505: animate() — проблемы при смешивании процентов и пикселов в WebKit
  • #11635: Явно указанное свойство overflow:auto переопределяется inline-кодом overflow:hidden при анимации
  • #11755: анимация и её фактические аналоги не должны использовать селектор :hidden
  • #11797: Новая анимация связанных событий
  • #11854: анимация по процентным значениям перескасивает на своё окончание
  • #11971: анимация по background-position не работает IE8
  • #11999: анимация на приращение для блока с position:fixed выполняет вычитание вместо прибавления в Chrome
  • #12117: overflow:hidden неправильно работает при анимации с нулевой высотой или шириной
  • #12138: fadeOut не работает в Chrome на базовых элементах SVG
  • #12150:** свойство border-spacing увеличивается, когда ряды ячеек открываются и скрываются

События


  •  #8545: Утечки при событиях в IE
  • #10067: Появление $.ready при document.readyState === 'interactive' сверх обычного
  • #10895: Хак IE doScrollCheck в bindReady без причин замедляет скорость ie7
  • #11101:* _Не рекомендуется_ события с признаком «exclusive» от метода trigger()
  • #11315: Проблемы с delegate() and :first во вложенных элементах с одинаковыми классами
  • #11328: Клавиша Ctrl не устанавливает event.metaKey в true в Windows
  • #11382: mouseenter не создаётся на теге input с disabled
  • #11500: Баг: обработчик "change" не выполняется при ручном запуске в IE7/8
  • #11621: Запуск события на document не всплывает к window
  • #11718:* _Не рекомендуется_ событие .data()
  • #11719:* _Не рекомендуется_ событие .bind(«ready») event
  • #11731:* _Не рекомендуется_ псевдо-событие "hover"
  • #11733:* _Не рекомендуются_ методы .load(), .unload(), и .error()
  • #11764: Allow delegated non-native events on disabled elements
  • #11786:* _Не рекомендуются_ параметры (сигнатура) .toggle( handler, handler, … )
  • #12203: .undelegate() без аргументов отвязывает все обработчики родительского элемента

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


  •  #8894: appendTo() и похожие методы, вызванные после clone(), возвращают неправильный набор элементов в IE
  • #10324: clone() не копирует innerHTML тега object в IE9
  • #11231: Append, Prepend, After, Before должны принимать массив в первом аргументе
  • #11325: Улучшение domManip/buildFragment/clean
  • #11338: Несовместимое поведение с .replaceWith() и отключёнными узлами
  • #11528: ошибка сериализации в ie8 с .html(), включающим теги html5
  • #11566: node.append и похожие не работают, когда узел — DocumentFragment
  • #11617: определить метод $.parseHTML для создания HTML fragments
  • #11809: Утечки памяти в сеттере .text(val) (?)
  • #11898: prevAll() со сложным селектором:not() возвращает результаты в неправильном порядке
  • #12132: баг IE10 при клонировании элементов, не имеющих parentNode

метод 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: Regression/BC break from #6963
  • #10074: Сцепление 2 квадратно-скобочных селекторов [] с :first не работает
  • #10499: :nth-child() внутри :has() рассматривается, как если бы он был за его пределами
  • #10570: :text даёт ошибку в IE7, если на странице есть кроссдоменный iframe
  • #10697: Реконструкция Sizzle
  • #10799: Противоречивые результаты селекторов [name=«name»] (также портится .has)
  • #10809: неправильный тест с использованием ".activeElement" в :focus
  • #11109: Sizzle: относительные выражения обрезаются преждевременно
  • #11120: Ломаются закладки (табы) при некоторых селекторах в IE7
  • #11814: стратегия Sizzle element-rooted QSA (например, присоединение временных id) не учитывает запятой и других разделителей
  • #11826: Исследовать проанализированную систему кеширования для matchesSelector c Sizzle
  • #11902: баг при :not + :contains селекторах
  • #11918: проблемы с селектором :eq при использовании с именем тега, содержащего ':'
  • #11959:** Поддержка селектора :active
  • #11961: «Превышение максимального размера стека» при jQuery...is()
  • #11966:** селектор потомков
  • #11969: Нет проверки на null при поиске в соседних элементах (siblings)
  • #12054: «Uncaught TypeError»: Объект #<HTMLDocument> не имеет метода 'getAttribute'
  • #12057: Sizzle Regression
  • #12082: .find() POS селектор не работает с версии 1.8b2
  • #12153: Error occurs в селекторах

свойство .support


  •  #9385:* _Не рекомендуется_ jQuery.browser
  • #11163: jQuery.support.checkClone всегда true
  • #11249: CSP error в Chrome 18 при загрузке jQuery 1.7.1
  • #11439: jQuery.support.parentNode используется, но больше не будет определяться
  • #11721:* _Не рекомендуется_ и убраны внутренние использования jQuery.support.boxModel
  • #11757: Утечка памяти в фреймах в IE8 в jQuery 1.7.2+
  • #11766: jQuery.support назначен статус «нестабильно»

Перемещения


  •  #9800: Новый метод .addBack (вместо .andSelf)
  • #11539: Все версии jQuery не поддерживают .has() в $(<текстовый_элемент >.parentNode) .has(другой_элемент)
  • #11543: .has() не работает на отсоединённых от DOM элеметах
  • #11706: .has() не срабатывает на document fragments
  • #11738: Удалён .closest(Array), возвращающий Array


*) не рекомендованное (deprecated) использование методов и свойств;
**) реализация новых возможностей или устранение значительных багов (--пометки перев.).

Доп. QA (от перев. из комментариев)


Q: как скачать не полную библиотеку, а выбрать ее части?
A: github.com/jquery/jquery#how-to-build-your-own-jquery leshaogonkov

To create a custom build, use the following special grunt commands:
Exclude ajax:
grunt custom:-ajax

Exclude css:
grunt custom:-css

Exclude deprecated:
grunt custom:-deprecated

Exclude dimensions:
grunt custom:-dimensions

Exclude effects:
grunt custom:-effects

Exclude offset:
grunt custom:-offset

Exclude all optional modules:
grunt custom:-ajax,-css,-deprecated,-dimensions,-effects,-offset

Note: dependencies will be handled internally, by the build process.
Tags:
Hubs:
+78
Comments 28
Comments Comments 28

Articles