操作ajax生成页面的一个问题
一般而言,js代码都放在页面的底部。在做项目的过程中,发现放在底部的代码没有执行,原来操作的是ajax生成的部分。这时候,页面加载js的顺序就要小心了。例子如下:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>无标题文档</title>
</head>
<body>
<div id="ajaxContent"></div>
<script src="http://apps.bdimg.com/libs/jquery/2.1.1/jquery.min.js"></script>
<script>
var param1="";
var html = '';
$.ajax({
type: "post",
url: "test.json",
data: {username:$("#username").val(), content:$("#content").val()},
dataType: "param1="+param1,
success: function(data){
$.each(data, function(commentIndex, comment){
html += '<div class="comment"><h6>' + comment['username']
+ ':</h6><p class="para"' + comment['content']
+ '</p></div>';
});
$('#ajaxContent').append(html);
}
});
//操作ajax部分
$('.comment').css('color','red');
</script>
</body>
</html>
Ajax没有完成,这时候,页面元素还不完整,操作ajax生成部分的代码其实已经执行了,而jquery没有选中页面元素又不会报错,参见:http://www.cnblogs.com/xiaochongchong/p/5497343.html 。
解决方法:把底部的代码封装成一个函数,然后等待ajax请求成功,页面生成完整后。后调用这个函数。对上面例子的稍加修改:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>无标题文档</title>
</head>
<body>
<div id="ajaxContent"></div>
<script src="http://apps.bdimg.com/libs/jquery/2.1.1/jquery.min.js"></script>
<script>
var param1="";
var html = '';
//ajax请求
$.ajax({
type: "post",
url: "test.json",
data: {username:$("#username").val(), content:$("#content").val()},
dataType: "param1="+param1,
success: function(data){
$.each(data, function(commentIndex, comment){
html += '<div class="comment"><h6>' + comment['username']
+ ':</h6><p class="para"' + comment['content']
+ '</p></div>';
});
$('#ajaxContent').append(html);
//append成功后操作生成的部分
operate();
}
});
//操作ajax部分,封装函数
function operate(){
$('.comment').css('color','red');
}
</script>
</body>
</html>
总结:js操作ajax生成的部分。操作的代码,应该放页面生成之后。
如果要对ajax生成的部分添加事件。除了上面的做法:在ajax数据获取到,append到整个页面中之后再添加。除此之外,还可以用事件代理的方法实现,原生js的可以实现,jquery也可以实现。
Jquery事件代理(委托)主要用到两个方法:live(),delegate()。详细说明参考

浙公网安备 33010602011771号