上下文菜单项上下文函数未执行
ContextMenuItem context function is not executing
我希望我的上下文菜单项仅在单击的节点是链接时才可见,即 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
});
};
请始终发布将来可以直接尝试的独立示例。
现在回到你的问题:内容脚本实际上有一个语法错误。
以下行:
' var pat_torrent = /.torrent$/i ' +
缺少分号,应为:
' var pat_torrent = /.torrent$/i; ' +
自动分号插入 (ASI) 在这里不起作用的原因是:"代码"实际上是一个没有任何换行符的字符串。如果有换行符,那么 ASI 就会起作用。安利,另一个原因不是内联复杂的内容脚本。看看contentScriptFile
.
此错误实际上被记录下来,但演示文稿很糟糕。在浏览器控制台中:
[20:57:51.707] [对象错误](可展开)
在终端中:
console.error: context-magnet: 消息: 语法错误: 缺少 ;语句之前
这是一个固定的、可重现的样本:
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 正常工作。 - 正确设置 XHR 以使用
responseType
和overrideMimeType()
。 - 使用
onload/onerror
而不是onreadystatechange
。
相关文章:
- 构造函数函数中的自执行函数的OO上下文/范围
- 是节点.js一次只执行一个上下文
- 执行上下文和变量对象在 JavaScript 中实际上是一回事吗?
- 如何使用子窗口上下文执行在父窗口中定义的函数
- javascript中的全局和局部变量执行上下文
- 执行上下文和Javascript中的执行上下文对象
- 函数参数的 JavaScript 执行上下文
- 逗号运算符是否会影响 Javascript 中的执行上下文
- 执行上下文和闭包
- Java 脚本 eval() 函数属于哪个对象?此外,在调用 eval() 函数时传递执行上下文
- JavaScript 范围和执行上下文
- 上下文菜单项上下文函数未执行
- 如何在 JavaScript 中动态地向当前执行上下文添加属性
- 任何用于 JavaScript 执行上下文可视化的现有工具
- 为什么此处未创建执行上下文
- 是否可以传递立即调用的函数表达式的执行上下文
- 如何确定 JavaScript 回调函数的执行上下文
- Node.js获取执行上下文的编程模式
- JavaScript中的执行上下文
- 如何设置变量指向全局对象-独立于上下文执行