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

在做评论发表,想要提交评论后整个页面不刷新,只刷新评论那里。用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 恩!可以,十分感谢,记下了。

回到顶部