我正在使用用户脚本为用户创建可点击链接的菜单。这些条目最初存储在数组中,然后迭代数组,并将函数添加到.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吗?