Chrome 扩展程序可以更改页面字符集吗?

gor*_*pro 5 google-chrome google-chrome-extension

我是 Chrome 扩展开发的新手。我想使用扩展来更改页面字符集,例如 chrome 设置>>工具>>字符集。我看过有关 chrome.contentSetting 1的带有 chrome 扩展名的文档。但我还没有找到如何更改页面字符集。

小智 4

是的。通过如何更改 Chrome 中的响应标头

chrome.webRequest.onHeadersReceived.addListener(function(details){
    for(var i = 0; i < details.responseHeaders.length; ++i)
        if(details.responseHeaders[i].name.toLowerCase() == 'content-type')
            details.responseHeaders[i].value = 'text/html; charset=shift-jis';
    return {responseHeaders:details.responseHeaders};
}, {urls: ['https://www.google.com/*']}, ['blocking', 'responseHeaders']);
Run Code Online (Sandbox Code Playgroud)

如果您想在页面加载时更新字符集,则需要chrome.webRequest.onCompleted.addListener更新文档中的元标记<head>chrome.tabs.executeScript()由于文档是使用指定的字符集呈现的,因此不能通过实用方式调用此方法。

chrome.webRequest.onCompleted.addListener(function(details){
    chrome.tabs.getSelected(null, function(tab) {
        chrome.tabs.executeScript(null, {allFrames:true,code:"document.getElementsByTagName('meta')[0].setAttribute('content', 'text/html; charset=UTF-8');"});
    });
}, {urls: ['http://google.com/']});
Run Code Online (Sandbox Code Playgroud)

这些函数中的任何一个都会进入您background.js加载的文件中manifest.json

{
    "manifest_version": 2,
    // name,description,version...
    "background": {
        "scripts": ["background.js"],
        "persistent": true,
        //"matches": ["https://google.com/"]
    },
    "permissions": [
        "tabs",
        "webRequest",
        "webRequestBlocking"
    ]
}
Run Code Online (Sandbox Code Playgroud)

一旦页面被初始化并呈现,就无法更改字符集。document.charset是只读的,即使发生更改,触发重新渲染似乎也不会影响文档字符集。