偶然にも、何時間も試して再試行した後、私は友人に尋ねました、そして彼の賢い頭は私にそれをいくらかより洗練された方法で行うように言いました:
- プレーンなJavaScriptでパラメーター化された関数を作成します。
- クロージャを使用する-適切なパラメータを使用して上記を呼び出す無名関数のみをonclickに割り当てます。
- onclick関数コードの変数のようなセクションを持つdocument.write(html)に渡すタグのパターン文字列を作成します。
- string.replace(A、toB)関数を使用します。割り当てる関数コードを使用して文字列を作成します。
- 必要に応じて、関数パラメーターを使用して同じトリックを実行します。
- 記入したパターンをdocument.writa(html)関数に渡します。
最終的な解決策は次のようになります(完全に同じではないかもしれませんが、アイデアは指摘されています):
// function to call by closure
onLinkClick = function(SRC) {
document.getElementById('the_screenshot').src = SRC;
// and here one can place as much code as he needs // plain js
// and I did it
}
// this is data I need processed
screenshots = report_data.screenshots;
for (var i=0; i < screenshots.length; i++) {
// first enlist every basic part with it's inner parameters as text
var pattern = '<a href="" onclick=ONCLICK>TEXT</a>'
var onclick = '(function (){onLinkClick(PARAM); return false;})()';
var text = screenshots[i].screenshotTitle;
var param = screenshots[i].screenshotFile;
// now inject them - without any more escaping via replace
onclick = onclick.replace('PARAM', param);
pattern = pattern.replace('ONCLICK', onclick);
pattern = pattern.replace('TEXT', text);
document.write(pattern);
});
このように、コードは最初のアプローチよりもはるかにエレガントに見えます。これが将来javascriptに直面しなければならない人々に役立つことを願っています。
もう1つ、私は以前は詳細を考えていましたが、それは非常に深刻であることが判明しました。構文です。クロージャ関数を作成するには、それが機能します。
- いつものように関数を書く
- かっこで囲みます
- 空の括弧の別のペアが続きます
このような:
(function(){return false;})()
これで、匿名関数呼び出しだけでなく、匿名関数になりました。そして今、それは機能します。