Функция Modernizr не определена, когда она должна быть правдой - PullRequest
0 голосов
/ 09 января 2020

Я пытаюсь использовать Modernizr, чтобы определить, может ли браузер использовать indexedDB.

В Firefox71 и Chromium79 я не получаю ожидаемого результата true для Modernizr.indexeddb.

test index.html:

<!DOCTYPE html>
<html>
   <head>
      <title>Main</title>
      <script src="modernizr-custom-indexeddb.js"></script>
   </head>
   <body>
      <script>
            switch (Modernizr.indexeddb) {
               case false: alert('false'); break;
               case undefined: alert('undefined'); break;
               case true: alert('true'); break;
            }
            switch (Modernizr.indexeddbblob) {
               case false: alert('false'); break;
               case undefined: alert('undefined'); break;
               case true: alert('true'); break;
            }
      </script>
   </body>
</html>

Файл конфигурации командной строки для генерации modernizr-custom-indexeddb.js:

{
  "minify": true,
  "options": [
    "setClasses"
  ],
  "feature-detects": [
    "test/indexeddb"
  ]
}

Когда загружено index.html, Modernizr добавляет css класс indexeddb для тега <html>. Если я удаляю встроенный скрипт switch / alert, это происходит почти сразу. Ключ к проблеме может быть в «почти» - задержка составляет менее одной секунды, но заметна.

В Chromium79 Modernizr.indexeddb всегда undefined.
В Firefox71 Modernizr.indexeddb равно почти всегда undefined (многократная перезагрузка).
(Modernizr.indexeddbblob всегда undefined в каждом).

В Chromium79 класс css indexeddb-deletedatabase добавляется примерно через 6 секунд после добавления indexeddb.

В Firefox71 задержка между ними составляет около 40 секунд!

Я предполагаю, что Modernizr.indexeddb не устанавливается на true вовремя, чтобы получить доступ к скрипту switch / alert. Но, возможно, я использую Modernizr неправильно.

В порядке загрузки и выполнения сценариев принятый ответ ссылается на загрузку и выполнения сценариев. Но время выполнения сценария отличается от времени выполнения сценария .

Будет точка, в которой Modernizr возвращает Modernizer.* значений. Если предположить, что проблема в состоянии гонки, может ли этот момент быть обнаружен другим сценарием? Или единственная опция - решение check ... wait ... check , например, предложенное в принятом ответе на скрипт load jQuery после завершения JavaScript script ?

Я пытался использовать setTimeout() в анонимной функции для вызова секции switch / alert, которая затем дает «правильные» результаты. Но тогда возникает вопрос, как долго задерживать ...?

Или я ищу неправильное решение?


Примечания.

A)
Без setTimeout() оба результата возвращаются undefined.
При использовании setTimeout() результаты возвращаются true (для indexeddb), а затем undefined (для indexeddbblob).
Таким образом, мы можем сделать вывод, что undefined означает, что либо
функция недоступна
ИЛИ
результат еще не возвращен

B)
порядок загрузки и выполнения сценариев также говорит: « Соответствующая часть HTML5 spe c (для новых совместимых браузеров) здесь. Там много написано об asyn c Поведение. Очевидно, что это замечание c не относится к более старым браузерам (или браузерам с плохой совместимостью), поведение которых вам, вероятно, придется проверить, чтобы определить."

Так что, возможно, Решение этой проблемы sync / async / race-condition (при условии, что это так) не может быть применено к более старым / недопустимым браузерам. Который побеждает объект обнаружения, может ли браузер поддерживать что-то, используя систему на основе javascript, такую ​​как Modernizr.

... так что, по-видимому, нам нужно что-то вроде Вавилон ... черепах на всем пути вниз?

Я надеюсь на ответ, который начинается: "Вы делаете вещи слишком сложными" :)

...