博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
04: 层级评论
阅读量:4882 次
发布时间:2019-06-11

本文共 8288 字,大约阅读时间需要 27 分钟。

目录:抽屉项目之js最佳实践

目录:

1.1 层级评论效果图 

    功能1:点击"评"展示本帖子所有评论,生成一个评论发布框

    功能2:鼠标滑过评论时会显示"回复",点击进行回复
    功能3:提交评论内容

 

       

1.2 各功能点code

  1、功能1:点击"评"展示本帖子所有评论,生成一个评论发布框

文能一剪梅,武能嘿嘿嘿
评(0)
tom
在 2018-01-07 09:51:29 发布
  • 我: 评论01  2018-01-07 10:48:31
    回复
    • 我: 回复品论01  2018-01-07 10:49:02
      回复
  • 我: 评论02  2018-01-07 10:49:14
    回复
    • 我: 回复品论02  2018-01-07 10:49:27
      回复
生成展示帖子的HTML文件
触发show_comment函数的html
/* 展示该帖子的所有评论 */function show_comments(ele, post_id) {    // 先隐藏所有帖子的评论div,然后展示用户点击的帖子的评论div    $("div.comment_container").addClass("hide");    var current_comment_container = $(ele).parent().parent().parent().siblings(".comment_container").removeClass("hide");    // 插入一个textarea    var comment_text_container = current_comment_container.children(".comment_text_container");    //console.log(comment_text_container);    comment_text_container.children().remove();    var comment_text = document.createElement('textarea');    comment_text.className = "comment_text";    comment_text_container.append(comment_text);    var send_btn = document.createElement('a');    send_btn.className="send_btn";    send_btn.innerText = "发送";    send_btn.href = "javascript:void(0)";    send_btn.setAttribute("onclick", "post_comment(this,"+post_id+")");    comment_text_container.append(send_btn);    // 获取这个帖子的所有评论    var posts = get_comments(post_id);    var comment_content_container = current_comment_container.find(".comment_content_container")[0];    build_comment_tree(posts,comment_content_container);}
show_comments(js) 展示该帖子的所有评论
/* 获取指定帖子的评论 */function get_comments(post_id) {    var comments;    $.get({        url:"/app01/get_comments/",        data:{
"post": post_id}, dataType: "json", async: false, success:function (response) { if(response.status=='ok'){ comments = response['data']; } } }); return comments;}
get_comment(js) 获取指定帖子的评论
/* 创建评论的HTML */function build_comment_tree(posts, comment_content_container) {    if(posts.length>0){        // 先进行清理工作        $(comment_content_container).text("").children().remove();        // 添加一个根ul        var root_ul = document.createElement('ul');        comment_content_container.appendChild(root_ul);        // 循环每个帖子        for(var key in posts){            // 生成一个li节点,带comment_id,该li中也带一个ul用于存放子评论            var li = document.createElement('li');            li.setAttribute("comment_id", posts[key]['id']);            li.setAttribute("display_name", posts[key]['user__display_name']);            li.setAttribute("user_id", posts[key]['user_id']);            // li的内容            var comment_content_div = document.createElement('div'); // 评论的具体内容            comment_content_div.className="comment_content_div";            comment_content_div.setAttribute("onmouseover","show_reply_btn(this,true)");            comment_content_div.setAttribute("onmouseout","show_reply_btn(this,false)");            var display_name = posts[key]['user__display_name']==$("div.user_info #display_name").text() ? "我" : posts[key]['user__display_name'];            comment_content_div.innerText = display_name +                ": " +                posts[key]['content']+                "  "+                posts[key]['create_on'];            var comment_bar = document.createElement('div');    // 针对该评论的工具栏            var reply_a = document.createElement('a');            reply_a.className="reply_btn hide";            reply_a.innerText = "回复";            reply_a.href = "javascript:void(0);";            reply_a.setAttribute("onclick", "reply("+posts[key]['id']+",this)");            //comment_bar.appendChild(reply_a);            comment_content_div.innerHTML += reply_a.outerHTML;            var comment_row = document.createElement('div');    // 一条评论的div,包括了以上两个div            comment_row.className="comment_row";            comment_row.appendChild(comment_content_div);            comment_row.appendChild(comment_bar);            li.appendChild(comment_row);    // 将整条评论+工具添加到li中            // 用于存放子评论的ul,下方可以没有任何子评论            var sub_ul = document.createElement('ul');            li.appendChild(sub_ul);            if(posts[key]['reply_to']){                // 评论有reply_to                $(comment_content_container).find("li[comment_id="+posts[key]['reply_to']+"]").children("ul").append(li);            }else {                // 评论没有reply_to,将li加到根部的ul                root_ul.appendChild(li);            }        }    }else{        $(comment_content_container).text("暂时还没有评论");    }}
build_comment_tree(js) 创建评论的HTML
# 获取对应帖子的所有评论def get_comments(request):    ret = {'status': 'ok'}    if request.method == 'GET':        post_id = request.GET.get("post")        post = get_object_or_404(Post, id=post_id)        comments = Comment.objects.filter(post=post).values("id",                                                            "user_id",                                                            "user__display_name",                                                            "create_on",                                                            "content",                                                            "reply_to").order_by('id')        ret['data'] = list(comments)        return HttpResponse(json.dumps(ret, cls=DateTimeJSONEncoder))
views.py 获取对应帖子的所有评论

  2、功能2:当鼠标滑过评论时会显示"回复",点击进行回复

我: 评论01  2018-01-07 10:48:31
回复
触发show_reply_btn和reply函数的html
/*显示或隐藏"回复"标签*/function show_reply_btn(ele,show) {    show?$(ele).find(".reply_btn:first").removeClass("hide"):$(ele).find(".reply_btn:first").addClass("hide")}
show_reply_btn(js)显示或隐藏"回复"标签
//点击某个评论的回复按钮后,修改textarea的comment_id属性并让其得到焦点function reply(comment_id, ele) {    if(!is_login()){        show_login_reg_frm();        return false;    }    var reply_to_user = $(ele).parent().parent().parent().attr("display_name");    $("textarea.comment_text").val("").attr("reply_to",comment_id).attr("placeholder","回复 "+reply_to_user).focus();}
reply(js) 点击某个评论的回复按钮后,修改textarea的comment_id属性并让其得到焦点

  3、功能3:提交评论内容

触发post_commen(js)函数的html
/* 提交评论的内容 */function post_comment(ele, post_id) {    var comment_obj = {};    comment_obj['post']=post_id;    var ta = $(ele).siblings('textarea');    comment_obj['comment_text'] = $.trim(ta.val());    if(comment_obj['comment_text'].length==0){        alert("请输入评论内容再提交");        return false;    }    var reply_to = $(ele).siblings('textarea').attr("reply_to");    if(reply_to){        comment_obj['reply_to'] = reply_to    }    // ajax上传评论    $.post({        url:"/app01/post_comment/",        data:comment_obj,        dataType:"json",        success:function (response) {            if(response.status=='ok'){                // 评论成功                alert("评论成功");                var show_comments_btn = $(ele).parent().parent().parent().find('.show_comments_btn')[0];                show_comments(show_comments_btn, post_id)            }        }    });}
post_commen(js) 提交评论的内容
def post_comment(request):    ret = {
'status': 'ok'} if request.method == 'POST': user_id = request.session.get("current_user")['id'] post_id = request.POST.get("post") post = get_object_or_404(Post, id=post_id) comment_text = request.POST.get("comment_text") reply_to = request.POST.get("reply_to") Comment.objects.create(user_id=user_id, post=post, content=comment_text, reply_to=reply_to) post.comment_count += 1 post.save() return HttpResponse(json.dumps(ret))
views.py 提交品论内容

 

转载于:https://www.cnblogs.com/xiaonq/p/8227622.html

你可能感兴趣的文章
SQLServer之数据库行锁
查看>>
OFDM仿真
查看>>
浅谈linux内核中内存分配函数
查看>>
写在读研初期
查看>>
开环增益对负反馈放大电路的影响
查看>>
MySQL-ERROR 2003
查看>>
SQL Server2012-SSIS的包管理和部署
查看>>
JavaScript内置对象
查看>>
如何把js的循环写成异步的
查看>>
ER图是啥?
查看>>
too many include files depth = 1024错误原因
查看>>
HTTP协议详解(三)
查看>>
Android零基础入门第84节:引入Fragment原来是这么回事
查看>>
解析SQL Server之任务调度
查看>>
参考资料地址
查看>>
08.路由规则中定义参数
查看>>
Pandas截取列部分字符,并据此修改另一列的数据
查看>>
java.lang.IllegalArgumentException
查看>>
【Spark】编程实战之模拟SparkRPC原理实现自定义RPC
查看>>
接口实现观察者模式
查看>>