CodeMirror学习(1)

平台新版本的需求需要对文件和文件夹进行比较,类似于beyond compare的功能,但是是在线的,需要找一个比较好用又能快速上手的js插件。找来找去,选中了CodeMirror。

CodeMirror代码地址-github【最新版本5.31.0采用了es6的语法,我写demo时出错显示es6的import语句Error,并且该版本下的lib文件夹下没有codemirror.js文件,我引入的是src目录下面的。后来改了5.12.0版本的代码,该版本是正常es5语法。我们项目中应该不会使用最新版本。】

error.png
CodeMirror官方网站【官方网站是英文,可有时间翻译呀!为社区做贡献!】


关于使用:
1:引入css和js
<link rel="stylesheet" href="codemirror-5.12.0/lib/codemirror.css">
<script src="codemirror-5.12.0/lib/codemirror.js"></script>
2:写html
<div id="code"></div>
<textarea name="code_textarea" id="code_textarea" cols="30" rows="10"></textarea>
3:js初始化,调用方式
var editor1 = CodeMirror(document.getElementById("code"), {lineNumbers: true});
var editor2 = CodeMirror.fromTextArea(document.getElementById("code_textarea"), {lineNumbers: true});


注意:
有两种调用方式:CodeMirror(el, opt);页面中的元素可以是除了textarea元素之外的任意标签元素。

CodeMirror.fromTextArea(el, opt);页面中元素必须是textarea,其它如div、span、body会报错
error.png
CodeMirror.fromTextArea()中第一个参数是DOM元素,而且必须是textarea元素;第二个参数是可选配置项,有很多,以后有时间慢慢说。

先来看一看demo目录下的文件,都有什么功能?如何使用?
demo目录下有许多html,依次打开,应该就会发现各种功能的实现。


activeline.html【初看好像是代码的背景高亮显示,点中哪一行,那一行的代码就会背景高亮显示】

activeline.html.png
代码:
link_script.png
editor_html.png
其实实现是在textarea后面创建了一个div,用来显示代码和操作,然后将之前的textarea给diaplay:none:
textarea_display_none.png

以上引入的文件:
【docs.css】是某些常用标签元素的样式定义(article,strong,p...);
【codemirror.css】是对CodeMirror类及其相关联类的样式定义;
【codemirror.js】有很多代码,8000多行,但是我感觉应该是创建覆盖textarea的div及其嵌套div的初始化的实现;
【xml.js】因为CodeMirror支持多种类型的编程语言,xml.js应该就是配置xml的,让其在页面中像在代码编辑器中一样高亮显示xml的语法。因为demo中要显示的语言是xml,所以这里引入xml.js。如果不引入,所显示的文字就全部都是黑色默认的字体;
no_xml.js.png

【active-line.js】这个就是实现点击那一行,那一行就背景高亮的功能了,如果没有引入这个js,就会是以下这样:默认第一行没有背景高亮,但实际上应该是有背景高亮的,就是在该js里面实现的:
no_activeline.js.png

关于js中的配置:
mode: "application/xml",===>【以哪一种语言模式显示,这里是xml】
styleActiveLine: true,===>【点击选中 背景高亮】
lineNumbers: true,===>【行号的显示与否】
lineWrapping: true===>【这个貌似与代码的缩进有关,但是不知道是干什么的?】


anywordhint.html【初看好像是代码检测,最后发现是代码自动补全,需要用到快捷键(自定义),但是未成功啊,缺少了什么?】
页面中已经提醒按ctrl+space来激活自动补全,但是我按了没用啊,只是无奈切换了多遍输入法。。。

anywordhint.html.png

关于代码:
hint_code.png

引入的文件:
【docs.css】选择性引入;
【codemirror.css】和【codemirror.js】必须引入;
【javascript.js】支持javascript语法高亮;如果没有引入,编辑区内的文字没有字体高亮===>【你想在编辑框内显示哪种语言,就需要加载那个语言的js文件,统一放在mode文件夹下,支持多种类型语言,这样页面显示的时候才会按照那种语言的语法特性来支持字体高亮】:
no_javascript.js.png

【show-hint.css】、【show-hint.js】、【anyword-hint.js】因为没测出来,所以也不知道每个文件到底完成了什么功能。hint和lint到底有什么不同,貌似在js里面都是代码的检测?


bidi.html【这个初看不知道是什么鬼,试了demo之后也不知道是什么鬼,后来想想感觉跟字符有关,demo显示的阿拉伯文,是想说明支持各种国际化的字符么?】
bidi_html.png

bidi_code.png

另外页面中引入的是【xml.js】,但是实际内容是html,没有针对html的js,但是有其它和html相关联的,不知道针对的是html的哪方面?


btree.html【名字叫b树,第一想法是文件的目录树结构,树结构的可视化么?】

在编辑框中输入:
btree_html.png

点击最下面的按钮:
btree_html_click.png

代码实现:
btree_code.png

代码分析:
首先在编辑框中输入字符会触发editor的onchange事件,触发这个事件的回调就是更新页面视图,因为onchange事件时是持续触发的,因此更新视图也是持续调用的,但是这里用了一个setTimeout,200ms的延迟,可能是为了不持续触发回调,提升性能。
btree_onchange.png

更新页面视图其实就是html结构的渲染【对editor.getDoc()的API不太了解,还有就是递归渲染】:
update_visual.png

点击按钮时触发的事件【将script标签里的代码加载到页面代码编辑区内===>触发editor的onchange事件===>触发更新视图函数===>页面局部重新渲染】:


fillEditor.png

buffers.html【buffers是缓冲区的意思,可能是对代码字节流的实现,在代码量特别庞大的情况下?记得本科毕业找工作,在线笔试会有代码编辑来实现某些算法,有几种主要的语言可以来回切换,我一般会选择html或javascript,难道这个buffers是实现语言的切换的功能?】
buffer_html.png

来看代码:

以下函数的功能是将DOM元素的内容取出来,并进行某种形式的格式化,变成想要的字符串,展示在页面的代码编辑区块内。
nodeContent_js.png
以下函数的功能是:创建option元素插入到页面的select中,并将CodeMirror.Doc()函数的返回值赋值给该页面的一个全局变量buffer的属性上去。
openBuffer_js.png
以下函数的功能是:将全局buffer对象中对应的属性取出来,放在页面上的代码编辑区内。这个函数有很多CodeMirror的API,还不是很了解,不会用。调用是在页面加载后即页面初始化以及页面中的下拉框的值发生变化时。用户改变触发。
selectBuffer_js.png

以下函数的功能是:为下拉框新增一个用户输入的值,在这里就要接收用户的输入,用的是浏览器的prompt。如果用户输入了值,并且确认,就调用openBuffer生成一个option插入到select,再调用selectBuffer,将buffer里面存入的对应的值在页面编辑框内显示,然后将下拉框置为该值。调用是在用户点击按钮时。
newBuf.png

<== 未完待续 ==>


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,612评论 4 59
  • Swift版本点击这里欢迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh阅读 24,860评论 7 249
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,568评论 25 707
  • “创新与战略” 20171115 创新 第一,相信高概率事件,所谓创新主要的点在于“发现新的事物” 第二,创新的三...
    于情情Joleen阅读 314评论 0 1
  • 大家好我是新郎陈小强非常荣幸在各位的见证和祝福下,在此举行我和我爱人曹松松的婚礼,(谢谢大家) 经过我们的不懈努力...
    强松阅读 234评论 0 0