У jQuery новый релиз! Прошло некоторое время с момента нашего последнего выпуска, но мы ожидаем, что это будет последним второстепенным выпуском в ветке 3.x, а затем мы перейдем к пересмотру, который будет jQuery 4.0. Но прежде чем перейти к 4.0, мы рады поделиться с вами исправлениями ошибок и улучшениями, включенными в jQuery 3.4.0. Вот некоторые из основных моментов:
Содержание статьи
Улучшение производительности в .width
и .height
При получении и настройке размеров были определенные случаи, когда это могло вызывать смещение макета, что в основном означает, что браузер вычислял макет больше времени, чем необходимо. Мы исправили это во всех браузерах, кроме IE, где этого нельзя избежать.
Поддержка
nonce
и nomodule
Для поддержки добавления элементов сценария с помощью таких методов, как .html и .append, jQuery разделяет их и добавляет новые теги сценария для загрузки и выполнения удаленного содержимого. В ходе этого процесса такие атрибуты, как nonce
и nomodule
были проигнорированы, но теперь jQuery 3.4.0 висит на них.
Радиоэлементы: ожидаемое состояние в обработчиках событий
Мы уже исправили ту же проблему с флажками, но случайно пропустили радиовходы. В следующем примере true
было зарегистрировано при первом щелчке элемента. Мы исправили это так, что свойство checked
обновляется перед выполнением обработчика событий.
Пример
var $ radios = jQuery (". Example");
var $ firstRadio = $ radios.first ();
var firstCheckedState = $ firstRadio.prop ("флажок");
$ radio.on ("click", function () {
// верно в <3.4.0
console.log ($ firstRadio.prop ("флажок") === firstCheckedState);
});
$ Radios.eq (1) .click ();
Незначительное исправление уязвимости: загрязнение Object.prototype
jQuery 3.4.0 включает исправление некоторых непреднамеренных действий при использовании jQuery.extend (true, {}, ...)
. Если неанизированный исходный объект содержит перечисляемое свойство __ proto __
он может расширить собственный Object.prototype. Это исправление включено в jQuery 3.4.0, но существуют различные исправления для исправления предыдущих версий jQuery.
Пример
jQuery.extend (true, {},
JSON.parse ('{"__ proto__": {"test": true}}')
);
console.log ("тест" в {}); // истина
Обратите внимание, что, хотя jQuery делает все возможное для защиты пользователей от уязвимостей в безопасности, jQuery — это библиотека манипулирования DOM, которая, как правило, выполняет то, что вы говорите. В этом случае поведение, скорее всего, было неожиданным, поэтому jQuery.extend
больше не будет писать никаких свойств с именем __ proto __
. Но такие средства защиты, как этот, не являются заменой передовых методов обеспечения безопасности, таких как очистка ввода данных пользователем.
Устаревшие позиционные селекторы и закат Sizzle
Основной API jQuery — выбрать что-то, а затем сделать что-то с выбранным. Sizzle, селекторный движок в jQuery, обрабатывает первую половину. Это был быстрый и эффективный небольшой движок, который проложил путь к собственным API селектора, таким как querySelectorAll
и дополнительным собственным селекторам JavaScript и CSS. Теперь, когда многие из этих селекторов попали в современные браузеры, пришло время попрощаться с Sizzle. Но чтобы удалить Sizzle в jQuery 4.0, нам также нужно удалить то, что мы называем позиционными селекторами, которые являются нестандартными селекторами.
В частности, jQuery 3.4.0 устарел : первый
: последний
: eq
: даже
[1945901] : odd : lt
: gt
и : nth
. Когда мы удалим Sizzle, мы заменим его небольшой оболочкой вокруг querySelectorAll
и было бы почти невозможно переопределить эти селекторы без большего механизма селектора.
Мы думаем, что этот компромисс стоит того. Имейте в виду, что мы все еще будем поддерживать позиционные методы, такие как .first
.last
и .eq
. Все, что вы можете делать с позиционными селекторами, вы можете делать с позиционными методами. В любом случае, они работают лучше.
Обновление
При обновлении с jQuery 3.0+ не должно быть проблем с совместимостью. Если вы еще не обновились до jQuery 3+, ознакомьтесь с Руководством по обновлению до 3.0. Плагин jQuery Migrate 3.0 поможет вам выявить проблемы совместимости в вашем коде.
Пожалуйста, попробуйте этот новый выпуск и сообщите нам о любых проблемах, с которыми вы столкнулись.
Скачать
Вы можете получить файлы из CDN jQuery или напрямую связаться с ними:
https://code.jquery.com/jquery-3.4.0.js
https://code.jquery.com/jquery-3.4.0.min.js
Вы также можете получить этот выпуск с npm:
npm install jquery@3.4.0
Стройное телосложение
Иногда вам не нужен ajax, или вы предпочитаете использовать одну из множества автономных библиотек, которые фокусируются на запросах ajax. И часто для веб-анимации проще использовать комбинацию CSS и манипуляции с классами. Наряду с обычной версией jQuery, которая включает в себя модули AJAX и эффектов, мы выпустили «тонкую» версию, которая исключает эти модули. В настоящее время размер jQuery очень редко влияет на производительность при загрузке, но компактная сборка примерно на 6 тыс. Байт сжата по сравнению с обычной версией. Эти файлы также доступны в пакете npm и в CDN:
https://code.jquery.com/jquery-3.4.0.slim.js
https://code.jquery.com/jquery-3.4.0.slim.min.js
Эти обновления уже доступны в виде текущих версий для npm и Bower. Информация обо всех способах получения jQuery доступна по адресу https://jquery.com/download/. Публичные CDN получают свои копии сегодня, пожалуйста, дайте им несколько дней, чтобы опубликовать файлы. Если вам не терпится быстро начать работу, используйте файлы на нашем CDN, пока они не обновятся.
Спасибо
Спасибо всем, кто участвовал в этом выпуске, предоставив исправления, сообщив об ошибках или протестировав, включая abnud1, Джейсона Бедарда, buddh4, Криса Борхерса, Андрея Фангли, Олега Гайдаренко, Ричарда Гибсона, Михала Голебиовского-Овчарека, Марью Хельтта, Дейв Метвин, Эд С., Луис Эмилио Веласко Санчес, Саптак Сенгупта, tmybr11, Берт Чжан и вся команда jQuery.
Изменения
Журнал изменений GitHub: Проблемы, исправленные в 3.4.0 | Все изменения
Аякс
Ядро
- Использование isAttached для проверки прикрепления элемента (662083ed)
- Крошечное исправление эффективности в jQuery.extend / jQuery.fn.extend (# 4246) (# 4245, 4ffb1df8)
- Сохранение одноразового номера CSP в сценариях с атрибутом src в манипуляции DOM (# 4323, 00504037)
- Сохранение одноразового номера CSP в сценариях в манипуляции DOM (# 3541, c7c2855e)
- Поддержка передачи одноразового номера через jQuery .globalEval (# 4278, 5bdc85b8)
- Распознавание теневого DOM в проверках вложений (# 3504, 9b77def5)
- Предотвращение загрязнения Object.prototype для $ .extend (true,…) (753d591a)
CSS
- Убедитесь, что имена верблюдов и шашлыков не свернуты для CSS-переменных (f8c1e902)
- Избегайте заполнения jQuery.cssProps (# 3986, 2b5f5d5e) [поддержка
- Правильное обнаружение
- с нестандартным масштабированием (# 4029, 821bf343)
- Не добавлять автоматически «px» в переменные CSS (# 4064) (# 4063, 75b77b48)
- Пропустить добавление px логика для анимации неэлементных реквизитов (f5e36bd8)
- Избегайте принудительного перекомпоновки в получателях ширины / высоты, если в этом нет необходимости (# 4322, a0abd15b)
- Не читайте styles.position по ширине / height cssHook, если это необходимо (# 4185, 354f6036)
- Не добавлять автоматически «px» в свойства сетки CSS, возможно, не связанные с единицей (# 4007, f997241f)
Размеры
- исправлено вычисление externalWidth на SVG (# 3964, e743cbd2)
- избегать выборки boxSizing при настройке ширины / высоты — в некоторых случаях это позволяет избежать принудительного перекомпоновки (# 3991, 73d7e625)
- отступить к offsetWidth / Height для рамки в IE (# 4102, 315199c1)
Событие
- Предотвращение использования leverageNative от двойного срабатывания focusin (fe5f04de)
- Добавление свойства «code» к объекту события (# 3978, 899c56f6)
- Использование собственных событий для фокусировки / размытия / нажмите; распространять дополнительные данные (# 1741, # 3423, # 3751, # 4139, 669f720e)
- Уважать атрибут nomodule сценария при манипулировании DOM (# 4281, e4de8b46)
- Restore _evalUrl jQuery.ajax вызывает dataType: script (13de7c9e)
- Оценивать только HTTP-успешный сценарий src (# 4126, c2026b11)
Манипулирование
- Правильно определять элементы HTML с однозначными именами (# 4124, 979809c5)
Разное
- Добавить конфигурацию для lockbot (2348f399)
- Обновить пролог / эпилог лицензии, чтобы успокоить Github Checker (29e76e25)
README
- добавить значок gitter в README.md (7869f83d)
- Добавить значок состояния сканирования лицензии FOSSA (45f08588)
Селектор
Сериализация
- jQuery.param: возвращать пустую строку, если задано значение null / undefined (# 2633, 0645099e)
Обход
Внутренняя
- Сезонное обновление uglify и его параметров (09684ba3)
- Удалить ненужное исключение ESLint (dc05f3c1)
- Запустить базовый набор тестов в jsdom (0ec25abb)
- В тестах Make Promises / A + вместо стандартного используется точечный репортер (ca9356ec)
- Обновить QUnit с 1.23.1 до 2.9.2 (6ced2639)
- Запустить браузерные тесты Karma на Node.js 10 вместо 8 (16ad9889)
- Обновить jsdom; перенести тест с Polyfill Symbol в тест iframe (9cb124ed)
- Удалить устаревшие глобальные переменные из конфигурации ESLint (c10945d0)
- Обновить большинство зависимостей (8751e9ef)
- Обновить код теста для совместимость с QUnit 2.x (# 4297) (c3498187)
- Посоветуйте создать тестовые случаи на JS Bin или CodePen, сбросьте JSFiddle (da44ff39)
] Удалить ручной сброс прибора QUnit (84b6a0be)