我必须动态创建一系列链接,点击时 - 更改其他元素属性(src,类,文本),基于从其他地方(json)获取的一些数据。
我有这样一段代码:
// this is data I need processed
screenshots = report_data.screenshots;
// for each I'd like to create a link
for (var i=0; i < screenshots.length; i++) {
document.write('<a href="" onclick="{document.getElementById(\'the_screenshot\').src = \''+ screenshots[i].screenshotFile + '\'; ' + 'return false;}">' + screenshots[i].screenshotTitle + '</a>');
});
然而,正确逃避所有这些角色花了我两个小时。 我想在那里调用其他定义的参数化函数。 然后我只需要输入参数。
我尝试了很多我在stackoverflow.com上找到的各种组合 让我头疼得厉害。
请帮助。
答案 0 :(得分:0)
无意中,经过几个小时的尝试和重试后,我问我的朋友和他的智者告诉我要做得更复杂一点:
最终的解决方案看起来像这样(可能不完全一样,但想法是指出的):
// 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的人。
还有一件事,我曾经想过一个细节,但它确实是一个非常严肃的问题:语法。要创建一个闭包函数,它可以正常工作:
(function(){return false;})()
现在它是一个匿名函数,而不仅仅是一个匿名函数调用。现在它有效。