1

我希望我的上下文菜单项只有在单击的节点是链接时才可见,即,href 是磁力链接或种子链接。但是项目对于所有链接都是可见的,因为上下文函数没有执行,任何人都可以帮助为什么上下文函数没有执行?

这是代码:

exports.main = function() {
var cm = require("sdk/context-menu");

var contextCode = ' self.on("context", function (node) { '+
                  ' while(node.nodeName!="A") { node = node.parentNode;  } '+
                  ' var pat_magnet = /^magnet:/i; ' +
                  ' var pat_torrent = /.torrent$/i; ' +
                  ' if(pat_torrent.test(node.href) || pat_magnet.test(node.href)) { return true; } '+
                  ' else { return false; } '+
                  ' }); ';

var clickCode = ' self.on("click", function(node,data){ '+
                  ' while(node.nodeName!="A") { node = node.parentNode;  } '+
                  ' var pat_hash = /[0-9abcdef]{32,40}/i; ' +
                  ' var result = node.href.match(pat_hash); '+
                  ' var hash = "" '
                  ' if(result != null) { hash=result[0]; } '+
                  ' var xhr = new XMLHttpRequest(); '+
                  ' if(hash != "") { '+
                  '     var apiCall = "https://www.furk.net/api/dl/add?api_key=*************&info_hash="+hash; '+
                  ' } '+
                  ' else{ '+
                  '     var apiCall = "https://www.furk.net/api/dl/add?api_key=*************&url="+encodeURI(node.href); '+
                  ' } '+
                  ' xhr.open("GET",apiCall,true); '+
                  ' xhr.onreadystatechange = function(){ if(xhr.readyState = 4) { if (xhr.response.status = "ok") { alert("Torrent added to Furk."); } else { alert("Torrent could not be added to Furk."); } } } '+
                  ' xhr.send(null); '+
                  ' });';
cm.Item({
   label: "Add to Furk",
   context: cm.SelectorContext("a[href]"),
   contentScript: contextCode + clickCode
});
};
4

1 回答 1

1

请始终发布可以在将来直接尝试的独立示例。

现在回到您的问题:内容脚本实际上有语法错误。

以下行:

' var pat_torrent = /.torrent$/i ' +

缺少分号,应该是:

' var pat_torrent = /.torrent$/i; ' +

自动分号插入 (ASI) 在这里不起作用的原因是:“代码”实际上是一个没有换行符的字符串。如果有换行符,那么 ASI 就会起作用。Anway,另一个没有内联复杂内容脚本的原因。看看contentScriptFile

实际上记录了这个错误,但是演示很糟糕。在浏览器控制台中:

[20:57:51.707] [对象错误](可扩展)

在终端:

console.error:上下文磁铁:消息:SyntaxError:缺失;声明之前

这是一个固定的、可重复的样本:

var cm = require("sdk/context-menu");
var contextCode = ' self.on("context", function (node) { '+
                  ' while(node.nodeName!="A") { node = node.parentNode;  } '+
                  ' var pat_magnet = /^magnet:/i; ' +
                  ' var pat_torrent = /.torrent$/i; ' +
                  ' if(pat_torrent.test(node.href) || pat_magnet.test(node.href)) { return true; } '+
                  ' else { return false; } '+
                  ' }); ';
cm.Item({
    label: "magnet test",
    context: cm.SelectorContext("a[href]"),
    contentScript: contextCode
});

编辑 ' var hash = "" '也有同样的问题,可能还有其他这样的错误,我错过了浏览这段新代码。正如我已经说过的,请使用contentScriptFile而不是contentScript用于长脚本。

另一个编辑

这是一个使用 的构建器contentScriptFile我还修复了一些其他错误,其中最重要的是:

  • 使用permissions以便 XHR 工作。
  • 正确设置要使用的 XHRresponseTypeoverrideMimeType().
  • 使用onload/onerror而不是onreadystatechange.
于 2013-10-30T20:06:41.053 回答