【问题标题】:How to remove the ‘leave site ’ pop up While updating the url of the current active page in chrome extension如何在 chrome 扩展中更新当前活动页面的 url 时删除“离开站点”弹出窗口
【发布时间】:2020-03-02 10:30:40
【问题描述】:

我正在为谷歌日历开发一个 chrome 扩展。 在一个事件之后我需要横向到一个特定的 url 所以我使用 chrome.tabs.update(tabId, {url:'myurl'}) 来更新当前页面的 url。 但是在更新 url 时,离开站点弹出,这是浏览器的默认弹出窗口即将到来 请建议一种在更新 chrome 扩展中的 url 时删除它的方法

【问题讨论】:

    标签: javascript google-chrome browser google-chrome-extension


    【解决方案1】:

    理想情况下,这是由扩展 API 处理的,因此请加注星标crbug/1031791。同时我们可以使用下面列出的解决方法。

     

    简单的做法是清除window.onbeforeunload

    仅适用于某些网站。

    扩展脚本(弹出或背景):

    function clearUnloadPrompt() {
      return new Promise(resolve => {
        chrome.tabs.executeScript({
          code: `(${() => {
            const script = document.createElement('script');
            script.textContent = 'window.onbeforeunload = null';
            document.documentElement.appendChild(script).remove();
          }})()`,
          runAt: 'document_start',
        }, () => {
          chrome.runtime.lastError;
          resolve();
        });
      });
    }
    
    clearUnloadPrompt().then(() => {
      chrome.tabs.update({url: 'https://www.example.org/'});
    });
    

     

    完全淘汰的方法是在页面注册之前注册beforeunload

    应该在任何地方都可以使用,但缺点是它需要在您的扩展程序需要更新 URL 的所有 URL 上使用内容脚本。如果您已经在 manifest.json 中为您的扩展程序的主要功能请求这些主机权限,这不是问题。

    manifest.json 摘录:

    "content_scripts": [{
      "matches": ["<all_urls>"],
      "js": ["content.js"],
      "run_at": "document_start"
    }],
    

    (不要忘记使用您实际需要的 URL 模式,而不是 &lt;all_urls&gt;

    content.js:

    const pageEventId = chrome.runtime.id + Math.random;
    
    runInPage(suppressor, pageEventId);
    
    chrome.runtime.onMessage.addListener(msg => {
      if (msg === 'suppressBeforeUnload') {
        window.dispatchEvent(new Event(pageEventId));
      }
    });
    
    function runInPage(fn, ...args) {
      const script = document.createElement('script');
      script.textContent = `(${fn})(${JSON.stringify(args).slice(1, -1)})`;
      document.documentElement.appendChild(script);
      script.remove();
    }
    
    function suppressor(pageEventId) {
      let suppressBeforeUnload;
      window.addEventListener(pageEventId, () => {
        window.onbeforeunload = null;
        suppressBeforeUnload = true;
      });
      window.addEventListener('beforeunload', e => {
        if (suppressBeforeUnload) {
          e.stopImmediatePropagation();
        }
      });
    }
    

    扩展脚本(弹出或背景):

    chrome.tabs.sendMessage(tab.id, 'suppressBeforeUnload', () => {
      chrome.runtime.lastError;
      chrome.tabs.update({url: 'https://www.example.org/'});
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-03
      • 2017-03-01
      • 1970-01-01
      • 2013-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多