bootstrap富文本编辑器的使用

bootstrap-wysiwyg是一款轻量级的富文本编辑插件,大致长这样
在这里插入图片描述
在此记录一下我使用它踩过的坑和经验。

插件的引入

插件其实分为两部分:顶部的一系列编辑按钮和下方的div编辑框
前台代码如下:

<div style="height: 50px;"></div><!--这里加上是为了让提示信息显示 不然会被遮挡--><div class="btn-toolbar" data-role="editor-toolbar"data-target="#editor"><div class="btn-group"><a class="btn dropdown-toggle" data-toggle="dropdown" title="Font"><iclass="icon-font"></i><b class="caret"></b></a><ul class="dropdown-menu"></ul></div><div class="btn-group"><a class="btn dropdown-toggle" data-toggle="dropdown"title="Font Size"><i class="icon-text-height"></i> <bclass="caret"></b></a><ul class="dropdown-menu"><li><a data-edit="fontSize 5"><font size="5">Huge</font></a></li><li><a data-edit="fontSize 3"><font size="3">Normal</font></a></li><li><a data-edit="fontSize 1"><font size="1">Small</font></a></li></ul></div><div class="btn-group"><a class="btn" data-edit="bold" title="Bold (Ctrl/Cmd+B)"><iclass="icon-bold"></i></a><!--加粗--><a class="btn" data-edit="italic" title="Italic (Ctrl/Cmd+I)"><iclass="icon-italic"></i></a><!-- 斜体--><a class="btn" data-edit="strikethrough" title="Strikethrough"><iclass="icon-strikethrough"></i></a><!-- 删除线--><a class="btn" data-edit="underline" title="Underline (Ctrl/Cmd+U)"><iclass="icon-underline"></i></a><!-- 下划线--></div><div class="btn-group"><a class="btn" data-edit="insertunorderedlist" title="Bullet list"><iclass="icon-list-ul"></i></a><!-- 加点--><a class="btn" data-edit="insertorderedlist" title="Number list"><iclass="icon-list-ol"></i></a><!-- 数字排序--><a class="btn" data-edit="outdent" title="Reduce indent (Shift+Tab)"><iclass="icon-indent-left"></i></a><!-- 减少缩进--><a class="btn" data-edit="indent" title="Indent (Tab)"><iclass="icon-indent-right"></i></a><!--增加缩进--></div><div class="btn-group"><a class="btn" data-edit="justifyleft"title="Align Left (Ctrl/Cmd+L)"><i class="icon-align-left"></i></a><!--左对齐--><a class="btn" data-edit="justifycenter" title="Center (Ctrl/Cmd+E)"><iclass="icon-align-center"></i></a><!--居中--><a class="btn" data-edit="justifyright"title="Align Right (Ctrl/Cmd+R)"><i class="icon-align-right"></i></a><!--右对齐--><a class="btn" data-edit="justifyfull" title="Justify (Ctrl/Cmd+J)"><iclass="icon-align-justify"></i></a><!--垂直对齐--></div><div class="btn-group"><a class="btn dropdown-toggle" data-toggle="dropdown"title="Hyperlink"><i class="icon-link"></i></a><!-- 链接--><div class="dropdown-menu input-append"><input class="span2" placeholder="URL" type="text"data-edit="createLink" /><button class="btn" type="button">Add</button></div><a class="btn" data-edit="unlink" title="Remove Hyperlink"><iclass="icon-cut"></i></a></div><div class="btn-group"><a class="btn" title="Insert picture (or just drag & drop)"id="pictureBtn"><i class="icon-picture"></i></a> <input type="file"data-role="magic-overlay" data-target="#pictureBtn"data-edit="insertImage" /></div><div class="btn-group"><a class="btn" data-edit="undo" title="Undo (Ctrl/Cmd+Z)"><iclass="icon-undo"></i></a><!--撤销--><a class="btn" data-edit="redo" title="Redo (Ctrl/Cmd+Y)"><iclass="icon-repeat"></i></a><!--恢复--></div><input type="text" data-edit="inserttext" id="voiceBtn"x-webkit-speech=""></div><div id="editor">${content}</div>

下面需要引入插件运行所需的css和js

<linkhref="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.1/css/bootstrap-combined.no-icons.min.css"rel="stylesheet">
<link type="text/css" rel="stylesheet"href="${ctxStatic}/editor/index.css" /><link rel="stylesheet"href="http://netdna.bootstrapcdn.com/font-awesome/3.0.2/css/font-awesome.css">
<link type="text/css" rel="stylesheet"href="${ctxStatic}/editor/prettify.css" />
<link type="text/css" rel="stylesheet"href="${ctxStatic}/bootstrap/2.3.1/css_default/bootstrap-responsive.min.css" /><scriptsrc="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-select/2.0.0-beta1/js/bootstrap-select.js"></script><script type="text/javascript"src="${ctxStatic}/editor/bootstrap-wysiwyg.js"></script><script type="text/javascript"src="${ctxStatic}/editor/jquery.hotkeys.js"></script><script type="text/javascript"src="${ctxStatic}/bootstrap/2.3.1/js/bootstrap.min.js"></script><script type="text/javascript"src="${ctxStatic}/bootstrap/2.3.1/js/bootstrap.js"></script>

这里有一个坑,网上的教程只提到了引入bootstrap.min.js
如果不额外引入bootstrap.js,会无法使用字体切换的js方法。

下面是一些js函数:

$(function() {function initToolbarBootstrapBindings() {var fonts = [ 'Serif', 'Sans', 'Arial', 'Arial Black', 'Courier','Courier New', 'Comic Sans MS', 'Helvetica', 'Impact', 'Lucida Grande', 'Lucida Sans', 'Tahoma', 'Times','Times New Roman', 'Verdana' ],fontTarget = $('[title=Font]').siblings('.dropdown-menu');$.each(fonts, function(idx, fontName) {fontTarget.append($('<li><a data-edit="fontName ' + fontName + '" style="font-family:\'' + fontName + '\'">' + fontName + '</a></li>'));});$('a[title]').tooltip({container : 'body'});$('.dropdown-menu input').click(function() {return false;}).change(function() {$(this).parent('.dropdown-menu').siblings('.dropdown-toggle').dropdown('toggle');}).keydown('esc', function() {this.value = '';$(this).change();});$('[data-role=magic-overlay]').each(function() {var overlay = $(this),target = $(overlay.data('target'));overlay.css('opacity', 0).css('position', 'absolute').offset(target.offset()).width(target.outerWidth()).height(target.outerHeight());});$('#voiceBtn').hide();};initToolbarBootstrapBindings();$('#editor').wysiwyg();window.prettyPrint && prettyPrint();});

引入这些之后,页面应该可以正常显示富文本编辑器了

实现保存到数据库并回显

接下来我需要实现将富文本编辑器的内容存到数据库,然后可以再次读取出来进行回显。
首先进行存储,我打算将整个富文本编辑框中的html元素全部存储到数据库,因为它本身就是个div。这里我使用了mysql数据库,在表中加了一个mediumblob类型的字段,最大能存储16m的数据。

写一个js函数,获取div中的html元素,并调用ajax接口进行保存。

$(function() {$("#btnSubmit").click(function() {var title = document.getElementById("title").value;var content = document.getElementById("editor").innerHTML;var id = document.getElementById("hid").value;$.ajax({url : '${ctx}/article/articleContent/savearticle',type : 'post',async : false,dataType : 'json',data : {title : title,content : content,id:id},success : function(data) {if(data==1){window.location.href="${ctx}/article/articleContent/list"}else{alert("保存失败!");}},error : function(){alert("保存失败!");}});});});

这样就成功的保存到了数据库~
这里需要注意:上面这个ajax传递的content
var content = document.getElementById(“editor”).innerHTML;
已经对html元素做了转义,直接存入数据库即可。

回显数据
在我打算对文章进行修改时,我需要读取数据库中保存的数据,一开始我只是直接读取数据库的数据,没做任何处理,发现一些html标签显示为“?”查找网上资料得知,需要进行反转义,将数据库中的数据转化为html元素。
String contentString = StringEscapeUtils.unescapeHtml4(articleContent.getContent());
这就是反转义

中文乱码
之后我又遇到了中文乱码的问题,输出一下日志发现存入的是正常的中文,但读取出来中文就变成乱码了,这肯定和blob有关,写一个处理blob类型的字符转换工具类

import java.io.ByteArrayInputStream;
import java.io.UnsupportedEncodingException;
import java.sql.Blob;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;public class MyBlobTypeHandler extends BaseTypeHandler<String> {  //###指定字符集  private static final String DEFAULT_CHARSET = "utf-8";  public void setNonNullParameter(PreparedStatement ps, int i,  String parameter, JdbcType jdbcType) throws SQLException {  ByteArrayInputStream bis;  try {  //###把String转化成byte流  bis = new ByteArrayInputStream(parameter.getBytes(DEFAULT_CHARSET));  } catch (UnsupportedEncodingException e) {  throw new RuntimeException("Blob Encoding Error!");  }     ps.setBinaryStream(i, bis, parameter.length());  }  @Override  public String getNullableResult(ResultSet rs, String columnName)  throws SQLException {  Blob blob = (Blob) rs.getBlob(columnName);  byte[] returnValue = null;  if (null != blob) {  returnValue = blob.getBytes(1, (int) blob.length());  }  try {  //###把byte转化成string  return new String(returnValue, DEFAULT_CHARSET);  } catch (UnsupportedEncodingException e) {  throw new RuntimeException("Blob Encoding Error!");  }  }  public String getNullableResult(CallableStatement cs, int columnIndex)  throws SQLException {  Blob blob = (Blob) cs.getBlob(columnIndex);  byte[] returnValue = null;  if (null != blob) {  returnValue = blob.getBytes(1, (int) blob.length());  }  try {  return new String(returnValue, DEFAULT_CHARSET);  } catch (UnsupportedEncodingException e) {  throw new RuntimeException("Blob Encoding Error!");  }  }@Overridepublic String getNullableResult(ResultSet rs, int columnIndex)throws SQLException {// TODO Auto-generated method stubreturn null;}}  

然后需要在mapper.xml中显式的说明content字段的typeHandler
<result column="content" property="content" typeHandler="com.common.utils.MyBlobTypeHandler" />

发现中文乱码问题就解决了~

后记:
页面中使用了bootstrap的fileinput插件,导致富文本框的右侧工具栏无法点击,但是台式机一切正常,我使用的是笔记本电脑,我以为是分辨率导致的问题。请教了公司的前端大神,发现。。。
这是由于fileinput插件的js封装了一个
模态框,默认的class是fade,这个隐藏的模态框在笔记本的分辨率下正好挡住了富文本框右侧的工具栏。
解决方法:在fileinput插件的初始化js函数下添加一行代码如下:

$("#imgInput").fileinput({showUpload : false,dropZoneEnabled : false,language : 'zh', //设置语言maxFileCount : 1,mainClass : "input-group-lg",allowedFileExtensions : [ 'jpg', 'gif', 'png', 'bmp', 'jpeg' ], //接收的文件后缀elErrorContainer : '#file-errors',});$("#kvFileinputModal").hide()

kvFileinputModal就是那个隐藏的模态框的id

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1620194.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

用C#语言实现记事本

C#实现记事本 一、记事本界面设计 1、打开VS2013 单击 文件→新建→项目 2、选择模版→Visual C#→windows→windows窗体应用程序&#xff0c;在下面的名称写Notepad 3、更改窗体名称&#xff0c;单击窗体→右下角属性→text&#xff0c;修改为“记事本” 补充&#xff1a…

pixhawk计算机无法识别,PIXHAWK教程 3.1.2 连接你的遥控输入和电机(Pixhawk)

连接你的遥控输入和电机(Pixhawk) 目录 连接你的遥控输入和电机(Pixhawk) 连接蜂鸣器和安全开关 连接其他外部设备 连接遥控输入 连接电机输入 安装螺旋桨 顺时针和逆时针桨的识别 连接蜂鸣器和安全开关 蜂鸣器和安全开关依附于Pixhawk。 分别连接到蜂鸣器和开关端口。 连接其他…

ThinkPHP 验证码扩展库的使用,以及多应用模式下,如何自定义验证码校验规则

ThinkPHP 验证码扩展库的使用&#xff0c;以及多应用模式下&#xff0c;如何自定义验证码校验规则 一、安装二、页面使用三、验证码相关配置属性1. 自定义验证码配置2. 自定义验证码&#xff08;一&#xff09;普通验证码3. 自定义验证码&#xff08;二&#xff09;算数验证码4…

linux会话session

linux会话 什么是linux session 我们常见的 Linux session 一般是指 shell session。Shell session 是终端中当前的状态&#xff0c;在终端中只能有一个 session。 当我们打开一个新的终端时&#xff0c;总会创建一个新的 shell session。这表明会话是我们和shell交互的一个过…

session是什么

前言&#xff1a; 今天就来彻底的学一些session是个啥东西&#xff0c;我罗列了几个需要知道的要点&#xff1a; 1.session 是啥&#xff1f; 2.怎么保存的&#xff1f; 3.如何运行&#xff1f; 4.有生命周期吗&#xff1f; 5.关闭浏览器会过期吗&#xff1f; 6.Redis代替文件存…

Session是什么东西

虽然经常做的C,Web 写的少&#xff0c;但是这个知识在面试中经常遇到&#xff0c;现在就记录一下。 Web的三个概念&#xff1a; Session 、 cookie、 application。 Session 和 Cookie 功能效果是差不多的&#xff0c;区别就是session 是记录在服务端的&#xff0c;Cookie是记…

Python—Session

python中session()是干什么作用的_session是什么意思 Session&#xff1a;在计算机中&#xff0c;尤其是在网络应用中&#xff0c;称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样&#xff0c;当用户在应用程序的 Web 页之间跳转时&#xff0c;存储…

彻底弄清楚session是什么?

前言&#xff1a; 今天就来彻底的学一些session是个啥东西&#xff0c;我罗列了几个需要知道的要点&#xff1a; 1.session 是啥&#xff1f; 2.怎么保存的&#xff1f; 3.如何运行&#xff1f; 4.有生命周期吗&#xff1f; 5.关闭浏览器会过期吗&#xff1f; 6.redis代替文…

浅谈 Cookie 和 Session

理解Cookie理解Session核心方法案例-网页登录1. 编写一个简单的登录页面2. 编写一个 Servlet 来处理这个登录请求3. 编写服务器返回主页的逻辑4. 启动服务器验证 Cookie 和 Session 区别 理解Cookie 在前面的 HTTP 协议中,也理解过这个 Cookie,HTTP 协议自身是属于 “无状态”…

session是什么?

目录&#xff1a; 1.session 是啥&#xff1f; 2.怎么保存的&#xff1f; 3.如何运行&#xff1f; 4.有生命周期吗&#xff1f; 5.关闭浏览器会过期吗&#xff1f; 6.Redis代替文件存储session 7.分布式session的同步问题 session是啥&#xff1f; 首先&#xff0c;我大致的…

什么是session?

最近在学习node.js 的express框架&#xff0c;接触到了关于session方面的内容。翻阅了一些的博客&#xff0c;学到了不少东西&#xff0c;发现一篇博文讲的很好&#xff0c;概念内容摘抄如下&#xff1a; Session是什么 Session一般译作会话&#xff0c;牛津词典对其的解释是…

session的到底是做什么的?

前言&#xff1a; 今天就来彻底的学一些session是个啥东西&#xff0c;我罗列了几个需要知道的要点&#xff1a; 1.session 是啥&#xff1f; 2.怎么保存的&#xff1f; 3.如何运行&#xff1f; 4.有生命周期吗&#xff1f; 5.关闭浏览器会过期吗&#xff1f; 6.Redis代替文…

Session(超详细)

Session 会话 1.什么是 Session 会话? Session 就一个接口&#xff08;HttpSession&#xff09;。Session 就是会话。它是用来维护一个客户端和服务器之间关联的一种技术。每个客户端都有自己的一个 Session 会话。Session 会话中&#xff0c;我们经常用来保存用户登录之后的…

Session详解(重点)

什么是Session: &#xff08;1&#xff09;服务器会给每一个用户&#xff08;浏览器&#xff09;创建一个Session对象 比如我们现在都去访问百度&#xff0c;我们使用双核浏览器和谷歌浏览器同时访问百度这个网址&#xff0c;百度那边会有两个session,因为浏览器不一样&#x…

Session原理

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 开发工具与关键技术&#xff1a;Java&#xff0c;HTTP协议&#xff0c;session原理 撰写时间&#xff1a;2019-06-17 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~…

Session详解

Session(重点) 什么是Session&#xff1a; 服务器会给每一个用户&#xff08;浏览器&#xff09;创建一个Session对象一个Session独占一个浏览器&#xff0c;只要浏览器没有关闭&#xff0c;这个Session就存在用户登陆之后&#xff0c;整个网站它都可以访问–>保存用户的信…

Session详解,学习Session,这篇文章就够了(包含底层分析和使用)

说明&#xff1a;下面介绍session&#xff0c;我们使用到了游览器抓包&#xff0c;http的知识&#xff0c;如果不了解&#xff0c;请先简单了解下。http介绍&#xff0c;http请求&#xff0c;http响应。因为cookie和session是一对”好兄弟“&#xff0c;我们介绍session也要使用…

移动端VIN码识别技术的出现,为汽配供应链带来便捷

汽配供应链作为汽车后市场一大蓝海&#xff0c;成为众多商家的“必争之地”。在现今人工智能大数据的大环境下&#xff0c;拥抱科技&#xff0c;运用人工智能技术构建智能化数据平台成为提升企业行业竞争力的首选。 VIN码即车架号就是汽车的唯一的身份证&#xff0c;汽车从下线…

harrier 查看查看服务器状态,机油尺检查细节多多,嘉普力汽配工场教你如何正确查看机油尺...

平常我们总是说烧机油、机油消耗、机油增多&#xff0c;很多车主都快得"机油恐惧症"了&#xff0c;时刻担心自己的机油出现问题。既然担心就要查机油&#xff0c;那么你会看机油尺吗&#xff1f;今天&#xff0c;嘉普力汽配工场就教车主朋友们如何正确查看机油尺。 机…

汽车汽配行业B2B电子商务系统营销渠道自动化,综合提升B2B平台交易效率

汽车工业作为国家制造业的支柱之一&#xff0c;是衡量国家工业水平的基本指标。不断完善汽车工业整体的行业规范&#xff0c;促进汽车工业更稳定、更健康的发展&#xff0c;才能有效提升汽车工业的经济作用及影响力。 4S店模式&#xff0c;作为我国一直以来最主要的汽车销售模…