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

14

以下代码使用window.crypto.getRandomValues生成 3 个随机数。根据开发者文档(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中尝试 - 它显示:

错误:{ "message": "无法获取未定义或空引用的 'getRandomValues' 属性", "filename": "https://stacksnippets.net/js", "lineno": 15, "colno": 2 }

错误:{ "message": "脚本错误。", "filename": "https://stacksnippets.net/js", "lineno": 0, "colno": 0 }


一些背景:在尝试使用此代码在JavaScript中生成Guids时,我发现了这个问题。


更新:

  • 根据James Thorpe的出色答案,我已经修复了JavaScript中的Guids源代码
  • 来自Microsoft的更新浏览器(如Edge版本96.0.1054.43)不再显示此问题。 但是,使用下面提供的答案仍然可以维护最佳兼容性。


没有IE方便测试,但也许是兼容模式的问题?(编辑:啊,不太可能,因为它正在运行一个Stack片段) - Pekka
是的,我已经在我的电脑上安装了Chrome和IE 11。 - Matt
你在我回答的时候编辑了 MDN 的链接 - 该页面的第一行代码显示了如何在 IE11 中获取它。 - James Thorpe
@JamesThorpe - 抱歉,你说得对。但是不用担心,你的回答很有价值,因为它解决了问题。感谢你的帮助! - Matt
2个回答

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


0

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接