以下代码前后端交互以Django模板语法为例

先来以伪代码来示意用法:

HTML部分:

JS动态插入部分代码:

运行之后我们来浏览器看检查打印的内容:

看插入前后打印结果我们可以得知

  1. $title[0].innerHTML = $title.html() + '<p>嘿嘿</p>';

这一句只是在原标签内部追加了一个

  1. <p>嘿嘿</p>

原理解析:

$title.html()获取到了<tr>标签内部所有标签及文本,拿到的是字符串格式

然后让它+一个p标签,然后将相加后的整体重新加入到<tr>标签内部

innerhtml是原生JS的方法,它区别于innertext,innerhtml可以识别插入内容中的html标签

innertext会将插入内容当文本插入。

下面我们来看JS动态将子评论插入父评论下面显示的例子:

页面效果:

一个父评论为作为一楼展示,子评论都展示在父评论下面。

渲染思路:

1、父评论由页面加载时以模板渲染的方式加载和渲染

2、子评论在JS中定义一个function f(){},定义后直接f()调用,作用是向后端发送ajax请求,获取到所有子评论。

3、将子评论跟根据父评论id动态插入到父评论后面

首先看一篇文章父评论渲染HTML代码:

待渲染的子评论字符串代码:

JS渲染的完整代码:

  1. function f() {
  2. $.ajax({
  3. url: '/get_son_token/',
  4. type: 'post',
  5. data: {
  6. 'csrfmiddlewaretoken': '{{ csrf_token }}',
  7. 'code': 'get_son_token',
  8. 'article_id': $("#id_article").val()
  9. },
  10. success: function (data) { //data为后端返回的子评论数据,格式为:{'code':200,'msg':[子评论1,子评论2,子评论3...]}
  11. console.log(data.msg); //子评论是一个个字典{'id':10,'create_time':'2019-06-22 22:12:12','parent_id':5,'user__usrname':'egon','user_id':'2','parent_user_username':'dxx'}
  12.  
  13. $.each(data.msg, function (index, obj) {
  14. let id = obj.id;
  15. let content = obj.content;
  16. let create_time = obj.create_time;
  17. let parentId = '#' + obj.parent_id;
  18. let username = obj.user__username;
  19. let user_id = obj.user_id;
  20. let parent_username = obj.parent__user__username;
  21. //一条待插入的回复记录
  22. str = `<div><p>
  23. <a href='/${username}/'>${username}</a>
  24. 回复: <a href="/${parent_username}/">${parent_username}</a>&nbsp;&nbsp;<span>${create_time}</span>&nbsp;&nbsp;
  25. <span>
  26. <a class='replay' username=${username} parent_id=${id}>回复</a>&nbsp;&nbsp;
  27. <a class='cite' content=${content}>引用</a>
  28. </span>
  29. </p>
  30. <p>内容: <span>${content}</span></p>
  31. <div id="${id}"></div>
  32. </div>`;
  33.  
  34. //$(parentId).html()取到所有上一级评论内部html及文本
  35. //与新插入的记录相加后再覆盖原标签内部所有html及文本
  36. $(parentId)[0].innerHTML = $(parentId).html() + str;
  37. })
  38. }
  39. })
  40. }
    f(); //页面加载即调用

Django后端为ajax提供数据的代码:

  1. import datetime
  2. def get_son_token(request):
  3. if request.POST.get('code') == 'get_son_token':
  4. #取出所有该文章下的子评论
  5. token_list = models.Token.objects.exclude(parent_id=None).filter(article_id=request.POST.get("article_id")).values('id',
                      'user__username','parent_id','create_time','content','user_id','parent__user__username')
  6. token_list = [dict(obj) for obj in token_list]
  7.  
  8. for obj in token_list:
  9. obj['create_time'] = obj['create_time'].strftime("%Y-%m-%d %X")
  10. #obj: {'id': 23, 'user__username': 'kevin', 'parent_id': 13, 'create_time': '2019-06-24 22:49:32', 'content': '你又在拍马屁dxx', 'user_id': 39, 'parent__user__username': 'dxx'}
  11. back_dic = {'code': 200, "msg": token_list}
  12. return JsonResponse(back_dic)

数据库存储结构:

parent_id为自关联字段,article_id为文章外键关联,user_id为当前评论人(外键)

通过JS动态追加标签,以父评论子评论为例的更多相关文章

  1. js|jq获取兄弟节点,父节点,子节点

    08.19自我总结 js|jq获取兄弟节点,父节点,子节点 一.js var parent = test.parentNode; // 父节点 var chils = test.childNodes; ...

  2. js动态追加的元素如何触发事件

    一般通过js或者jQuery动态添加的元素标签,通过该元素标签.class.id触发事件,是无效的.如下所示: <body> <input type="text" ...

  3. JS获取节点的兄弟,父级,子级元素的方法(js获取子级获取到换行与空格元素-FF)

    先说一下JS的获取方法,其要比JQUERY的方法麻烦很多,后面以JQUERY的方法作对比. JS的方法会比JQUERY麻烦很多,主要则是因为FF浏览器,FF浏览器会把你的换行也当最DOM元素 < ...

  4. js动态插入标签代码(insertAdjacentHTML)

    做网页时通过ajax请求获取到数据后,有的需要把数据拼接到带有各种标签的字符串中,拼接完字符串就需要把字符串动态添加到网页上的某个位置,举个

  5. js 面向对象 动态添加标签

    有点逻辑 上代码 thml布局 点击查看代码 <!DOCTYPE html> <html lang="en"> <head> <meta ...

  6. 通过JS动态的修改HTML元素的样式和增添标签元素等

    一. 通过JS动态的修改HTML元素的样式   1. 要想在js中动态的修改HTML元素的样式,首先需要写document,    document我们称之为文档对象,这个对象中保存了当前网页中所有的 ...

  7. easyui 如何为标签动态追加属性实现渲染效果

    简述一下在项目遇到的问题,这边有一个需求,选择不同类型,加载不同的div标签(其中属性是否必填是区分类型的关键) html界面是这样的 <div class="grid_1 lbl&q ...

  8. JS动态添加的标签无法绑定事件解决方案~~~

    今天用ajax实现动态插入数据时发现监听一直不起作用,一样的代码,非动态的就可以监听实现 这是困扰了我近一个小时的bug,后面才理解到可能是动态插入导致的! 看了看网上的解决方案,似乎都不太通俗,讲的 ...

  9. 为什么JS动态生成的input标签在后台有时候没法获取到

    最近在做一个产品添加的功能,需求有点奇葩,所以在添加的时候免不了要用到动态生成控件,然后我就使用了JS去动态生成一些 checkbox类型的input标签,在以前用asp.net在后台生成的input ...

随机推荐

  1. Node.js 调试小技巧

    小技巧--使用 supervisor如果你有 PHP 开发经验,会习惯在修改 PHP 脚本后直接刷新浏览器以观察结果,而你在开发 Node.js 实现的 HTTP 应用时会发现,无论你修改了代码的哪一 ...

  2. scroll([[data],fn])

    scroll([[data],fn]) 概述 当用户滚动指定的元素时,会发生 scroll 事件. scroll 事件适用于所有可滚动的元素和 window 对象(浏览器窗口).大理石平台支架 参数 ...

  3. 001_C#我的第一个串口上位机软件

    (一)首先感谢杜洋工作室 < 入门 C#设计 >带来的视频教学 (二)本次设计从会单片机但是又不会上位机又想搞简单上位机的人群角度提供教程 (三)本次教程的目的是制作普通的串口软件,从而实 ...

  4. 五十四.自定义镜像及仓库、持久化存储 、 Docker网络架构

    1. 制作自定义镜像(base基础镜像,搭建共性环境) 基于centos镜像使用commit创建新的镜像文件 基于centos镜像使用Dockerfile文件创建一个新的镜像文件   1.1 使用镜像 ...

  5. 2018 Nowcoder Multi-University Training Contest 5

    Practice Link A. gpa 题意: 有\(n\)门课程,每门课程的学分为\(s_i\),绩点为\(c_i\),要求最多删除\(k\)门课程,使得gpa最高. gpa计算方式如下: \[ ...

  6. 【csp模拟赛3】bridge.cpp--矩阵加速递推

    题目描述 穿越了森林,前方有一座独木桥,连接着过往和未来(连接着上一题和下一题...). 这座桥无限长. 小 Q 在独木桥上彷徨了.他知道,他只剩下了 N 秒的时间,每一秒的时间里,他会向 左或向右移 ...

  7. 利用前端三大件(html+css+js)开发一个简单的“todolist”项目

    一.介绍 todolist,即待办事项.在windows android ios上参考微软家出的那个To-Do应用,大概就是那样的.我这个更简单,功能只有“待办” “已完成”两项,并且是在浏览器打开的 ...

  8. 前端使用lodop如何获取打印状态

    前面已经说过,如何简单使用lodop了,今天说一下如何获得lodop的打印状态? 在教程里面找了半天,摸索出来了一套. template: <!-- 实验代码 --> <div> ...

  9. 2-SAT两题

    看了大白书,学习了一下two-sat,很有意思的算法.题目就是大白书上的两题. 仅仅放一下代码作为以后的模板参考. #include <stdio.h> #include <algo ...

  10. hibernate-validator校验框架学习

    1.引入jar包 <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate ...