Internet Explorer 11 中的 crypto.getRandomValues 有什么问题?



下面的代码使用window.crypto.getRandomValues生成 3 个随机数。根据开发人员的文档(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", "线号": 15, "科尔诺":2 }

错误:{ "消息": "脚本错误。 "文件名": "https://stacksnippets.net/js", "线号": 0, "科尔诺": 0 }


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

<小时 />

更新:

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

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

getRandomValues函数仅在 Internet Explorer 11 中受支持。我不得不在网页的标题部分添加以下元标记,以允许 Internet Explorer 选择应该使用哪个版本的 IE 呈现页面。

<meta http-equiv="X-UA-Compatible" content="IE=11">

最新更新