我无法使用XMLHTTPREQUEST从Chrome扩展程序后台脚本发送数据,我已启动并运行wampserver,我还尝试了外部链接,例如google。
它做了什么:
用户输入权限定义选项卡,后台脚本等待热门 key,当按下一个content_script时启动并生成一个字符串, 将字符串发送回后台脚本,然后发送回背景 脚本应该接收字符串并将其发送到php文件,php 文件应该打印你好,它的简单只是试试看看在哪里 问题,以后php会有更多代码。
但它完全不起作用!
更新
我试图打包扩展然后通过拖放运行它,它没有 启动php脚本。
我尝试卸载chrome,重启然后重新安装但是 没有运气。
我还允许 - allow-file-access-from-files
更新2
我在调试模式下收到以下错误:
extensions :: sendRequest:41:Uncaught TypeError:无法读取未定义的属性'callback'{TypeError:无法读取属性'callback'的 未定义
的manifest.json
style.css
Background.js
{
"manifest_version": 2,
"name": "Extractor",
"version": "1",
"description": "Extract from 144",
"icons": { "16": "logo16.png",
"48": "logo48.png",
"128": "logo128.png" },
"page_action": {
"default_icon": {
"16": "logo16.png",
"48": "logo48.png",
"128": "logo128.png"
},
"default_title": "Extractor"
},
"background": {
"scripts": ["background.js"],
"persistent": true
},
"content_scripts": [
{
"matches" : ["https://www.msn.com/*"],
"js" : ["content_script.js"]
}
],
"permissions": [
"tabs",
"https://www.msn.com/*",
"activeTab",
"http://localhost/*"
],
"commands": {
"toggle-feature": {
"suggested_key": {
"default": "Ctrl+Shift+1",
"windows": "Ctrl+Shift+2"
},
"description": "Extract now"
}
} ,
"web_accessible_resources": ["content_script.js"]
}
content_script.js
chrome.commands.onCommand.addListener(function(command) {
if (command === "toggle-feature") {
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
for(var i = 0; i<tabs.length;i++) {
chrome.tabs.executeScript(tabs[i].id, {"file": "content_script.js"});
}
});
}
});
chrome.runtime.onMessage.addListener(
function(message, sender, sendResponse) {
var xhttp = new XMLHttpRequest();
xhttp.open("POST", "http://localhost/test/test.php");
xhttp.send(message.url);
});
test.php的
var url = 'this is just test' ;
chrome.runtime.sendMessage({ 'url' : url });
答案 0 :(得分:0)
您只能将Chrome扩展程序的XHR请求发送到代码中manifest.json
中定义的网址,您应该http://localhost
添加manifest.json
"permissions": [
"tabs",
"https://www.msn.com/*",
"activeTab",
"*://*/*",
"http://localhost/"
],
此权限"*://*/*",
无效。您必须指定协议(http或https)
更多信息:
答案 1 :(得分:0)
如果您的chrome.extension.sendRequest
自Chrome 33以来已被删除,则可能需要检查您的代码。请改用runtime.sendMessage
。
除此之外,Simple one-time requests指出,如果您只需要将单个消息发送到扩展的另一部分(并且可选地获得响应),则应使用简化的runtime.sendMessage或tabs .sendMessage。
并且,从内容脚本发送请求如下所示:
chrome.runtime.sendMessage({greeting: "hello"}, function(response) {
console.log(response.farewell);
});
在接收端,您需要设置一个runtime.onMessage
事件监听器来处理该消息。
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
console.log(sender.tab ?
"from a content script:" + sender.tab.url :
"from the extension");
if (request.greeting == "hello")
sendResponse({farewell: "goodbye"});
});
此外,有人指出:
sendResponse
回调仅在同步使用时有效,或者如果事件处理程序返回true以指示它将异步响应。如果没有处理程序返回true或者sendMessage
回调被垃圾收集,则会自动调用sendResponse
函数的回调。
有关如何发送请求和设置事件监听器的详细信息,您可能需要检查Message Passing。