这是我的ajax电话:
args
在$ online.append()里面,当我用任何参数调用chatuser()函数时,它返回语法错误。请建议我如何在这种情况下传递参数。
答案 0 :(得分:0)
我做了一个快速测试,这样做很好。检查我的代码段。主要问题是您传递的用户名没有引号(javascript会将其解释为变量)。
$(document).ready(function() {
/**
* Dummy data
*/
var data = [
{ user : 'User 1' },
{ user : 'User 2' }
];
/**
* Dummy chat user function
* @param user
* @param index
*/
function chatuser(user, index) {
console.log(user, data[index]);
}
// Variables
var j = 0,
len = data.length,
ul = $('.placeholder');
while(j < len) {
if(data[j].user) {
ul.append(jQuery("<li><a href=\"javascript:chatuser('" + data[j].user + "', "+j+");\">" + data[j].user + "</a></li>")); // Pass the user as a string and the current index in the array
}
j++;
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul class="placeholder"></ul>
我不知道为什么链接中的函数调用没有在代码片段中调用,但代码工作正常。
答案 1 :(得分:0)
这里有很多变化。最重要的是:
使用var
声明您的data
变量,使其不会泄漏到全局(窗口)对象上。
通过在成功处理程序中创建一个保留data
数组的函数,使用closures的概念。即使在success
函数退出后,此函数仍将继续访问您的数组。
预处理data
数组以删除不需要的内容并删除不必要的数据。你的循环运行得更快,你的闭包变量也不会消耗尽可能多的内存。
不要使用字符串构建DOM对象。它很混乱,当你忘记逃避特殊字符时会导致很多错误。相反,使用jQuery的text
和attr
函数来为您处理所有这些。
摆脱while循环。当你在数组中内置了一个非常方便的forEach
函数时,它是不必要的(它还会删除你首先不需要的额外变量)。
以下是示例代码:
$.ajax({
url: 'UserList.jsp',
success: function(val){
var data = JSON.parse(JSON.stringify(val));
if ($.isArray(data)){
// Filter the data array and stip it down to only the data we need
data = data
.filter(function(item){ return ( item && item.user ) ? true : false; })
.map(function(item){ return { user: item.user }; });
} else {
data = [];
}
data.forEach(function(item){
$("<a>")
.text(item.user)
.click(function(){
chatuser(item.user);
})
.appendTo($online);
j++;
});
},
error:function(val){
alert('fail');
}
});