13

下面的代码通过使用生成 3 个随机数window.crypto.getRandomValues。根据开发人员的文档(Microsoft MSDNMozilla MDN),这应该可以在 IE 和 Chrome 中使用。

但实际上它只适用于 Chrome,而不适用于 Internet Explorer 11。根据微软的说法,这段代码应该可以工作——他们给出了与下面列出的代码示例类似的代码示例(参见上面的 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中尝试- 它显示:

错误:{“消息”:“无法获取未定义或 null >reference 的属性 'getRandomValues'”、“文件名”:“https://stacksnippets.net/js”、“lineno”:15、“colno”:2 }

或者

错误:{“消息”:“脚本错误。”,“文件名”:“https://stacksnippets.net/js”,“lineno”:0,“colno”:0 }


一些背景:在尝试使用此代码在 Javascript中生成Guid 时,我发现了此问题中描述的问题。


更新:

  • 根据下面James Thorpe 的出色回答,我在 JavaScript源代码中修复了 Guid。
  • Microsoft 的较新浏览器(例如 Edge 版本 96.0.1054.43)不再显示此问题。但是使用下面提供的答案来保持最佳兼容性仍然很好。
4

1 回答 1

30

根据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);

于 2017-05-18T11:38:15.597 回答