Что не так с crypto.getRandomValues ​​в Internet Explorer 11?

Следующий код генерирует 3 случайных числа с помощью window.crypto.getRandomValues, Согласно документации разработчика ( Microsoft MSDN и Mozilla MDN), это должно работать как в IE, так и в Chrome.

Но на самом деле он работает только в Chrome, а не в Internet Explorer 11. По словам Microsoft, этот код должен работать - они дали пример кода, аналогичный приведенному ниже (см. Ссылку MSDN выше).

Что случилось? И как это можно исправить, чтобы он работал в обоих браузерах?

var randomValuesArray = new Int32Array(3);
var crypto = window.crypto;
crypto.getRandomValues(randomValuesArray);

var outputString = "";
for (var i = 0; i < randomValuesArray.length; i++) {
  if (i > 0) outputString += ",";
  outputString += randomValuesArray[i];
}
console.log(outputString);

Попробуйте сначала этот фрагмент в Chrome, там он правильно показывает что-то вроде

-513632982,-694446670,-254182938

во всплывающем окне с предупреждением скопируйте URL-адрес этого вопроса и попробуйте в Internet Explorer 11 - там он показывает:

Ошибка: { "message": "Невозможно получить свойство 'getRandomValues' с неопределенным или нулевым> ссылкой", "имя файла": " https://stacksnippets.net/js ", "lineno": 15, "colno": 2 }


Немного предыстории: я хотел попробовать этот код для генерации Guids в Javascript, затем я нашел эту проблему.


(Обновление: согласно превосходному ответу Джеймса Торпа ниже, я исправил Guids в исходном коде JavaScript.)

2 ответа

Решение

Согласно MDN, эта функция считается экспериментальной в IE11. Как таковой, он имеет префикс ms и доступен через window.msCrypto:

var randomValuesArray = new Int32Array(3);
var crypto = window.crypto || window.msCrypto;
crypto.getRandomValues(randomValuesArray);

var outputString = "";
for (var i = 0; i < randomValuesArray.length; i++) {
  if (i > 0) outputString += ",";
  outputString += randomValuesArray[i];
}
console.log(outputString);

The getRandomValuesФункция поддерживается только в Internet Explorer 11. Мне пришлось добавить следующий метатег в раздел заголовка веб-страницы, чтобы позволить Internet Explorer выбирать, в какой версии IE должна отображаться страница.

      <meta http-equiv="X-UA-Compatible" content="IE=11">
Другие вопросы по тегам