如何在使用Chrome扩展程序加载页面之前隐藏所有内容

Jo *_* E. 2 javascript google-chrome-extension

我尝试使用内容脚本

manifest

"content_scripts": [
    {
        "matches": ["*://*/*"],
        "js": ["js/content_script.js"]
    }
]
Run Code Online (Sandbox Code Playgroud)

content_script.js

_ini();
function _ini(){
    document.body.style.display="none";
}
Run Code Online (Sandbox Code Playgroud)

但它首先加载页面然后隐藏它.

所以我试过了 webNavigation

chrome.webNavigation.onCommitted.addListener(function(details){
    alert('webnav');
    document.body.style.display="none";
});
Run Code Online (Sandbox Code Playgroud)

但上面也没有用.该页面webnav在页面加载之前发出警报但显示无效.

我真正需要的是隐藏整个网站而不向客户展示任何元素.有任何想法吗?

Jo *_* E. 8

使用Chrome扩展程序在页面加载前隐藏所有内容

使用run_atAs @ParagGangil提到

包括在内 manifest

"content_scripts": [
    {
        "matches": ["*://*/*"],
        "js": ["content_script.js"],
        "run_at": "document_start" //<-This part is the key
    }
]
Run Code Online (Sandbox Code Playgroud)

有关"run_at"的更多信息:"document_start"

这应该在里面 content_script.js

_ini();

function _ini(){

    document.getElementsByTagName("html")[0].style.display="none";

    window.onload=function(){

        //do your stuff

        document.getElementsByTagName("html")[0].style.display="block"; //to show it all back again

    }

}
Run Code Online (Sandbox Code Playgroud)

由于@Xan评论document.body在加载期间尚未构建,content_script.js因此我们定位<html>标记

  • 对于任何使用此功能的人来说,JSON中的`//`式注释都是语法错误.它用于突出显示,但不要按原样复制代码. (2认同)

Rob*_*b W 8

在大多数情况下,现有答案是正确的,但我想提供有关所用方法的含义的更多背景信息。在您准备好之前隐藏页面的推荐方法是:

清单.json:

{
    ...
    "content_scripts": [{
        "matches": ["*://*/*"],
        "js": ["contentscript.js"],
        "run_at": "document_start"
    }],
    ...
}
Run Code Online (Sandbox Code Playgroud)

内容脚本.js

document.documentElement.style.visibility = 'hidden';
document.addEventListener('DOMContentLoaded', function() {
    // ... do something ... and then show the document:
    document.documentElement.style.visibility = '';
});
Run Code Online (Sandbox Code Playgroud)

visibility:hidden 对比 display:none

你应该使用display = 'none',但是visibility = 'hidden'由Parag港利的建议。之所以宁愿visibility:hiddendisplay:nonevisibility不影响元素的任何尺寸特性。当一个元素设置为 时display:none,该元素及其所有后代节点的宽度和高度都将为 0。这可能会破坏多个页面,这些页面依赖于涉及文档树中元素尺寸的计算。

切换的另一个后果display:none是滚动位置和锚点 ( #id-of-something) 被破坏。浏览器将不再跳转到锚点或上一个滚动位置,而是在滚动位置 (0,0) 处显示页面。这是非常不可取的。

document.body VS ... VS document.documentElement

document.body"run_at": "document_start"设置时不存在,因此无法使用。document.getElementsByTagName('html')[0]有效,但可以更简洁地写为document.documentElement(= 文档的根)。

window.onload 对比 DOMContentLoaded

window.onload仅当所有资源(图像、帧等)完全加载时才会触发。这可能需要一段时间,因此在window.onload触发事件之前隐藏整个页面是一个坏主意。

在大多数情况下,您的扩展仅取决于文档结构,因此修改文档并在DOMContentLoaded活动中显示文档就足够了。