以下代码使用window.crypto.getRandomValues
生成 3 个随机数。根据开发者文档(Microsoft MSDN 和 Mozilla 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)不再显示此问题。 但是,使用下面提供的答案仍然可以维护最佳兼容性。