有没有办法检测当前浏览器上是否有NaCl?
在某些非Chrome浏览器上检查chrome.app.isInstalled
似乎会出现误报
答案 0 :(得分:5)
您可以检查浏览器是否处理NaCl mime类型。 E.g:
navigator.mimeTypes['application/x-nacl'] !== undefined.
同样,对于PNaCl,您可以检查'application/x-pnacl'
。
答案 1 :(得分:0)
您可以像这样检查Chrome和特定版本的Chrome:
var have_nacl = false;
var have_pnacl = false;
var index = navigator.userAgent.indexOf('Chrome');
if (index != -1) {
var version = parseFloat(navigator.userAgent.substring(index + 7));
if (31 <= version) have_pnacl = true;
if (14 <= version) have_nacl = true;
}
然而,这并不能说明全部内容。版本31+具有PNaCl并且默认情况下已启用。只有Chrome商店中的应用默认启用NaCl,因此您仍需要测试是否启用了NaCl。一种方法是设置看门狗定时器,然后尝试加载NaCl模块并捕获 load 事件。在 load 事件中清除看门狗定时器。例如:
var watchdog;
var watchdog_time;
function watchdog_timeout() {
alert('NaCl module failed to load');
}
function watchdog_clear() {
clearTimeout(watchdog);
}
function watchdog_set(time) {
watchdog_time = time;
watchdog = setTimeout(watchdog_timeout, time);
}
watchdog_set(5000); // Timeout in 5 sec
var module = document.getElementById('module'); // Use your module's ID
module.addEventListener('load', function () {
watchdog_clear();
alert('NaCl module loaded');
}, true);
// Inject the module, where module.nmf is your NMF file.
module.innerHTML = '<embed src="module.nmf" type="application/x-nacl"/>';
这要求您在HTML中的某处具有以下内容:
<div id="module"></div>
如果您的模块需要一段时间才能下载,您可能还想捕获 loadstart 和进度事件并延长看门狗时间。
function watchdog_extend() {
watchdog_clear();
watchdog_set(watchdog_time);
}
module.addEventListener('loadstart', watchdog_extend, true);
module.addEventListener('progress', watchdog_extend, true);