Javascript 获取使用chrome扩展创建的弹出窗口的DOM访问权限

Javascript 获取使用chrome扩展创建的弹出窗口的DOM访问权限,javascript,html,google-chrome,dom,google-chrome-extension,Javascript,Html,Google Chrome,Dom,Google Chrome Extension,我正在创建一个Chrome扩展,用简单的HTML打开一个弹出窗口。我无法访问此弹出DOM 可以操作弹出的DOM吗 示例: background.js chrome.browserAction.onClicked.addListener(function(tab) { chrome.windows.create({"url": "popup.html", "type": "popup"}, function(wd){ console.log(wd); wd.documen

我正在创建一个Chrome扩展,用简单的HTML打开一个弹出窗口。我无法访问此弹出DOM

可以操作弹出的DOM吗

示例:

background.js

chrome.browserAction.onClicked.addListener(function(tab) {

  chrome.windows.create({"url": "popup.html", "type": "popup"}, function(wd){
     console.log(wd);
     wd.document.getElementById("txtField").value = "asd";
  })
});
popup.html

<html>
   <head></head>
   <body>
        <input type="text" id="txtField" />
   </body>
</html>

当我运行这段代码时,它会说“无法读取未定义的属性'getElementById'。

在包含在HTML中的文件中使用JavaScript,
通常,您应该从在popup.html中加载了
标记的JavaScript中执行DOM操作,就像您在浏览器操作弹出窗口或选项页面中所做的那样。例如,来自popup.js文件中的JavaScript并包含在popup.html中,如:


实际操作新窗口的DOM 如果您想访问弹出窗口的视图,则需要使用获取该窗口的视图。当执行
chrome.windows.create()
的回调时,或者调用
chrome.windows.onCreated
侦听器(或
windows.onFocusChanged
)时(在执行
chrome.windows.create()
回调之前触发),窗口实际上并不存在,这一事实使问题变得复杂。当新的弹出窗口实际存在时,或者当您可以获取该窗口的视图时,似乎没有通知您的事件

因此,在HTML中包含的JavaScript文件中使用
标记,使用代码会大大提高您的性能

如果您仍然希望操作已打开窗口的DOM,则必须进行轮询,直到找到该窗口的视图为止。以下内容将满足您的要求:

background.js:

chrome.browserAction.onClicked.addListener(函数(选项卡){
创建({“url”:“popup.html”,“键入”:“popup”},函数(wd){
waitForWindowId(winObject.id,50,20,函数(视图){
console.log(视图);
view.document.getElementById(“txtField”).value=“asd”;
});
})
});
函数waitForWindowId(id、延迟、最大值、回调){
let where='watchForWindow';
如果(最大值)--{
if(回调类型==='function'){
回调(视图);
}
返回true;
})){
//找不到窗口ID的视图。请继续尝试
setTimeout(waitForWindowId、delay、id、delay、MaxTry、回调);
}
}

console.log的结果是什么?的可能副本我建议您阅读(并可能阅读从那里链接的页面)。它有整体的架构信息,这将有助于您了解事物的组织/完成方式。@Jean maximeBouloc是一个chrome窗口对象,而不是常规的DOM窗口@安德烈·迪翁,我不认为这是同一个问题。他似乎不知道背景、弹出窗口或内容脚本的功能,我已经习惯了。
chrome.windows.create(
    {
        url:'https://site.ru',
        type: 'popup',
        state: 'maximized',
    },
    function(window) {
        chrome.tabs.executeScript(window.tabs[0].id, {
            file: '/back/inject.js',
        });
    }
);