ユーザーのクリック可能なリンクのメニューを作成するユーザースクリプトを使用しています。これらのエントリは最初に配列に格納され、次に配列が繰り返され、関数が.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に固執する必要がありますか?