Я пытаюсь использовать 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.
... так что, по-видимому, нам нужно что-то вроде Вавилон ... черепах на всем пути вниз?
Я надеюсь на ответ, который начинается: "Вы делаете вещи слишком сложными" :)