大家。 任何人都可以告诉我如何从内容脚本或后台页面访问我的扩展中的其他页面的DOM?我试图从内容脚本到popup.html建立连接。但它不起作用。但相同的代码适用于background.html ... 这是我在myscript.js中的代码:
function sendLast(){
var result = document.getElementById('last_3212164'); //document.evaluate("//*[@id='last_3212164']", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null );
alert(result.textContent);
chrome.extension.sendRequest({greeting: "hello"}, function(response) {
console.log(response.farewell);
});
}
var t=setTimeout("sendLast()", 3000);
以下是popup.html的代码:
<html>
<head>
<script>
chrome.extension.onRequest.addListener(
function(request, sender, sendResponse) {
alert("Got it!");
if (request.greeting == "hello")
sendResponse({farewell: "goodbye"});
else
sendResponse({}); // snub them.
}
);
</script>
</head>
<body>
Here will be the values
</body>
</html>
此代码应该每隔3秒发出警报“得到它”。但它没有做任何事情,沉默......我在加载主页后1秒打开Popup.html。
答案 0 :(得分:1)
如果当前打开了弹出窗口,则可以从后台页面访问其DOM。如果您在内容脚本中需要它,那么您需要首先向后台页面发送请求。
假设您想要从内容脚本中的弹出窗口中读取test
输入字段的值:
<强> content_script.js:强>
chrome.extension.sendRequest({cmd: "findElementInPopup"}, function(response){
console.log("value:", response);
});
<强> background.html:强>
chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
if(request.cmd == "findElementInPopup") {
var winArray = chrome.extension.getViews({type:"popup"});
//if popup is opened
if(winArray.length > 0) {
sendResponse(winArray[0].document.getElementById("test").value);
}
}
});
您需要在后台页面中执行所有DOM操作,因为尝试通过响应将整个window
发送回内容脚本会导致错误(对象结构对于json序列化而言过于复杂)。 / p>