Устаревшие и удаленные API в Chrome 54

Практически в каждой версии Chrome мы видим значительное количество обновлений и улучшений продукта, его производительности и возможностей веб-платформы. В этой статье описываются устаревшие и удалённые функции в Chrome 54, который находится в стадии бета-тестирования с 15 сентября. Этот список может быть изменён в любое время.

Отключить навигацию в обработчике выгрузки

TL;DR: Все кросс-доменные навигации будут запрещены в обработчиках событий window.onunload , чтобы привести Chrome в соответствие со спецификацией HTML, а также Firefox и Safari.

Намерение удалить | Chromestatus Tracker | Ошибка Chromium

В предыдущих версиях Chrome разрешалось прерывать навигацию между источниками внутри window.onunload , устанавливая window.location.href = '#fragment' . Согласно спецификации HTML , в обработчиках unload разрешены только внутристраничные навигации, а в предыдущих версиях Chrome другие методы навигации были заблокированы в соответствии с требованиями спецификации. Начиная с Chrome 54, такие навигации будут запрещены для соответствия требованиям спецификации, а также Firefox и Safari.

HTTP/0.9 устарел

TL;DR: HTTP/0.9 устарел. Разработчикам следует перейти на более позднюю версию, предпочтительно HTTP/2.

Намерение удалить | Chromestatus Tracker | Ошибка Chromium

HTTP/0.9 — предшественник HTTP/1.x . В нём отсутствуют многие функции его последователей. Особую проблему для современного веба представляет отсутствие заголовков ответа. Без них невозможно проверить, что ответ HTTP/0.9 действительно является ответом HTTP/0.9. Это может привести к ряду проблем. Вот некоторые из них:

  • Клиенты, которые обрабатывают определенные ответы об ошибках как допустимые ответы HTTP/0.9.
  • Серверы, которым не удается закрыть сокет запроса, заставляют клиентов обрабатывать ответы как зависший GET-запрос, который либо остается активным вечно, либо пока пользователь не уйдет со страницы, с которой был сделан запрос.
  • Серверы, которые не могут сообщить браузеру о сбое запроса, могут вызвать проблемы с эвристикой кэширования.

Единственный надёжный способ решения проблем с HTTP/0.9 — полное прекращение его поддержки. Именно поэтому поддержка HTTP/0.9 прекращена в Chrome 54.

Использование initTouchEvent удалено.

TL;DR : initTouchEvent устарел в пользу constructor TouchEvent для улучшения соответствия спецификации и будет полностью удален в Chrome 54.

Намерение удалить | Chromestatus Tracker | Ошибка Chromium

Разработчики уже давно могут создавать синтетические сенсорные события в Chrome с помощью API initTouchEvent . Они часто используются для имитации сенсорных событий, например, для тестирования или автоматизации некоторых пользовательских интерфейсов на сайте. Начиная с Chrome 49, этот устаревший API выводит следующее предупреждение.

Предупреждение о сенсорном событии
TouchEvent.initTouchEvent устарел и будет удалён в версии M53 примерно в сентябре 2016 года. Вместо него используйте конструктор TouchEvent . Подробнее см. https://www.chromestatus.com/features/5730982598541312 .

Помимо того, что это изменение не входит в спецификацию Touch Events, есть ряд причин, почему оно полезно . Реализация initTouchEvent в Chrome была совершенно несовместима с API initTouchEvent в Safari и отличалась от реализации в Firefox на Android. И наконец, конструктор TouchEvent стал гораздо проще в использовании.

По этим причинам мы решили следовать спецификации, а не поддерживать API, который не указан в спецификации и не совместим с единственной другой реализацией. Разработчикам, которым нужна альтернатива, следует использовать конструктор TouchEvent .

Поскольку реализации API initTouchEvent для iOS и Android/Chrome сильно различались, на сайтах часто встречался код примерно такого содержания (часто забывая о Firefox):

    var event = document.createEvent('TouchEvent');
    
    if(ua === 'Android') {
      event.initTouchEvent(touchItem, touchItem, touchItem, "touchstart", window,
        300, 300, 200, 200, false, false, false, false);
    } else {
      event.initTouchEvent("touchstart", false, false, window, 0, 300, 300, 200,
        200, false, false, false, false, touches, targetTouches, changedTouches, 0, 0);
    }
    
    document.body.dispatchEvent(touchEvent);

Это плохо, потому что он ищет «Android» в User-Agent, и Chrome на Android будет соответствовать этому требованию и укажет на это устаревание. Однако пока это невозможно удалить, поскольку на Android ещё какое-то время будут существовать другие браузеры на базе WebKit и Blink, которым всё равно потребуется поддержка старого API.

Для правильной обработки TouchEvent в Интернете вам следует изменить код для поддержки Firefox, IE Edge и Chrome, проверив наличие TouchEvent в объекте window , и если он имеет положительную «длину» (указывающую на то, что это конструктор, принимающий аргумент), вы должны использовать ее.

    if('TouchEvent' in window && TouchEvent.length > 0) {
      var touch = new Touch({
        identifier: 42,
        target: document.body,
        clientX: 200,
        clientY: 200,
        screenX: 300,
        screenY: 300,
        pageX: 200,
        pageY: 200,
        radiusX: 5,
        radiusY: 5
      });
    
      event = new TouchEvent("touchstart", {
        cancelable: true,
        bubbles: true,
        touches: [touch],
        targetTouches: [touch],
        changedTouches: [touch]
      });
    }
    else {
      event = document.createEvent('TouchEvent');
    
      if(ua === 'Android') {
        event.initTouchEvent(touchItem, touchItem, touchItem, "touchstart", window,
          300, 300, 200, 200, false, false, false, false);
      } else {
        event.initTouchEvent("touchstart", false, false, window, 0, 300, 300, 200,
          200, false, false, false, false, touches, targetTouches, 
          changedTouches, 0, 0);
      }
    }
    
    document.body.dispatchEvent(touchEvent);

Атрибут KeyboardEvent.keyIdentifier удален

TL;DR: Малоподдерживаемое свойство keyboardEvent.keyIdentifier удаляется в пользу стандартного свойства KeyboardEvent.key .

Намерение удалить | Chromestatus Tracker | Ошибка Chromium

Атрибут keyboardEvent.keyIdentifier некоторое время был частью спецификации W3C в 2009 и 2010 годах. Однако он был реализован только в WebKit.

Разработчики, которым необходимо заменить этот атрибут, могут использовать либо стандартное свойство KeyboardEvent.key , либо свойство KeyboardEvent.code (как описано в нашей статье прошлой весной ). Первое свойство имеет самую широкую базу реализаций и поддерживается всеми основными десктопными браузерами, кроме Safari. Второе в настоящее время поддерживается в Chrome, Firefox и Opera. Удаление этой функции призвано стимулировать внедрение свойства KeyboardEvent.key . Apple пока не сообщает, будет ли оно поддерживать эту функцию; однако также устаревшие (но пока не удалённые из Chrome) свойства KeyboardEvent.keyCode и KeyboardEvent.charCode по-прежнему доступны в Safari.

Удалить событие и атрибут завершения MediaStream, а также атрибут onended

TL;DR: Событие и атрибут ended , а также обработчик событий onended удаляются, поскольку они были удалены из спецификации Media Capture and Streams .

Намерение удалить | Chromestatus Tracker | Ошибка Chromium

Ни событие ended , ни обработчик событий onended не входят в спецификацию WebRTC уже около трёх лет. Разработчикам, желающим отслеживать события, следует использовать MediaStreamTracks вместо MediaStreams .

Отменить поддержку SVGSVGElement.viewPort

Реализация не работала в Chrome с 2012 года. Атрибут полностью отсутствует в других браузерах и был удалён из спецификации. По этим причинам свойство считается устаревшим. Ожидается его удаление в Chrome 55.

Намерение удалить | Chromestatus Tracker | Ошибка Chromium

Отменить поддержку SVGViewElement.viewTarget

Атрибут SVGViewElement.viewTarget не входит в спецификацию SVG2.0 и используется редко или вообще не используется. Этот атрибут устарел в Chrome 54. Ожидается его удаление в Chrome 56.

Намерение удалить | Chromestatus Tracker | Ошибка Chromium

Удалить SVGZoomEvent

Событие SVGZoomEvent не входит в спецификацию SVG2.0 и не работает в Chromium. Несмотря на это, оно всё ещё распознаётся, что может вызывать путаницу у разработчиков. Оно будет удалено.

Намерение удалить | Chromestatus Tracker | Ошибка Chromium