4

有没有办法检测当前浏览器上是否有 NaCl?

在某些非 Chrome 浏览器上,检查似乎chrome.app.isInstalled会变成误报

4

2 回答 2

5

您可以检查浏览器是否处理 NaCl mime 类型。例如:

navigator.mimeTypes['application/x-nacl'] !== undefined.

同样,对于 PNaCl,您可以检查'application/x-pnacl'.

于 2013-10-25T22:43:34.253 回答
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,默认情况下已启用。NaCl 仅默认为 Chrome 商店中的应用程序启用,因此您仍然需要测试是否启用了 NaCl。一种方法是设置看门狗定时器,然后尝试加载 NaCl 模块并捕获加载事件。在加载事件中清除看门狗定时器。例如:

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>

如果您的模块需要一段时间才能下载,您可能还需要捕获loadstartprogress事件并延长看门狗时间。

function watchdog_extend() {
  watchdog_clear();
  watchdog_set(watchdog_time);
}

module.addEventListener('loadstart', watchdog_extend, true);
module.addEventListener('progress', watchdog_extend, true);
于 2014-06-13T21:21:31.737 回答