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

时间:2014-07-08 08:15:13

标签: javascript google-chrome-extension

我尝试使用内容脚本

manifest

"content_scripts": [
    {
        "matches": ["*://*/*"],
        "js": ["js/content_script.js"]
    }
]

content_script.js

_ini();
function _ini(){
    document.body.style.display="none";
}

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

所以我尝试了webNavigation

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

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

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

3 个答案:

答案 0 :(得分:7)

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

使用run_at提及@ParagGangil

将其加入manifest

"content_scripts": [
    {
        "matches": ["*://*/*"],
        "js": ["content_script.js"],
        "run_at": "document_start" //<-This part is the key
    }
]

更多关于"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

    }

}

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

答案 1 :(得分:3)

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

的manifest.json:

{
    ...
    "content_scripts": [{
        "matches": ["*://*/*"],
        "js": ["contentscript.js"],
        "run_at": "document_start"
    }],
    ...
}

contentscript.js

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

visibility:hidden vs display:none

您应使用display = 'none'visibility = 'hidden'as suggested by Parag Gangli for。选择visibility:hidden优于display:none的原因是visibility不会影响元素的任何维度属性。当元素设置为display:none时,元素及其所有后代点头的宽度和高度将为0.这可能会破坏依赖于涉及文档树中元素维度的计算的多个页面。

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

document.body vs ... vs document.documentElement

设置"run_at": "document_start"

document.body不存在,因此无法使用。 document.getElementsByTagName('html')[0]有效,但可以更简洁地写成document.documentElement(=文档的根目录)。

window.onload vs DOMContentLoaded

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

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

答案 2 :(得分:1)

由于您不想删除数据而只是隐藏所有内容,请使用:

document.body.style.visibility="hidden";

这将隐藏页面中的所有内容。