【问题标题】:How to hide a page before my content script has completed its DOM changes?如何在我的内容脚本完成其 DOM 更改之前隐藏页面?
【发布时间】:2013-02-12 12:37:59
【问题描述】:

我基本上使用内容脚本来处理文档,提取数据,然后用不同的布局但相同的信息重建页面的大块。因此,对于一个看起来很糟糕的特定网站来说,这是一个“preffity”扩展。

问题是,chrome 会在内容脚本完成该过程之前继续渲染页面,因此在某些页面加载时,您可以看到原始页面闪烁几帧,然后被更好的页面替换。

浏览器不会立即开始渲染。您很少会看到没有应用 CSS 的网站,因为“它没有及时完成”。有没有办法让渲染也等待内容脚本?我不需要数百毫秒,只需几毫秒。

【问题讨论】:

  • 如果您使用 css 并通过清单添加,请尝试将其添加到内容脚本字段:"run_at": "document_start"
  • @BeardFist,无论run_at 设置如何,通过清单添加的 CSS 文件始终在 DOM 和内容脚本之前加载。

标签: css dom google-chrome-extension content-script


【解决方案1】:

你没有发布你的 manifest.json(总是包含这个),但最可能的原因是你的脚本是 the default random firing time of a content script 的受害者。

您可能需要做的就是在清单中将run_at 设置为document_end



但是,如果您绝对肯定在更改完成之前不会显示任何内容,则需要使用多步骤方法:

  1. 为您的扩展创建一个 CSS 文件并将其保存为hide_at_start.css

    body {
        display:    none;
    }
    

    请注意,在极少数情况下,您可能需要使用 display: none !important;


  2. hide_at_start.css 添加到您的清单并将清单设置为run_at document_start

    {
        "manifest_version": 2,
        "content_scripts": [ {
            "js":               [ "YOUR_CONTENT_SCRIPT.js" ],
            "css":              [ "hide_at_start.css" ],
            "matches":          [ "http://YOUR_SERVER.COM/YOUR_PATH/*"
                                ],
            "run_at":           "document_start"
        } ],
        "description":  "Blanks a page until our content script is done",
        "name":         "Blank at Start",
        "version":      "1"
    }
    


  3. 在您的内容脚本中,任何操作页面元素的代码都必须等待 DOM 变为 interactive 并且该元素就位。所以像这样修改YOUR_CONTENT_SCRIPT.js

    document.addEventListener ('DOMContentLoaded', onDOM_Ready, false);
    
    function onDOM_Ready () {
        contentScript_main ();
    
        //-- Make page visible again.
        document.body.style.setProperty ("display", "inherit", "important");
    }
    
    function contentScript_main () {
        // PUT YOUR CODE, THAT ALTERS PAGE ELEMENTS, HERE.
    }
    

    此外,如果您的目标内容是在页面加载后通过 AJAX 添加的,则内容脚本必须对这些元素使用额外的策略(计时器、事件侦听器、突变观察器等)。


  4. 最后,如果您的代码需要渲染元素的尺寸或位置(不太可能),请使用visibility: hidden; 而不是display: none;

【讨论】:

  • 谢谢,但没有。当用户浏览网站的不同部分时,页面将闪烁白色。通常,浏览器会在加载下一个页面时继续显示当前页面,直到某一点。有一些时间限制或启发式用于决定何时完成第一次渲染。我在问我是否可以与 Chrome 沟通该页面尚未准备好呈现。我认为它必须是可能的,因为如果不是,任何对页面进行大量更改的扩展都会很糟糕。
  • 没有。在实践中,只需要设置document_end 就可以了,没有人会发现任何不妥之处。您不能在不完全停止页面的情况下推迟渲染。您所能做的就是在页面进入时对其进行修改。
猜你喜欢
  • 2015-01-31
  • 2016-04-08
  • 2023-03-16
  • 2018-07-23
  • 2019-11-05
  • 2020-04-21
  • 2014-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多