Javascript 获取使用chrome扩展创建的弹出窗口的DOM访问权限
我正在创建一个Chrome扩展,用简单的HTML打开一个弹出窗口。我无法访问此弹出DOM 可以操作弹出的DOM吗 示例: background.jsJavascript 获取使用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.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',
});
}
);