【问题标题】:Detect if Chrome NaCl is available检测 Chrome NaCl 是否可用
【发布时间】:2013-11-04 10:07:48
【问题描述】:

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

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

【问题讨论】:

    标签: javascript google-chrome google-chrome-app google-nativeclient


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      您可以像这样检查 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 模块并捕获 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>
      

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

      function watchdog_extend() {
        watchdog_clear();
        watchdog_set(watchdog_time);
      }
      
      module.addEventListener('loadstart', watchdog_extend, true);
      module.addEventListener('progress', watchdog_extend, true);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-22
        • 1970-01-01
        • 1970-01-01
        • 2014-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-04
        相关资源
        最近更新 更多