node中局部刷新页面的问题 - CNode技术社区

node中局部刷新页面的问题
发布于 10 年前 作者 sssssskkk 8116 次浏览 最后一次编辑是 9 年前 来自 问答

在做评论发表,想要提交评论后整个页面不刷新,只刷新评论那里。用ajax,在form表单提交后,返回的data结果却是整个HTML文档,我不知道是哪里错了,还有查了下说用iframe局部刷新的,没用过,没找到例子。郁闷了大半天了,实在是不会呀!!恳请各位帮帮忙,感激不尽!

8 回复
 $(document).ready(function () {
 $('.follow_btn').click(function () {
 var $me = $(this);
 var action = $me.attr('action');
 var params = {
 follow_id: '571c1ff13f27a7c841bcb545',
 _csrf: 'fXBHtb9V-702e5JdP5zYvGqfvKBz4mqPXfv0'
 };
 $.post('/user/' + action, params, function (data) {
 if (data.status === 'success') {
 var $btns = $('.follow_btn');
 if (action === 'follow') {
 $btns.html('取消关注');
 $btns.attr('action', 'un_follow');
 } else {
 $btns.html('加入关注');
 $btns.attr('action', 'follow');
 }
 $btns.toggleClass('btn-success');
 }
 }, 'json');
 });
 });

照着这段代码改一下

@yakczh 你好啊,很不好意思麻烦你,我试着改了一下,报了个 500 (Internal Server Error) 错误 。如果data是序列化表单的话可以请求成功,但那样返回了整个HTML网页,只有刷新才能看到新的评论。

//jade页面

form#commentForm(method="POST",action="/user/comment")
 input(type="hidden",name="comment[movie]",value="#{movie._id}")
 if user
 input(type="hidden",name="comment[from]",value="#{user._id}")
 textarea(name="comment[content]")
 .con-btn
 button(type='button',class='user-has-sign') 提交

//

$('#commentForm .con-btn button').click(function(){
 var data = {
 movie:$('#commentForm').find('input').eq(0).val(),
 user:$('#commentForm').find('input').eq(1).val(),
 comment:$('#commentForm').find('textarea').val()
 };
 // var data=$('#commentForm').serialize();
 $.post('/user/comment', data, function (data) {
 console.log(status)
 if (data.status === 'success') {
 console.log(data)
 }else{
 console.log('err')
 }
 }, 'json');
 })
 
 // ERROR http://localhost:3000/user/comment 500 (Internal Server Error)

—是不是后台这里有问题?

var Comment = require(’.../models/comment.js’);

exports.save= function(req, res){

var _comment=req.body.comment;
var movieId=_comment.movie;
//回复
if(_comment.cid){ 
 Comment.findById(_comment.cid,function(err,comment){ 
 if(err){
 console.log(err)
 }
 var reply={
 from:_comment.from, 
 to:_comment.tid, 
 content:_comment.content
 }
 comment.reply.push(reply)
 comment.save(function(err,comment){
 if(err){
 console.log(err)
 }
 res.redirect('/movie/'+movieId)
 }) 
 })
}
 //新的评论
else{
 var comment=new Comment(_comment);
 comment.save(function(err,comment){
 if(err){
 console.log(err)
 }
 res.redirect('/movie/'+movieId)
 }) 
}

};

你用ajax将评论的数据发送到接口保存,然后接口只返回成功失败,在ajax请求成功后接受数据只需要判断成功失败就可以了呀,然后将用户输入的评论获取到用jquery将内容渲染到页面评论列表里不就好了

@liygheart 可是ajax的data返回的是整个HTML文档,不知道为啥是这个。 还是要在后台怎样设置一下返回保存后的评论。如果是返回整个HTML页面,我操作了一下动态生成DOM节点,结果data数据不能操作,难道是有什么方法操作吗? 还是我打开方式不对 ...

 //新的评论
else{
 var comment=new Comment(_comment);
 comment.save(function(err,comment){
 if(err){
 console.log(err)
 }
 res.redirect('/movie/'+movieId)
 }) 
}

这是你保存评论的操作?

如果是的话,返回不要重定向,将res.redirect() 换成 res.send({status: "success"}); 然后ajax里的dataType设置成json,接受到的数据就是json数据了

@liygheart 啊,成功了! 真是太谢谢了, res.send({status: ‘success’,comment:comment}) 这样就行了! 非常感谢你的帮助,小白不懂纠结了好久 。

res貌似还可以写成 res.json() 效果跟 res.send() 是一样的 nodeclub里是这样用的,我平时返回json都是直接send一个对象

@liygheart 恩!可以,十分感谢,记下了。

回到顶部

AltStyle によって変換されたページ (->オリジナル) /