2012-01-10 56 views
1

我有一个函数,它返回一个包含javascript调用的字符串。既然它被引用,我不能通过它传递变量。通过引用Javascript字符串传递变量

如何更改返回字符串,使我能够传递JavaScript对象值。

例如:如何通过var i通过return语句。

var i = 'iaa'; 

return '<a href="javascript:abccd(\'i\');" ><img src="../images/btnsave2.png" style="margin:6px 0 0 6px;" height="13" width="13" /></a> ';

+7

Eugh。重构。使用标准的DOM,而不是传递大量的HTML。然后你可以使用标准的事件处理器绑定技术。 – Quentin 2012-01-10 14:02:01

+0

为什么图像中缺少'alt'属性? – Quentin 2012-01-10 14:12:28

+0

@Quentin: - 我在JQGrid的一个自定义格式化程序中使用这个。我不认为我可以在 – Nipuna 2012-01-10 16:05:08

回答

2

如果您需要操作原始HTML,至少要在JavaScript中分别添加事件处理程序。和CSS文件中的样式。

您的图片标记代码应包含data-属性:

i = i.replace(/"/g, '\\"') 
return '<img data-input="' + i + '" src="../images/btnsave2.png" />' 

然后添加一个监听器是如此简单:

var onClick = function (e) { 
    var data = e.target.getAttribute('data-input') 
    if (data) { 
     abccd(data) 
    } 
} 

/* Firefox, Chrome &c */ 
if (document.addEventListener) { 
    document.addEventListener('click', onClick, false) 
/* IE <9 */ 
} else if (document.attachEvent) { 
    document.attachEvent('onclick', function() { 
     return onClick({ target: event.srcElement }) 
    }) 
} 

当然,XSS问题,通过@Quentin提到的,是仍然是一个问题。但至少你不会像原始示例那样在内联处理函数中转义嵌套引号。

+0

document.body.addEventListener在IE中不起作用。我也尝试使用这个http://stackoverflow.com/questions/1695376/msie-and-addeventlistener-problem-in-javascript,但它只有当我有e.target.getAttribute('数据输入') – Nipuna 2012-01-11 05:01:25

+0

@Nipuna席尔瓦,我不确定你的问题与'attachEvent'是什么,但看到更新的答案。 – katspaugh 2012-01-11 14:14:31

2

试试这个,但请付诸实践之前重新考虑你的行动。

var i = "halo"; 
return '<a href="javascript:abccd(\''+i+'\');" ><img src="../images/btnsave2.png" style="margin:6px 0 0 6px;" height="13" width="13" /></a> '; 
+0

左右通过标准DOM有什么不好的做法? – Nipuna 2012-01-10 16:07:02

+0

如果'i'包含双引号,反斜线,新行(可能还有其他字符),则会中断。 – Quentin 2012-01-10 16:09:17

+1

这样做的第一个不好的实验就像Quentin所说的通过变量中的特殊字符。第二件事是你可以做一些更可靠的可重复使用的可持续代码,而不仅仅是“它可以工作,所以没关系”的代码。以更合适的方式完成你想要的东西的方法之一就是解决方案。 – khael 2012-01-10 16:54:47