Подтверждение поддержки ES5

Каковы наилучшие и самые простые способы во внешнем приложении Javascript (CoffeeScript) уведомить пользователя о том, что его браузер не поддерживается, вместо того, чтобы позволить ему отказаться от неподдерживаемых функций ES5, когда пользователь случайно нажимает на них? Скажем, я пишу что-то только для современных браузеров, и я хотел бы избежать множества сбоев, с которыми старые браузеры столкнутся, когда мой код использует функции, представленные в ES5... путем блокировки не- совместимые браузеры ES5?

ES5 представил некоторые синтаксические функции, некоторые из которых, как я считаю, зависят от CoffeeScript, и я хотел бы, чтобы мой код каким-то образом избегал выполнения с самого начала, если браузер не поддерживает ES5, вместо того, чтобы настраивать прокладки, используя Modernizr или проверяя каждый синтаксис CoffeeScript. подмножество, чтобы понять, насколько оно поддерживается в обратном направлении. Просто ES5 и чистая страница «мы сожалеем, что ваш браузер слишком старый» для остального мира.

Я не хочу писать код, который тестирует каждую функцию ES5, и не обязательно полагаться на таблицы соответствия, такие как http://kangax.github.io/es5-compat-table/ для проверки типа и версии браузера (хотя я бы прибегнул к более позднему варианту, если нет более приятных альтернатив...).


person matanster    schedule 12.12.2013    source источник
comment
modernizr сообщает вам, какие функции HTML, CSS и JavaScript может предложить браузер пользователя.   -  person Ricardo    schedule 04.05.2016


Ответы (3)


Здесь нет волшебного решения.

Для каждой функциональности только для ES5 (либо это методы Object.*, либо методы String.prototype.*, либо новый синтаксис — геттеры, сеттеры и т. д.) у вас есть 3 варианта:

  1. Шим его.
  2. Перед выполнением проверьте, поддерживается ли он, и отключите его, если нет.
  3. Пусть это не удастся (возможно, используя грубый глобальный блок try-catch).

Почему?

Потому что не существует браузера ES5.

«ES5» не является логическим значением, которое можно оценить. Как вы видели из файла compat. таблиц, ES5 — довольно большой набор функций. И эти функции были реализованы в разных браузерах/платформах по частям, в разное время и с различным соответствием.

Конечно, вы всегда можете придумать какой-нибудь умный тест на вывод:

var isEngineES5Compliant = 'create' in Object && 
                           'isArray' in Array && 
                           'x'[0] === 'x';

Но я уверен, вы понимаете, насколько это хрупко.

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

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

Сказав это, если бы нам абсолютно пришлось придумать тест на вывод, чтобы определить полное соответствие ES5, я бы выбрал:

(function () { 
  "use strict";
  return Function.prototype.bind && !this;
}());

Это проверяет поддержку "строгого режима" (фактически только часть строгого режима, но скорее всего этого будет достаточно) и наличие Function.prototype.bind.

Обе эти функции были реализованы в браузерах одними из последних, поэтому мы рассматриваем IE10+, Firefox 4+, Safari 6+, Chrome 13+ и Opera 12+.

Обратите внимание, что даже некоторые из этих браузеров не полностью совместимы с ES5 (но это соответствие в основном касается непонятные функции).

Теперь, если вам нужны действительно современные браузеры... как насчет тестирования Функции ES6? :)

person kangax    schedule 16.12.2013
comment
Похоже на удаление требования строгого режима. минимум приятно расслабляет, и, честно говоря, мне все равно придется узнать больше о его преимуществах и многих деталях. Я думаю, запуск модульных тестов в каждой версии браузера был бы хорошим способом обеспечить большую защиту, но знать заранее, какие браузеры использовать, безусловно, полезно. Спасибо за поддержку этой таблицы! - person matanster; 17.12.2013

Я думаю об использовании следующей попытки catch для проверки некоторого подмножества es6.

В хроме сейчас это работает:

try {
    eval(`
        'use strict';

        class hello {
            get hello() { return 123; }
        }
    `);
} catch(e) {
   console.log('es6 classes are disabled :(')
}

Перевод этого на es5 для проверки геттеров может выглядеть так:

try {
    (function() {
        eval('var dfojdfoj12 = { get hello() { return 123; } }');
    })();
} catch(e) {
   console.log('es5 getters do not exist')
}
person Parris    schedule 14.05.2015

Чтобы «изящно» потерпеть неудачу (например, показать правильное объяснение, а не белую страницу или искаженный беспорядок), мы решили удалить стили и содержимое, используя подход, описанный в Диалог для неподдерживаемых браузеров

Тестирование поддержки анимации CSS и Function.prototype.bind (до загрузки любых скриптов, таких как es5-shim) сработало. отлично. Обратите внимание, что вам нужно будет загрузить эту прокладку, если вы хотите протестировать свои вещи в PhantomJS.

person rodneyrehm    schedule 09.04.2014
comment
Самая важная вещь, о которой ваш связанный диалог для неподдерживаемых браузеров не говорит, это то, о чем идет речь в OP: как определить, говорим ли мы о старом браузере, не обязательно метод следующий за обнаружением, о котором на самом деле только статья... - person benomatis; 17.07.2020