【问题标题】:Chrome extension: Run before load (rendering) a pageChrome 扩展:在加载(渲染)页面之前运行
【发布时间】:2014-04-22 15:42:05
【问题描述】:

我有一个正在运行的 Google Chrome 扩展程序,其目的是改变网页中像素图像的颜色。

要更改网页中图像的颜色,我使用已打开的选项卡中的代码(在 background.js 文件中):

function executeScriptsInExistingTabs(){
  chrome.windows.getAll(null, function(wins) {
    for (var j = 0; j < wins.length; ++j) {
      chrome.tabs.getAllInWindow(wins[j].id, function(tabs) {
        for (var i = 0; i < tabs.length; ++i) {
          if (tabs[i].url.indexOf("chrome://") != 0) {
            chrome.tabs.executeScript(tabs[i].id, { file: 'muda_conteudo.js' });
            chrome.browserAction.setIcon({path: "on.png", tabId:tabs[i].id});
          }
        }
      });
     }
   });
 }

为了改变网页的颜色,当标签的 URL 改变时,我使用以下代码(在 background.js 文件中):

chrome.tabs.onUpdated.addListener(function(tabid, info, tab) {
  if (flag){
    if (info.status == "complete") {
       chrome.tabs.executeScript(tabid, {file:"muda_conteudo.js"});
       chrome.browserAction.setIcon({path: "on.png", tabId:tab.id})
    }
  }
});

我工作完美。 但是,当我打开新标签时,我会看到原始图像,并且在几微秒后看到重新着色的图像。 我想改进这一点,只有在重新着色后才能看到页面(我不想看到原版)。

有人知道如何解决吗? 提前致谢。

【问题讨论】:

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


    【解决方案1】:

    一切都是为了这条线:

    info.status == "complete"
    

    这意味着 Chrome 将在页面加载后执行您的脚本 - 其中包括加载图片等资产。您在这里有两个选择。

    第一个(简单的)是在加载事件触发之前加载第二个脚本并隐藏例如body 直到第二个脚本执行(当然你可以将两个脚本合并为一个并等待 dom 加载事件来完成其余的工作)。

    第二个更复杂。因为从 UX 的角度来看不建议使用第一种方法(隐藏内容直到某些事件触发),您可以使用更高级的事件处理。 您可以在页面开始加载时将代码插入页面,在 body 元素上侦听 mutation events 并检查 DOMNodeInserted 事件。然后您可以检查新节点是否是图像(正是您要查找的图像)然后替换它。那么你不应该看到旧图像。此外,您可以将元素可见性状态设置为不可见,直到加载新图像。

    希望对你有所帮助。

    【讨论】:

    • 你好。我把'info.status=="complete"'这一行放在了标签页中加载网页的过程中,哪个URL,onUpdated事件被识别了几次(2或3)并且页面被重新着色了几次(所以最后结果不是预期的)。我认为这是 Chrome 的一个错误...我感谢您的关注,但我没有意识到您的建议...我的问题只是第二个脚本,当 URL 在打开的选项卡中更改时运行.. . 请您详细解释一下您的想法。
    • 嗯,这不是错误。 onUpdated 事件会被触发多次,因为它的状态会随着时间而变化。它是连接,接收数据等等。我可能在一件事上错了。按原样尝试您的代码并添加到 executeScript 函数附加参数“runAt”:“document_end”。这意味着您的脚本将在所有文档(正文)加载后立即注入。这相当于在页面末尾添加您的脚本。默认情况下,您的脚本会在所有资源都加载完毕时注入。
    猜你喜欢
    • 2012-01-21
    • 1970-01-01
    • 2022-10-31
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    相关资源
    最近更新 更多