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

Mat*_*att 10 javascript internet-explorer window.crypto

以下代码使用生成3个随机数window.crypto.getRandomValues.根据开发人员的文档(Microsoft MSDNMozilla 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);
Run Code Online (Sandbox Code Playgroud)

首先在Chrome中尝试使用此代码段,它会正确显示类似的内容

-513632982,-694446670,-254182938

在警报弹出窗口中.

然后,复制此问题的URL并在Internet Explorer 11中尝试- 它显示:

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


一些背景:我想尝试使用这个代码在Javascript中生成Guids,然后我发现了这个问题.


(更新:根据James Thorpe下面的优秀答案,我在JavaScript源代码中修复了Guids.)

Jam*_*rpe 22

根据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);
Run Code Online (Sandbox Code Playgroud)