前端如何实现:在不刷新页面的情况下实时看到自己的评论

功能描述

1、类似CSDN论坛 右上角的消息通知 如果有新消息 整个页面不刷新 右上角的消息数字即时+1
2、类似于论坛评论区 ,发布评论之后,不刷新页面就可以立刻看到自己的评论

(2020-5-3更新)最终解决方案:使用Vue绑定评论区数据,v-for生成ul li标签,提交评论后,用axios(ajax)同步数据,就能实现只刷新评论区。

新浪微博的评论区实现方式

观察了一下新浪微博的评论区实现,从下面的图可以看出,因为时间固定显示为10秒前,因此可以推断:
点击“评论”之后,评论框的 div 只是在本地 append 的,而不是去刷新整个评论区(除非你去手动刷新整个页面)。可以参考这个思路

在这里插入图片描述

web 页面的解决方案

网上提供的 n 多种实现方式,可以参考一下思路:

1)通过ajax定时提交刷新,不知道你是全部刷新还是通过ajax的方式提交刷新,理论上如果通和AJAX刷新的话应是可以的。
2)使用html5的websocket功能。
3)思路:在获取页面的时候,分配session然后去做定阅通知,编辑完了之后发消息给定阅的频道,再更新
4)用 jira
5) 这个地方基本上都是采用的轮训吧,只有一些实时性非常高的才会选择使用WebSocket 另外还有一种采用消息中间件的方式
6)signalr 应该是可以的

winform 的解决方案

winform就比较好实现了,用委托或者订阅吧

附:(障眼法)本地追加div的思路及示例

效果:点击“写评论”后,下方追加一个富文本编辑框(使用WangEditor)div。

目前点击保存按钮后的的刷新方式是使用window.location.reload();刷新整个页面,此时浏览器拖动条还会默认保持在原来的位置,所以用户体验还好。

若想要实现在本地追加新评论div,可以参照下方 js 代码的 CommentNode(...) 函数。
在这里插入图片描述

HTML

引入 CSS JS

<link href="/static/bootstrap/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" type="text/css" href="/static/js/easyui/themes/icon.css">
<script src="/static/js/jquery-2.1.1.min.js"></script>
<script src="/static/bootstrap/js/bootstrap.min.js"></script>
<script src="/static/js/echarts-4.2.1.js" charset="UTF-8"></script>
<link rel="stylesheet" type="text/css" href="/static/css/editorStyle.css"><!--自定义CSS-->

<script type="text/javascript" src="/static/js/jquery.form.min.js"></script>
<script type="text/javascript" src="/static/js/wangEditor.min.js"></script>
<script src="/static/js/paramconvert.js" charset="UTF-8"></script><!--自定义JS-->
<script src="/static/js/editorUtils.js" charset="UTF-8"></script><!--自定义JS-->

Body 核心代码

<!--评论区begin-->
<h4 style="display: inline">简评</h4>
<button type="button"
        style="position:absolute;right: 68px"
        onclick="javascript:appendHtml('others-comment-area',new WangEditorNode('{{p_code}}', 'others','{{ query_date }}'))"
        class="btn btn-primary btn-sm">写评论
</button>
<!-- List group -->
<ul id="others-comment-area" class="list-group" style="padding-top: 10px">
    {% for node in others_list %}
        <li class="list-group-item">
            <div class="username" style="display: inline">用户:{{ node.user }}</div>
            <p>{{ node.update_time }}</p>
            <div class="btn-group btn-group-sm" role="group">
                <button type="button" onclick="javascript:appendHtml('others-comment-area',new WangEditorModifyNode('{{ p_code }}','others','{{ node.rich_text }}',{{ node.id }}))"
                        class="btn btn-warning">修改
                </button>
                <button type="button" onclick="javascript:deleteEditor({{ node.id }})"
                        class="btn btn-danger">删除
                </button>
            </div>
            {{ node.rich_text |safe }}
        </li>
    {% endfor %}
</ul>
<!--评论区end-->

editorUtils.js
手动拼接 HTML,感觉回到了 Servlet 时代
多亏 PyCharm 在粘贴的时候会自动转义符号,不然自己拼左斜线和双引号肯定被绕晕…

function appendHtml(div_id, node) {
    delAllEditorNode();//先删除旧的wangEditor

    // $('#future-spot-comment-area').append(new CommentNode('testuser', '2020-4-21 22:03:33', 'rich_text', 55).getNodeHtml());
    $('#' + div_id).append(node.getNodeHtml());
    // $('#future-spot-comment-area').append(new WangEditorNode('RB.SHF', 'cost').getNodeHtml());

    var E = window.wangEditor;
    var editor = new E('#div1', '#div2');
    editor.customConfig.uploadImgShowBase64 = true;   // 使用 base64 保存图片

    var $textplace = $('#textplace');
    editor.customConfig.onchange = function (html) {
        $textplace.val(html)// 监控变化,同步更新到 textarea
    };

    editor.create();
    $textplace.val(editor.txt.html());// 初始化 textarea 的值

    // wait for the DOM to be loaded
    $(document).ready(function () {
        // bind 'myForm' and provide a simple callback function
        $('#editor_form').ajaxForm(function (message) {
            var messageJson = JSON.parse(message);
            if (messageJson.status == '0') {
                alert("保存成功!");
                window.location.reload();
            } else {
                alert("保存失败,请联系管理员!" + message);
            }
        });
    });
}


function CommentNode(user, update_time, rich_text, id) {
    this.user = user;
    this.update_time = update_time;
    this.rich_text = rich_text;
    this.id = id;
    this.nodeHtml = "";

    this.getNodeHtml = function () {
        this.nodeHtml += "<li class=\"list-group-item\">";
        this.nodeHtml += "<div class=\"username\" style=\"display: inline\">用户:";
        this.nodeHtml += user;
        this.nodeHtml += "</div>";
        this.nodeHtml += "<p>";
        this.nodeHtml += update_time;
        this.nodeHtml += "</p>";
        this.nodeHtml += "<div class=\"btn-group btn-group-sm\" role=\"group\">";
        this.nodeHtml += "<button type=\"button\" οnclick=\"javascript:modifyEditor(";
        this.nodeHtml += id;
        this.nodeHtml += ")\" class=\"btn btn-warning\">修改</button>";
        this.nodeHtml += "<button type=\"button\" οnclick=\"javascript:deleteEditor(";
        this.nodeHtml += ")\" class=\"btn btn-danger\">删除</button>";
        this.nodeHtml += "</div>";
        this.nodeHtml += rich_text;
        this.nodeHtml += "</li>";

        return this.nodeHtml;
    }
}

function WangEditorNode(p_code, attribute, query_date) {
    this.nodeHtml="";
    this.getNodeHtml = function () {
        this.nodeHtml += "<div class=\"editor-node\">";
        this.nodeHtml += "<div id=\"div1\" class=\"toolbar\"></div>";
        this.nodeHtml += "<div id=\"div2\" class=\"text\"></div>";
        this.nodeHtml += "<form id=\"editor_form\" action=\"/api/editor\" method=\"post\">";
        this.nodeHtml += "<textarea id=\"textplace\" name=\"textplace\" style=\"display: none\"></textarea>";
        this.nodeHtml += "<input type=\"hidden\" name=\"p_code\" value=\"";
        this.nodeHtml += p_code;
        this.nodeHtml += "\"/>";
        this.nodeHtml += "<input type=\"hidden\" name=\"attribute\" value=\"";
        this.nodeHtml += attribute;
        this.nodeHtml += "\"/>";
        this.nodeHtml += "<input type=\"hidden\" name=\"query_date\" value=\"";
        this.nodeHtml += query_date;
        this.nodeHtml += "\"/>";
        this.nodeHtml += "<input type=\"submit\" value=\"保存\">";
        this.nodeHtml += "</form>";
        this.nodeHtml += "</div>";

        return this.nodeHtml;
    }
}

function WangEditorModifyNode(p_code, attribute, rich_text, id) {
    this.nodeHtml="";
    this.getNodeHtml = function () {
        this.nodeHtml += "<div class=\"editor-node\">";
        this.nodeHtml += "<div id=\"div1\" class=\"toolbar\"></div>";
        this.nodeHtml += "<div id=\"div2\" class=\"text\">";
        this.nodeHtml += rich_text;
        this.nodeHtml += "</div>";
        this.nodeHtml += "<form id=\"editor_form\" action=\"/api/editor/update?id=";
        this.nodeHtml += id;
        this.nodeHtml += "\" method=\"post\">";
        this.nodeHtml += "<textarea id=\"textplace\" name=\"textplace\" style=\"display: none\"></textarea>";
        this.nodeHtml += "<input type=\"hidden\" name=\"p_code\" value=\"";
        this.nodeHtml += p_code;
        this.nodeHtml += "\"/>";
        this.nodeHtml += "<input type=\"hidden\" name=\"attribute\" value=\"";
        this.nodeHtml += attribute;
        this.nodeHtml += "\"/>";
        this.nodeHtml += "<input type=\"submit\" value=\"保存\">";
        this.nodeHtml += "</form>";
        this.nodeHtml += "</div>";

        return this.nodeHtml;
    }
}


function delAllEditorNode() {
    $(".editor-node").remove();
}

function deleteEditor(id) {
    console.log("删除, id = " + id);
    $.ajax({
        url: "/api/editor/" + id,
        type: "delete",
        processData: false,
        contentType: false,
        success: function (data) {
            alert("删除成功!如误删除,可联系管理员恢复。");
            window.location.reload();
        },
        error: function (data) {
            alert("删除失败" + data);
        }
    })
}

function modifyEditor(id) {
    console.log("修改, id = " + id);
    window.open('/api/editor/' + id, '_blank');
}

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一套基于Ajax和asp.net的开源个人blog平台,主要特点如下: 1.完全基于AJAX引擎 所有页面的显示均通过javascriptxml的异步调用实现,只获取需要更新的数据,不需要刷新页面即可完成所有操作。大大减少了网络流量,加快了访问速度。尽管基于AJAX,但X2Blog客服了常见的刷新定位问题,采用自己独有的RefreshHandler来实现刷新后保持当前页面功能。 2.完全支持标准 页面结构完全符合XHTMLv1.0Transitional标准,并可以通过其验证。保持了向后兼容的特性,并且大大缩小了页面大小,加快了访问速度。X2Blog完好支持常见的IE、Firefox浏览器,其它浏览器有待测试。 3.不会丢失数据 因为提交和登陆都是异步调用,绝不会出现数据提交失败而出现的数据丢失现象。你完全可以在线编辑所有内容,即使登陆超时,可以重新登陆而继续提交数据,而无需重填。 4.界面友好,完全可定制 X2Blog采用xhtmlcss的样式控制,界面简洁友好,并且栏目位置和图片均可自定义。除了您想要它出现的内容,其它内容均不会出现。 5.文章效果即时预览 编辑文章时只需要点击预览按钮,文章的效果便会即时出现,不需要打开新窗口或者是刷新。 6.基于javascript的语法着色引擎 对于需要发布代码的广大程序员,常常希望代码更易读。X2Blog特地为此准备了语法着色功能,可以拥有桌面代码编辑器的显示效果。但通常的语法着色都是将着色好的代码存放在数据库,增加了网络流量和服务器负担。X2Blog的语法着色完全在客户端进行,并且会等其它内容装载完成后再着色,大大提高了访问速度。您所需做的仅仅是为一个代码块指定一个样式。而且编辑器内置了常用语言的样式指定功能。 7.丰富的栏目设置 每个栏目有多达11个属性可以设置,栏目的数目和显示顺序也可以随意更改,一切使用都在于你的创意。例如:你将栏目属性设置为允许留言就能实现一个小型bbs的功能,别人可以发表留言和进行回复;将栏目设定为无标题,无日期,不可评论,不可留言,那就可以作为自我介绍功能。更多示例请参考X2Blog帮助文档。 8.灵活的换肤功能 现在X2Blog提供五种主题风格,分别是:x2style,microsoft,wow,sunnyDiary,pink。并且主题风格正在不断增加中。你可以根据自己的喜好进行选择,效果无需刷新即时预览。同时,你可以设置是否允许别人在浏览你的页面时选择主题,主题的效果同样无需刷新即可出现。如果您不满意X2Blog提供的主题,而您又熟悉CSS,您可以填写自己的CSS,并应用到您的Blog中。 9.纯粹的Blog平台 X2Blog致力于发展和推广webv2.0,RSS和Trackback均完全支持标准。RSS让你发布的信息更加灵活,可以让更多的人看到,Trackback使得你的Blog可以和其它支持标准的Blog平台进行交互。 10.根据需要生成静态html文件 如果编辑的日志比较长,可以选择输入摘要,这样文章的内容将分为摘要和内容两部分,并且系统会为其自动生成html文件,html文件的风格由当时选择的页面样式决定。主页面仅显示摘要,有一个自动产生的链接指向生成的静态html文件。静态文件通过ajax调用来进行点击统计和评论提交。 v3.03更新: 修正了分类指定无效和首页置顶无法取消的Bug; 使用cookie维持登陆状态,不再会出现超时情况; 修正了静态页面评论时的乱码现象; 修正了原先版权信息中图片不显示的Bug。 
屏蔽天涯论坛中(1)指定ID或关键词的回帖(2)页面广告(3)广告贴 功能概述: 用户设置黑名单,将指定ID在天涯论坛各板块的回帖进行屏蔽,不予显示 屏蔽嵌入天涯论坛帖子页面的广告 屏蔽版块帖子列表中点击或回复数极少的疑似水军帖子 开发初衷: 天涯论坛作为大陆人气旺盛的论坛,大量网络评论员被有关部门安排蹲点,从事舆论引导的勾当。因此,人类经常被它们的回复所恶心,不堪其扰。而天涯论坛仅提供“只看楼主”功能,所以萌生了自己开发Chrome扩展解决这个问题的念头。你有让全部电视频道都播放相同节目的权利,我也有关闭电视机的自由。 功能描述: (1)帖子的设置 此处的设置对天涯论坛中一个个具体的帖子有效。 选择“只看”或者“不看”模式,然后在对应的编辑框中输入自己指定的ID,用西文逗号分隔,点击“保存”按钮,再次刷新页面生效。 “只看”模式下,页面上只会显示你关注的那些ID们的回复;“不看”模式下,页面上不会显示你想屏蔽掉的那些ID们的回复。 *支持ID的模糊匹配,对诸如yyy2012,yyy2013,yyy2014之类的ID们可以使用yyy*形式来统一屏蔽。 *为方便用户将页面中的ID增加到黑名单中,采用ID列表显示当前页面中尚未被加入"不看"清单的ID和数量。单击列表中的ID可跳转显示回复的帖子,用户经过判断后,点击"<=="按钮可以将该ID追加到"不看"清单的末尾并自动保存,省却Ctrl+C、Ctrl+V的麻烦,适用于页面中很多ID需要屏蔽的情况。ID列表支持多选(配合SHIFT键和CTRL键)。 *屏蔽@了上述ID的回帖 天涯论坛在回复时默认会复制原帖内容,如果这种途径使您看到那些内容,也会让您不爽,请勾选此项,那么任何@了上述ID的回帖也会被屏蔽显示。 *屏蔽包含下列关键词的回帖 如果您对某些主题的口水战很厌烦,请勾选此项,并设置用西文逗号分隔的关键词,那么任何出现了关键词的回帖也会被屏蔽显示。 (2)版块帖子列表的设置 此处的设置对天涯论坛中各个版块的帖子列表页面有效。 *同样应用'不看'清单 勾选此项,会把"帖子的设置"中"不看"名单也应用于版块帖子列表的显示上,即那些ID在各个版块所发主贴也会被屏蔽,不予显示。 *屏蔽点击低于或者回复低于的帖子 这个功能主要是解决水军用广告贴刷版的问题。勾选此项,自行设置“点击”和“回复”两个数值,版块帖子列表中那些低于设置阈值的帖子将被屏蔽不予显示。 (3)屏蔽页面广告 扩展会屏蔽掉帖子页面的大部分广告,让整个页面看起来简洁一些。 支持语言:中文 (简体)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值