Обновление на версию 3.х

В первую очередь данное обновление коснулось старых версий браузеров, точнее, теперь поддерживаются следующие версии:

  • Internet Explorer 9+

  • Chrome, Edge, Firefox и Safari — благодаря встроенной системе обновлений в эти браузеры поддерживается текущая и предыдущая версии браузеров

  • Opera — в фаворитах не ходит, поэтому поддерживают только текущую версию

  • Safari Mobile iOS 7+

  • Android 4+

Кроме этого, было внесено много изменений, которые ломают обратную совместимость с предыдущими версиями. Все их перечислять не буду, остановлюсь на тех, с которыми уже пришлось столкнуться.

Большинство приведенных изменений касается не только версии 3.x, но и старых веток, начиная с версий 1.12.x и 2.2.x

AJAX

  • Метод jQuery.ajax() теперь совместим с Promise и вы можете использовать методы then() и catch():

    $.ajax({url:"/get-my-page.html" /* и т.д. */ })
     .then(function() { /* всё ОК */ })
     .catch(function() { /* ошибка */ })
  • Добавлена новая сигнатура для вызова двух AJAX-методов $.get(settings) и $.post(settings), теперь настройки совместимы с $.ajax(settings).

  • При подключении скриптов из другого домена теперь в обязательном порядке требует указания dataType: "script"

  • При выполнении AJAX-запросов и указании URL с хэшем последний более не обрезается, а отправляется на сервер как есть.

Атрибуты

  • Раньше метод removeAttr() для true/false атрибутов типа «checked», «selected» и «readonly» втихую выставлял соответствующее свойство DOM-элемента в «false», теперь извольте делать сие ручками:

    $("input[type=email]").removeAttr("readonly").prop("readonly", false)
  • Если вызовете метод val() для мультиселекта, в котором ничего не выбрано, то получите в ответ пустой массив, а раньше был null

  • Для SVG заработали методы по манипуляции с классами (хотя полноценной поддержки SVG в jQuery нет).

Core

  • Ядро jQuery теперь запускается в strict mode.

  • Обработчики события document-ready теперь запускаются асинхронно, т.е. если какой-то обработчик сфейлил, то это не повлияет на запуск других обработчиков.

  • Метод $.isNumeric() более не пробует кастовать метод toString() для произвольных объектов (кому это надо было?).

  • Методы width(), height() и так далее; раньше, вызвав их для пустой коллекции объектов, мы получали null, теперь – undefined.

  • Официально добавлен promise jQuery.ready, который очень удобно заюзать вместе с $.when():

    $.when($.ready, $.getScript("script.js") )
     .then(function() {
       // документ готов, и скрипт script.js подгружен
     })
     .catch( function() {
       // ошибка
     });
  • Метод jQuery.unique() переименован в jQuery.uniqueSort()

  • Метод jQuery.parseJSON() устарел, переходите на JSON.parse()

  • Внутреннее хранилище данных перешло на camelCase, это важно для тех, кто использовал его, не прибегая к методу data()

Объект Deferred

Как я уже упоминал ранее, объект Deferred теперь совместим с Promise из ES-2015, а это нам грозит переписыванием методов done() на then() и fail() на catch().

Второй важный момент — callback-функции, согласно спецификации ES-2015, должны принимать только один аргумент: для успешного выполнения это некий результат выполнения, в случае возникновения ошибки функция это будет сама ошибка. Если у вас не получается так сделать, то старые функции done() и fail() всё ещё остаются с нами, хоть чую, и их скоро выпилят:

// было
$.get("/get-my-page.html")
 .done(function(data, textStatus, jqXHR) { /* всё ОК */ })
 .fail(function(jqXHR, textStatus, errorThrown) { /* ошибка */ });

// стало
$.get("/get-my-page.html")
 .then(function(data) { /* всё ОК */ })
 .catch(function(error) { /* ошибка */ });

Размеры

Небольшие изменения постигли функции width(), height(), css("width"), и css("height"), теперь они могут возвращать не только integer значение высоты и ширины, но и float, такая точность связана с переходом на использование getBoundingClientRect().

Ещё момент, вызовы $(window).outerWidth() и $(window).outerHeight() теперь будут включать в себя размеры скролбаров окна.

Эффекты

Анимация переехала на использование requestAnimationFrame API, так что теперь всё стало быстрее и красивее.

Функции .show(), .hide() и .toggle() научились запоминать предыдущее состояние CSS-свойства display.

Количество аргументов easing-функций сократили до одного аргумента, который содержит прогресс анимации от 0 до 1.

События

Удалены shorthand-методы для следующих событий: load(), unload() и error(); связано данное изменение с конфликтами возникающие при использовании данных методов, так что переписывайте на on():

// было
$("img").load(fn);

// стало
$("img").on("load", fn);

Удалено синтетическое событие ready, так что on("ready", fn) более не работает, используйте синтаксис $(fn).

Делегированные события, в случае, если их пытаются повесить c использованием неправильных селекторов, теперь будут сразу ругаться и выбрасывать ошибку. Дебажить станет легче:

// пример сломанного селектора div:not
$("body").on("click", "div:not", e => false);

Селекторы

За селекторы :hidden и :visible теперь отвечает getClientRects(); если у запрашиваемого элемента есть layout box, значит, он считается видимым. Как результат, пустой <span> или <br/> теперь считаются видимыми.

Кривые селекторы $("#") и find("#") теперь будут вызывать ошибку.

Описал многое, но не всё, полное руководство доступно на официальном сайте:

Last updated