使用CodeMirror插件遇到的问题
CodeMirror的正常使用:
//首先通过<script>标签引入相应的js,这个就不必说了
var myCodeMirror = CodeMirror.fromTextArea(myTextArea,{
key: "value"
});//就这么简单
问题一、CodeMirror在Bootstrap模态框下的使用不显示代码
这个非常简单
var myCodeMirror_Modal = CodeMirror.fromTextArea(document.getElementById("codetextarea"), {
theme: "default",可以设置其他主题,但必须引入相应的css
lineNumbers: true,
mode: "text/javascript",可以设置其他语言,但必须引入相应的js
smartIndent: true
});//构造CodeMirror实例
关键代码来了
$("#codeEditModal").on('shown.bs.modal.bs.modal', function () {//模态框显示后触发该事件
myCodeMirror_Modal.refresh();//刷新编辑器,这样问题就解决了
});
问题二、如何使用clipboard复制CodeMirror里面的代码
clipboard的正常使用:
<!--html-->
<input type="text" id="myInput" value="输入内容" />
<button class="my-compy" data-clipboard-target="#myInput">复制文本框的内容</button> <!--注意一下这个data-clipboard-target属性-->
<textarea id="myContent">123456789</textarea>
<button class="my-compy" data-clipboard-target="#myContent">复制多行文本框的内容</button>
首先通过<script>标签引入相应的js,这个就不必说了
//JavaScript
var clipboard = new ClipboardJS('.my-compy');//通过class名构造实例
clipboard.on('success', function(e) {
alert("复制成功");
});
clipboard.on('error', function(e) {
console.log(e);
alert("失败!");
});
问题:
<textarea id="myCode">$.ajax({})</textarea>
<button class="code-copy" data-clipboard-target="#myCode">复制多行文本框的内容</button>
var myCodeMirror = CodeMirror.fromTextArea(document.getElementById("myCode"), {
theme: "default",
lineNumbers: true,
mode: "text/javascript",
smartIndent: true
});//构造CodeMirror实例
var clipboard = new ClipboardJS('.code-copy');//通过class名构造实例
clipboard.on('success', function(e) {
alert("复制成功");
});
clipboard.on('error', function(e) {
console.log(e);
alert("失败!");
});
结果你会发现,可以复制代码,没问题,但是不可以粘贴复制的代码,那问题到底出现在了哪里呢?
首先呢,排除clipboard插件的问题,这个很简单,随便找个例子测试一下就行了,发现的确没问题,可以复制,可以粘贴。
那问题肯定是出现在CodeMirror上了。
折腾了很久,发现CodeMirror这个插件的原理:
它是首先获取textarea这个标签里面的内容,然后设置display:none;接着通过正则表达式,来解析textarea的内容,并在上面加上相应的样式,最后在textarea标签的后面插入新的内容。原理的确挺简单的,但要真正做到,的确是不容易的!!!


问题就出现在这个display:none上,然后我测试了一下,给一个文本框设置display:none,clipboard可以复制,但无法粘贴内容了。
总算找到了问题,那如何解决呢?
既然无法复制display:none的文本框的内容,那我可以通过CodeMirror的实例来获取代码内容不就行了吗?
答案:嗯,这样的确便可以了,问题解决!!!
代码如下:
<textarea id="myCode">$.ajax({})</textarea>
<button class="code-copy">复制多行文本框的内容</button><!--在这里不要设置data-clipboard-target-->
var myCodeMirror = CodeMirror.fromTextArea(document.getElementById("myCode"), {
theme: "default",
lineNumbers: true,
mode: "text/javascript",
smartIndent: true
});//构造CodeMirror实例
var clipboard = new ClipboardJS('.code-copy', {
text: function (e) {
var value = myCodeMirror.getValue();//重写clipboard粘贴的文本
return value;
}
});
clipboard.on('success', function(e) {
alert("复制成功");
});
clipboard.on('error', function(e) {
console.log(e);
alert("失败!");
});
这样,便解决了问题,但一想:这样不行啊,如果我要构造多个CodeMirror,那复制的话,需要复制哪个文本框里面的代码呢?
问题三、如何一次性构造多个CodeMirror
//遍历class为code_mirror_textarea的textarea
$(".code_mirror_textarea").each(function () {
let textareaId = $(this).attr("id");//获取textarea的id
let codeLanguage = $(this).data("codelanguage");//获取textarea的language mode,这个需要提前给每个textarea通过data-codelanguage赋值的
//console.log(textareaId, codeLanguage);
myCodeEditor(textareaId, codeLanguage);//分别构造CodeMirror的实例
});
function myCodeEditor(textareaId, codeLanguage) {
var editor = CodeMirror.fromTextArea(document.getElementById(textareaId), {
theme: "default",
lineNumbers: true,
mode: codeLanguage,
smartIndent: true
});
}
问题四、批量构造多个CodeMirror,那如何获取CodeMirror的实例呢?
官网文档并没有提供获取CodeMirror实例的API。
但还是有办法滴,小爷我就是这么6!!!
function myCodeEditor(textareaId, codeLanguage) {
var editor = CodeMirror.fromTextArea(document.getElementById(textareaId), {
theme: "default",
lineNumbers: true,
mode: codeLanguage,
smartIndent: true
});
$("#" + textareaId + "").data("CodeMirrorInstance", editor);//将CodeMirror实例存储在textarea对应的CodeMirrorInstance里面就可以了
}
//然后怎么获取CodeMirror实例呢?
var myCodeMirror = $("#" + textareaId + "").data("CodeMirrorInstance");//接下来便可以通过myCodeMirror来调用相应的API了
var value = myCodeMirror.getValue();//获取CodeMirror值
骚年,不行了吧,赶紧点赞关注,全是干货,让你少走很多坑!!!
使用CodeMirror插件遇到的问题的更多相关文章
- codeMirror插件使用讲解
codeMirror是一款十分强大的代码编辑插件,提供了十分丰富的API,最近在项目中用到了这款插件,于是在这里给大家分享下使用方法和心得: codeMirror调用非常方便 首先在页面中载入插件CS ...
- 关于codeMirror插件使用的一个坑
codeMirror插件可以做语法高亮渲染,但它操作过程是这样的:先从 textarea中读取值放到codemirror动态生成的div中,根据textarea中的换行个数确定行数,根据正则表达来高亮 ...
- codemirror 插件
做在线词典编辑的时候.里面有些自定义标签.类似html标签一样. 为了让编辑编辑.改成了 <动词></动词> 所以引用了 codemirror插件 此插件绝对牛逼 它主要功能 ...
- 在vue项目中使用codemirror插件实现代码编辑器功能(代码高亮显示及自动提示
在vue项目中使用codemirror插件实现代码编辑器功能(代码高亮显示及自动提示) 1.使用npm安装依赖 npm install --save codemirror; 2.在页面中放入如下代码 ...
- codemirror插件-文件比较组件merge
目的: 为了实现文件比较功能 引用文件 从github下载项目后,从以下路径引用文件,其中部分github分支中codemirror.js 需要运行项目,自动合成 <link rel=style ...
- CodeMirror编辑器文本框Textarea代码高亮插件,CodeMirror的简单实用例子
CodeMirror是一个用于编辑器文本框textarea代码高亮javascript插件,为各种编程语言实现关键字,函数,变量等代码高亮显示,丰富的api和可扩展功能以及多个主题样式,能满足您各种项 ...
- CodeMirror 使用大全
CodeMirror是一个用于编辑器文本框textarea代码高亮javascript插件,为各种编程语言实现关键字,函数,变量等代码高亮显示,丰富的api和可扩展功能以及多个主题样式,能满足您各种项 ...
- vue中显示原网页代码--codemirror
在项目中遇到了一个需求,后台返回string类型的html源码,要求前端这边按照codeview这种类型把这个源码展示出来.现总结如下 1.如果没啥样式的需求,只是要求该缩进缩进的话,可以直接使用in ...
- PHP、thinkPHP5.0开发网站文件管理功能(三)编辑文件
public function edit(){ $file = iconv('UTF-8','GB2312',urldecode(input('file'))); if(empty($file)|| ...
随机推荐
- 【JAVA习题二十九】809*??=8*??+9*??+1 其中??代表的两位数,8*??的结果为两位数,9*??的结果为3位数。求??代表的两位数,及809*??后的结果。
package erase; public class 八九与问好两位数的乘积和 { public static void main(String[] args) { int m,n;//m十位,n个 ...
- Hadoop之hadoop fs和hdfs dfs、hdfs fs三者区别
适用范围 案例 备注 小记 hadoop fs 使用范围最广,对象:可任何对象 hadoop dfs 只HDFS文件系统相关 hdfs fs 只HDFS文件系统相关(包括与 ...
- Java 中队列同步器 AQS(AbstractQueuedSynchronizer)实现原理
前言 在 Java 中通过锁来控制多个线程对共享资源的访问,使用 Java 编程语言开发的朋友都知道,可以通过 synchronized 关键字来实现锁的功能,它可以隐式的获取锁,也就是说我们使用该关 ...
- Springboot拦截器实现IP黑名单
Springboot拦截器实现IP黑名单 一·业务场景和需要实现的功能 以redis作为IP存储地址实现. 业务场景:针对秒杀活动或者常规电商业务场景等,防止恶意脚本不停的刷接口. 实现功能:写一个拦 ...
- 使用Apache Spark和Apache Hudi构建分析数据湖
1. 引入 大多数现代数据湖都是基于某种分布式文件系统(DFS),如HDFS或基于云的存储,如AWS S3构建的.遵循的基本原则之一是文件的"一次写入多次读取"访问模型.这对于处理 ...
- pip安装报错: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ProxyError('Cannot connect to proxy
pip安装报错 解决办法: pip install selenium -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
- AIO,BIO,NIO,IO复用,同步,异步,阻塞和非阻塞
(1)什么是NIO(Non-blocked IO),AIO,BIO (2) 区别 (3)select 与 epoll,poll区别 1.什么是socket?什么是I/O操作? 什么是socket? 实 ...
- 商城06——solr索引库搭建&solr搜索功能实现&图片显示问题解决
1. 课程计划 1.搜索工程的搭建 2.linux下solr服务的搭建 3.Solrj使用测试 4.把数据库中的数据导入索引库 5.搜索功能的实现 2. 搜索工程搭建 要实现搜索功能,需要搭建 ...
- cb04a_c++_数据结构_STL_queue队列-一般用来做系统软件开发
/*cb04a_c++_数据结构_STL_queue队列-一般用来做系统软件开发队列(只能两端数据)与堆栈(只能一端操作数据)都没有迭代器.,队列:FIFO先进先出自适应容器(容器适配器)栈适配器ST ...
- Docker中使用RabbitMQ
安装Docker yum install docker //安装完成以后,可以查看一下docker的版本 docker -v //Docker version 1.13.1, build 64e998 ...