如何在锚标签内的JavaScript函数调用中正确传递参数?
问题分析与解决方案
你的语法错误出在拼接chatuser()函数参数时没有给字符串值加引号。举个例子:如果data[j].user的值是"amit",你当前的代码拼出来的HTML会是:
<a href='javascript:chatuser(amit)'>'amit'</a>
这里amit没有被引号包裹,浏览器会把它当作一个变量而非字符串,自然会抛出语法错误。
修正方案1:正确拼接带引号的参数
你需要给参数添加引号,同时注意转义避免引号冲突,比如用双引号包裹参数并转义:
$online.append("<a href='javascript:chatuser(\""+data[j].user+"\")'>"+data[j].user+"</a>");
或者用单引号包裹并转义:
$online.append('<a href="javascript:chatuser(\''+data[j].user+'\')">'+data[j].user+'</a>');
这样拼出来的HTML会是正确的:
<a href='javascript:chatuser("amit")'>amit</a>
更推荐的方案2:用jQuery创建元素(避免XSS和语法问题)
直接拼接HTML字符串很容易因为用户输入的特殊字符(比如"、'、<)引发新问题,甚至存在XSS风险。更安全的做法是用jQuery的API动态创建元素并绑定点击事件:
// 创建a标签 var userLink = $('<a>', { text: data[j].user, href: 'javascript:void(0)' // 或者直接不设置href,用点击事件触发 }); // 绑定点击事件,传递参数 userLink.click(function() { chatuser(data[j].user); }); // 添加到目标元素 $online.append(userLink);
这种方式不仅彻底避免了语法错误,还能防止恶意用户输入特殊字符破坏页面或发起攻击,代码可读性也更强。
另外提一句:你的data = JSON.parse(JSON.stringify(val));其实有点多余,如果UserList.jsp返回的是JSON格式,直接在AJAX里设置dataType: 'json',success回调里的val就已经是解析好的对象了,不用再手动解析。比如:
$.ajax({ url: 'UserList.jsp', dataType: 'json', // 自动解析返回的JSON数据 success: function(data){ // 这里data已经是解析后的对象 var len = Object.keys(data).length; for(var j=0; j<len; j++){ if(data[j].user){ // 用上面推荐的方式创建链接 var userLink = $('<a>', {text: data[j].user, href: 'javascript:void(0)'}); userLink.click(function() { chatuser(data[j].user); }); $online.append(userLink); } } }, error:function(val){ alert('fail'); } });
内容的提问来源于stack exchange,提问作者AMIT KUMAR
相关产品推荐
相关产品推荐

