HTML搭配JS(JavaScript)实现完全独立的评论组件,可移植,可复用,可读性强(附源码)

导读:如果您正在看这篇文章,想必您正在开发一个多人交互的网站,而踌躇自己写一个评论组件?

纵观BAT以及各种电子商务或博客等网站,无一不使用了评论这个功能。那么你能自己实现吗?

一、先欣赏一下各大网站的评论区图片

【CSDN】

HTML搭配JS(JavaScript)实现完全独立的评论组件,可移植,可复用,可读性强(附源码)_第1张图片


【百度】

HTML搭配JS(JavaScript)实现完全独立的评论组件,可移植,可复用,可读性强(附源码)_第2张图片


【知乎】

HTML搭配JS(JavaScript)实现完全独立的评论组件,可移植,可复用,可读性强(附源码)_第3张图片


暂时先列举三个网站的评论区设计,其它还有很多网站的评论区设计都很经典,比如:GitHub、YouTube等等。由于网络原因我就不一一截图列举了。

二、分析:主要从结构和源码入手

         1、回复者与作者的关系

HTML搭配JS(JavaScript)实现完全独立的评论组件,可移植,可复用,可读性强(附源码)_第4张图片

      如图所示:我们把文章作者定义为(Root),评论者定义为(Leaf),而评论者具有多层关系,因此分为第一第二等层级。而每个层级又拥有多个子节点 

2、应用

     实际应用其实并没有图片中那么复杂,而是更符合大众的直观感受。复杂体现在评论树的层级关系以及它们的层级关系表现上。所以为了更直观表达这种关系,各网站也是从传统的无限递归形式,转为表现两层关系,即评论者与回复者的关系即可。A级为评论者,直接对文章进行评论,那么对A的评论进行回复或者对回复A的评论的人进行回复的所有层级都被称为回复者。搞清了这个关系,那么设计起来就简单多了。

CSDN的网站的评论模块就采用两层关系设计,一方面是直观,一方面是操作简单,不用一层一层点开回复内容,同时减少了开发者的负担,而且维护起来也容易。百度也是两层关系设计,但以前不是。特别是以前看过YouTube网站,那层级关系忒复杂,等你把七八层的回复内容挨个点开时,你会发现主要内容已经消失不见。

3、f12源码(CSDN为例)

       两层关系的源码被一个div包裹,而里面有若干个ul标签,而ul标签里是n个li标签。让我们进一步看看这两个li标签分别渲染了评论区哪些部分。

HTML搭配JS(JavaScript)实现完全独立的评论组件,可移植,可复用,可读性强(附源码)_第5张图片

       第一个li标签渲染的是评论者模块,第二个li标签渲染的是回复者模块。(这里有一个小插曲,第二个li的class名字是不是有问题,确定是replay-box吗,是不是应该为reply-box?)

HTML搭配JS(JavaScript)实现完全独立的评论组件,可移植,可复用,可读性强(附源码)_第6张图片HTML搭配JS(JavaScript)实现完全独立的评论组件,可移植,可复用,可读性强(附源码)_第7张图片

     两个li标签其实属于同级关系,但却渲染了不同级别的内容。这种设计更利于维护和实现。第二个li标签相对于它的父节点也就是第一个li标签而言,只是将margin的左外边距右偏32px(相对于右边的外边距而言,源码大家自己可以再网页使用f12查看,不同的浏览器快捷键可能不一样)

HTML搭配JS(JavaScript)实现完全独立的评论组件,可移植,可复用,可读性强(附源码)_第8张图片

三、

从源码来看,层级结构大致是div中嵌套多个ul,而ul的多少代表有多少个评论者。

每个ul中嵌套两个li标签,分别渲染评论内容和回复内容两部分,回复内容在渲染上只要不与评论内容处于一个纵线即可直观区分它们之间的关系。具体如何实现均可看源码学习。

那么这样一个数据结构应该是什么样的呢?

我指的是前端的。首先肯定不是KVP的Map,最外层是多个ul,应该选择用数组,而数组里是不是应该还要用数组呢?

当然不是,虽然ul中嵌套多个li标签,根据行业经验前端不做过多的逻辑处理,如果用数组,就无法表达嵌套数组元素与外层数组元素的关系了,且无法携带描述信息。因此我想到了使用对象。对象可以封装描述每个评论单位的描述信息,同时可以携带一个数组,用来封装回复内容。这里要注意一点,回复内容从实现角度来说没有层级结构,他们只有关系,这样更直观。所以回复内容的父节点只有一个——父级评论者。如果后续考虑到数据结构的变化,我们可以在数据库中为每条回复内容增设两个字段,一个是超父节点ID,一个是直属父级节点ID,这样后续无论是改回递归形式呈现还是两级关系呈现,都不影响数据库的数据修改。

四、实现

代码我已经写好了,有不妥的地方请指正(代码注释后续我会抽时间加上)。




    
    Comment component implementation
    
    





五、代码运行截图

HTML搭配JS(JavaScript)实现完全独立的评论组件,可移植,可复用,可读性强(附源码)_第9张图片

谢谢大家的欣赏,我会在编程和编辑这条路上越走越好,送给仍然青年的自己!

你可能感兴趣的:(前端,javascript,css,html,html5)