我正在使用为用户创建可点击链接菜单的用户脚本。这些条目最初存储在一个数组中,然后迭代数组并将函数添加到 .click 回调中。
这是菜单的构建方式:
registerMenuCommand('Options', function() { DisplaySlideMenu(true); });
function registerMenuCommand( oText, oFunc ) {
falsifiedMenuCom[falsifiedMenuCom.length] = [oText,oFunc];
}
我可以使用标准 javascript 和如下代码成功添加和执行菜单命令:
for( var i = 0; GM_falsifiedMenuCom[i]; i++) {
var menuEntry;
mdiv.appendChild(menuEntry = document.createElement('a'));
menuEntry.setAttribute('href','#');
menuEntry.onclick = new Function('falsifiedMenuCom['+i+'][1](arguments[0]); var e = arguments[0]; e.stopPropagation(); return false;');
menuEntry.appendChild(document.createTextNode(falsifiedMenuCom[i][0]));
}
但我决定尝试将其转换为 jQuery(这样看起来更漂亮),我把它变成了这样:
for( var i = 0; falsifiedMenuCom[i]; i++) {
var mEntry = $('<a href="#">' + falsifiedMenuCom[i][0] + '</a>');
mEntry.click(function () { debugger; falsifiedMenuCom[i][1](arguments[0]); var e = arguments[0]; e.stopPropagation(); return false; });
mdiv.append(mEntry);
}
当然它不起作用。一切都会正确添加到菜单中,但是当我单击其中一个条目时,会调用 .click 并出现错误Uncaught TypeError: Cannot call method '1' of undefined
。这是有道理的,因为所有菜单的 .click 函数都是 falsifiedMenuCom[i]1 并且 i == falsifiedMenuCom.length 超出了数组的末尾。我明白为什么会这样,但是无论如何要让 .click 函数实际获取 falsifiedMenuCom[i][1] 的实际数组值,而不仅仅是尝试调用 falsifiedMenuCom[i][1] 本身?我应该坚持使用普通的旧javascript吗?