有人可以告诉我代码有什么问题吗?单击上下文菜单时,我想在此向页面发送POst请求。发布数据将是被单击的URL。

var buttons = require('sdk/ui/button/action');
var tabs = require("sdk/tabs");
var cm = require("sdk/context-menu");
var Request = require('sdk/request').Request;
var self = require("sdk/self");


function sendRequest(turl) {
    Request({url: 'myurl.com',content: {data: turl},onComplete: function (response) {console.log(response.text);}}).post();
};

var script = "self.on('click', function (node, data) {" +
             "sendRequest(node);" +
             "});";

cm.Item({
  label: "Save To nbojanapu",
context: cm.SelectorContext("a"),
contentScript: script

});

最佳答案

这里的问题是,上下文菜单中未为contentScript定义sendRequest。您将必须使用消息传递功能(https://developer.mozilla.org/en-US/Add-ons/SDK/High-Level_APIs/context-menu#message

var script = "self.on('click', function(node, data) {" +
             "  self.postMessage(node.href);" +
             "});";

cm.Item({
  label: "Save to nbojanapu",
  context: cm.SelectorContext("a"),
  contentScript: script,
  onMessage: sendRequest
});


因此,它不是在contentScript中直接调用sendRequest,而是在消息事件处理程序(我直接将其附加在项目的构造函数中)中调用了它。消息是使用self.postMessage方法从contentScript发送的,顺便说一句,该方法不支持对Object进行结构化克隆,换句话说,如果您要向整个节点发送消息,那么它将是接收端损坏(另请参见https://developer.mozilla.org/en-US/Add-ons/SDK/Guides/Content_Scripts/using_postMessage)。由于您似乎只想要href属性,因此我直接发送了该属性。

09-10 11:24