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);
}

そしてもちろん、それは機能しません。すべてがメニューに正しく追加されますが、エントリの1つをクリックすると、.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