我在做评论功能时学到的js一些思路
- 在提交评论的时候,如何判断是一级评论还是二级评论(因为都是通过一个文本域提交评论),思路:声明一个全局变量,如果是回复(二级评论)那么会触发点击回复事件,在这个事件的回调函数里给全局变量设置为true;如果没有设为true,则说明是提交一级评论。如何声明全局变量--》here
- 因为是通过一个按钮的点击事件实现回复和一级评论,所以需要用到一个事件触发多个函数的思路。看了一眼这篇博客有了一个思路~呵呵~通过全局变量的值来调用不同的函数。
- 复制引用:只说如何获取到当前页面的url。使用PHP获取的。
<input type="text" class="trackback-url" value="{{'http://'.$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].$_SERVER['REQUEST_URI']}}" />
 <button type="submit" class="quick-copy-btn">复制引用</button>
- button的默认行为:https://www.cnblogs.com/wisdomoon/p/3330856.html
- 回复的时候,replyname和内容是连在一起的,所以需要截取。但是js中好像没有删除字符串中指定长度的字符串的函数。使用substr从content中截取出replyname,但是content内容是不变的,所以还要把content中的replyname删除,才是真正的内容。具体做法如下:(len是全局变量,这里值截取部分代码,不完整)
var content = $('#comment').val(); //评论内容,需要处理,把replyname去掉
 //截取content,已经获取到replyname的长度,直接把他截取掉即可"@+replyname",并且还可以通过截取获得replyname的值,不然没办法获取
 var replyname = content.substr(0,len+1).substr(1); //len+1是因为还有个@
 content = content.substr(len+1); //不需要删除replyname,直接从replyname后开始截取不就OK了
 alert(replyname);alert(content);
- 文章评论的js代码(不包括PHP后台,html)
<script type="text/javascript"> 
 var isSubcomment = false; //false 默认是一级评论
 var pid;
 var len;
 //点击一级评论de回复触发此事件函数
 function addcom(obj) {
 //不这样写了,直接把回复的对象填到模板评论框中,就像博客园的回复一样。一级评论和回复都用同一个文本域。
 var replyname = $(obj).parent().prev().text();
 //在这里获取replyname的长度,因为在其他地方获取不到replyname的值,也就更不能获取长度了
 len = replyname.length;
 $('#comment').val('@'+replyname+'\n');
 //滚动到评论文本域位置
 scrollTo('#comment',300);
 isSubcomment = true; //true 表示提交二级评论
 pid = $(obj).siblings('.parent_id').text();
 } //点击二级评论的回复触发此事件函数
 function addsubcom(obj) {
 var replyname = $(obj).parent().siblings('#nickname').text();
 len = replyname.length;
 $('#comment').val('@'+replyname+'\n');
 scrollTo('#comment',300);
 isSubcomment = true; //true 表示提交二级评论
 pid = $(obj).siblings('.parent_id_2').text();
 } /*不能在addcom函数里触发.btn-submit点击事件,应该是交给.btn-submit事件回调函数自己判断触发那个函数。这样就不会和addcom
 * 耦合,否则在addcom函数里触发此事件耦合度太高。最主要的是在addcom里触发事件实现不了想要的功能。。。
 * 点击提交评论按钮的时候,需要判断提交的是一级评论还是二级评论。通过全局变量来判断。
 * 行内事件和其他类型绑定事件不能共存?
 */
 function submitbtn() {
 if(isSubcomment === true){
 //提交二级评论
 sentsubcomment();
 }else{
 sentcomment();
 } } //获取评论文本域提交按钮元素,调用此函数发送ajax
 function sentsubcomment() {
 // alert('提交二级评论');
 var content = $('#comment').val(); //评论内容,需要处理,把replyname去掉
 //截取content,已经获取到replyname的长度,直接把他截取掉即可"@+replyname",并且还可以通过截取获得replyname的值,不然没办法获取
 var replyname = content.substr(0,len+1).substr(1); //+1是因为还有个@
 content = content.substr(len+1); //不需要删除replyname,直接从replyname后开始截取不就OK了
 var parent_id = pid;//需要动态获取,获取parent_id=0的评论的id作为回复的parent_id
 var nickname = $('#username').text();//昵称即登录的用户名,本来想做为全局变量获取一次,但是声明为全局变量就是undefined,wtf?
 var head_pic = $('.photo').attr('src');//登录用户的头像
 var post_id = $('#comment_post_ID').val();
 $.ajax({
 type: 'post',
 url: '/comment',
 data: {content:content, parent_id:parent_id, nickname:nickname, head_pic:head_pic, post_id:post_id, replyname:replyname},
 headers: {
 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
 },
 success: function(data) {
 if(data.status){
 location.reload();
 }else{
 alert('评论失败,请重试');
 }
 },
 error: function() {
 alert('未知错误,请重新发送');
 },
 })
 } //当发表评论的时候,是需要直接触发.btn-submit按钮事件的。所以这里就有分支。
 //1.通过事件执行顺序来判断是一级评论还是二级评论 2. 通过文本域中是否有replyname判断是一级评论还是二级评论
 function sentcomment() {
 // alert('提交一级评论');
 var content = $('#comment').val(); //评论内容
 var parent_id = 0;//需要动态获取
 var nickname = $('#username').text();//昵称即登录的用户名,本来想做为全局变量获取一次,但是声明为全局变量就是undefined,wtf?
 var head_pic = $('.photo').attr('src');//登录用户的头像
 var post_id = $('#comment_post_ID').val();
 $.ajax({
 type: 'post',
 url: '/comment',
 data: {content:content, parent_id:parent_id, nickname:nickname, head_pic:head_pic, post_id:post_id},
 headers: {
 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
 },
 success: function(data) {
 if(data.status){
 location.reload();
 }else{
 alert('评论失败,请重试');
 }
 },
 error: function() {
 alert('未知错误,请重新发送');
 },
 }) } //滚动到指定位置
 function scrollTo(element,speed) {
 if(!speed){
 speed = 300;
 }
 if(!element){
 $("html,body").animate({scrollTop:0},speed);
 }else{
 if(element.length>0){
 $("html,body").animate({scrollTop:$(element).offset().top-200},speed);
 }
 }
 } //一级评论移入显示回复按钮
 function addreply(obj) {
 // $(obj).append('<a href="javascript:;"> 回复# </a>'); //这种抓取不到回复文本,无法实现点击事件
 //想到了,我不用append动态添加“回复”,我用样式控制显示和隐藏
 $(obj).find('a').css('display','inline-block'); } //一级评论移出隐藏回复按钮
 function removereply(obj) {
 // $(obj).find('a').remove();
 $(obj).find('a').css('display','none');
 } //二级评论移入显示回复按钮(所有一级评论之外的回复我都统称二级评论)
 function addsubreply(obj) {
 // alert(2);
 // $(obj).append('<a href="javascript:;">回复#</a>');
 // $(this).off('click');
 $(obj).find('a').css('display','inline-block');
 } //二级评论移出隐藏回复按钮
 function removesubreply(obj) {
 // $(obj).find('a').remove();
 $(obj).find('a').css('display','none');
 } </script>
我在做评论功能时学到的js一些思路的更多相关文章
- 在用easyui中做CRUD功能时,当删除一行或多行数据后再点击修改会提示你选中了多行,如何解决这个bug了?
		在用easyui中做CRUD功能时,当删除一行或多行数据后再点击修改会提示你选中了多行,如何解决这个bug了? 在删除成功后,加上这句话就可以了:$("#dg").datagrid ... 
- MIRO做发票校验时实现替代功能的多种方式
		http://blog.sina.com.cn/s/blog_3f2c03e30100ngje.html MIRO做发票校验时,如果需要对产生的会计凭证做某些字段的替代,可有多种方法. 1.GGB1替 ... 
- 一步步搭建自己的博客 .NET版(2、评论功能)
		前言 这次开发的博客主要功能或特点: 第一:可以兼容各终端,特别是手机端. 第二:到时会用到大量html5,炫啊. 第三:导入博客园的精华文章,并做分类.(不要封我) 第四:做 ... 
- React.js 小书 Lesson16 - 实战分析:评论功能(三)
		作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson16 转载请注明出处,保留原文链接和作者信息. 接下来的代码比较顺理成章了.修改 Commen ... 
- React.js 小书 Lesson14 - 实战分析:评论功能(一)
		作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson14 转载请注明出处,保留原文链接和作者信息. 课程到这里大家已经掌握了 React.js 的 ... 
- 如何通过Gitalk评论插件,5分钟为你的博客快速集成评论功能
		欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 高级架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.ex ... 
- 第 14 篇:交流的桥梁“评论功能”——HelloDjango 系列教程
		截止到目前为止我们的 django blog 文章展示部分,已经实现的"八九不离十"了.你以为本系列文章就要结束了吗?不能够!新的征程才刚刚开始,HelloDjango 系列文章刚 ... 
- 如何使用jmeter做一个功能的性能测试
		一.为什么又再次写类似的文章? 在博客园和公号写文章,已经快两年了,所以自然在公号和博客园都能联系到我的. 也就是几天前,有个人加我微信,对于总有人加我好友,我已经觉得不奇怪了,为什么呢? 加我好友的 ... 
- VuePress 博客优化之增加 Vssue 评论功能
		前言 在 <一篇带你用 VuePress + Github Pages 搭建博客>中,我们使用 VuePress 搭建了一个博客,最终的效果查看:TypeScript 中文文档. 本篇讲讲 ... 
随机推荐
- kafka的错误日志log监控
			例如:需要监控下面的日志中的error 日志文件是这个 /data1/confluent-5.2.2/logs/connect/kafka-connect.log 1/ 参考上一篇安装zabbix_a ... 
- 面向对象编程 OOP
			OOP,Object Oriented Programming,原来就是面向对象的编程. 面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物. OOD,Object Or ... 
- SVN随笔记录(一)
			svn是版本控制系统 为何使用svn? ~团队在开发同一个项目时对项目进行模块划分,在第一阶段结束后进行部分整合时,提交至服务器上合并. ~多人对同一版本的同一代码进行修改后,合并时会出现冲突,此是需 ... 
- AppCan模拟器调试
			来源: 1, 页面CSS调试 2, JS调试 3, 插件请打包后手机调试 4, 打开另一个页面示例: appcan.button("#myBtn", "ani-uct&q ... 
- 手写一个python迭代器
			分析 我们都知道一个可迭代对象可以通过iter()可以返回一个迭代器. 如果想要一个对象称为可迭代对象,即可以使用for,那么必须实现__iter __()方法. 在一个类的实例对象想要变成迭代器,就 ... 
- API 网关性能比较:NGINX vs. ZUUL vs. Spring Cloud Gateway vs. Linkerd
			前几天拜读了 OpsGenie 公司(一家致力于 Dev & Ops 的公司)的资深工程师 Turgay Çelik 博士写的一篇文章(链接在文末),文中介绍了他们最初也是采用 Nginx 作 ... 
- 第四章 子查询 T-SQL语言基础
			子查询 SQL支持在查询语句中编写查询,或者嵌套其他查询. 最外层查询的结果集会返回给调用者,称为外部查询. 内部查询的结果是供外部查询使用的,也称为子查询. 子查询可以分为独立子查询和相关子查询.独 ... 
- JS图片轮播[左右轮播
			直接可以用,网上摘下来的! <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http ... 
- C# 文件基本操作
			概括的说,File,FileInfo,FileStream是用于文件 I/O 的类,StreamReader是用于从流读取和写入流的类,使用之前都需using System.IO. 先定义一个TXT文 ... 
- 【Lucene】小谈lucene的BooleanQuery查询对象
			BooleanQuery用于逻辑查询,即所谓的组合查询,具体的逻辑关系如下: 一个具体的使用测试,如下: 
