1

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

4

0 回答 0