5

我正在集成一个使用 IndexedDB 的 javascript 库,但是当 Firefox 处于隐私浏览/窗口模式时,它会“不礼貌地”失败。该库返回一个 500 内部错误,同时 Firefox 向控制台吐出一个 InvalidStateError。

我想做的是在实例化这个库之前添加一个检查,如果 IndexedDB 不可用,则根本不使用该库。即某种类型的try/catch 测试。从我所见,即使违规代码在 try/catch 中,Firefox 似乎也会吐出控制台错误(但也许还有办法..)。

我实际上并不关心用户是否在私人窗口会话中,但这似乎是 Firefox 导致此 InvalidStateError 的唯一时间。

4

2 回答 2

2

您已经处理了 onerror 函数中的错误。

这不会明确告诉您使用是“私人的”,但会告诉您不能使用 indexedDB - 如果需要,您可以从中进行插值 - 即如果它的 FireFox 并且它抛出和错误,那么机会是他们是私密的——直到 Mozilla 的人修复它。

var db = window.indexedDB.open('test');
db.onerror = function()
{
    console.log("Can't use indexedDB")
}

这仍然会将 InvalidStateError 踢到控制台,但 js 可以处理后果。

于 2017-02-27T09:52:25.033 回答
0

我使用 indexedDB 来检查用户是否处于隐私浏览模式。InvalidStateError 出现在 window.onerror 上并通过跟踪系统记录。看起来打开发生在不同的线程中。我只找到了这个原始解决方案:设置全局处理程序 window.onerror,以隐藏此错误。

    // Get old handler (maybe undefined)
    const oldHandler = window.onerror;
    // Empty handler
    const noop = () => 1;
    window.onerror = noop;

    const returnOldHandler = () => setTimeout(() => {
      // The ugly thing: we some external code could place own onerror handler
      // between our code evaluation.
      // For this case we should check is it changed.
      if (window.onerror === noop) {
        window.onerror = oldHandler;
      }
    }, 0);

    try {
      db = window.indexedDB.open('test');
      // Return global handler when DB opens.
      // It can create some errors due async process.
      db.onerror = returnOldHandler;
      db.onsuccess = returnOldHandler;
    } catch(e) {
      // never evaluate
    }
于 2016-07-01T08:24:22.930 回答