手撕bejson,vue实现

bejson 在线格式化json代码,算是比较好用的一款,经常会有项目需要编写提交json格式的数据。所以在这里分析一下它的代码格式以及实现方式!

一点点拆,如果有错误的地方欢迎指正。

首先chormf12调试:

image.png

很明显的一个textarea标签。但是隐藏掉了,我们先把它展开。
image.png

展开后修改,发现并不会影响,代码部分的展示,即便删掉后,功能也是正常的。暂不明白作者用这个标签的意图,可能是混淆视听?
接着往下看,先从使用方面分析:
每当我们切换鼠标位置时,代码的着两处会发生改变,仔细观察就可以知道,这两处,第一处是用来输入字符,第二处则是展示光标。


image.png

光标实现非常简单,div元素的 border,利用visibility属性闪烁形成光标:


image.png

而第一处的输入字符就比较复杂点:

image.png

这个地方有个 textarea 标签,标签上有个div这个元素使用了overflow: hidden;我们把它脱掉就可以直观的看到,它实际上是在你点击的时候修改了div的位置,把textarea 标签挪到你输入的地方。所有你的输入其实是在这个textarea 中进行的。

image.png

好了,目前已经知道了输入的实现,我们在往后看生成部分。

image.png

从上面的图片实验得知,每输入一行代码,他会生成一个div标签,div 里标签包含了,行号、以及代码片段。

那它是怎么实现的呢?我们先猜测一下。
首先它有一个CodeMirror-codediv容器,用来填充代码片段。先把代码删干净,发现它默认会有一个子div,也就是默认1行。

image.png

每当我们按下回车时,则会自动插入一行div到容器中,所以这里我猜测它监听了onmousedown 事件进行插入。
前面提到我们写入用的是textarea,所以事件自然绑定在它上面,因此我们找到了这个添加行的代码

image.png

它在一个min.js文件中,虽然混淆了,但是并不能阻止我了解它,我先猜测它是这个编辑器的js主文件,看看能否不往下拆解获取这个编辑器的功能。因此我们先解析这个js文件。

image.png

Ide中精简后可以看到,这其实是一个自执行文件。因此在这个app里面应该就是主方法,所以我们先看看这里面究竟是啥。

image.png

根据内容,里面有editorformquerycode
然后在我们一个个分解

editor: 根据里面的内容,很明显它是一个方法类。
form: 应该是放IDEdom
query: 目前还不清楚具体作用。
code: 写入的代码就存放在这里。

现在非常确定它就是我们要找的功能,那我们怎么去使用它。
既然它的domform,那我们先从form上做文章。

image.png

很明显的有个name="main" ,然后我们在js文件中查找。
很遗憾并没有找到有用的信息,那么它是怎么获取到这个from的呢?接着往下看。
我们把js文件拷贝下来,自己跑一遍。
image.png

发现了一个报错,根据报错往上看。

image.png

from 应该是从w.forms.main 中取得。
在它上面,我发现了
image.png

这样一来我们就知道了

form = document.forms.main

我们先给他加上from


image.png

再往下走,发现它还是会报错,还是上面的错误,缺少code
然后这里尴尬的发现我js引用的早了- -,要在dom 加载完引用js
现在我们的页面已经ok啦。
尝试使用一下

image.png

非常完美!接下来我把它搬到我的vue项目中去。

image.png

完成的效果图! 以上完毕。

最后附上扒好的html版源码

<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="http://cdn.staticfile.org/jquery/1.9.1/jquery.min.js"></script>
    <link rel="stylesheet" href="http://www.bejson.com/static/bejson/index/new/style.css?20180511">
</head>

<body>
    <div style="height: 400px;">
        <form name="main" onsubmit="return false" style="margin-top: 10px;">
            <textarea id="code" name="code" style="display: none;resize:both"></textarea>
            <div class="grippie" id="btnShouOrFang" onclick="" style="">点击俺最大化</div>
            <div class="validate">
                <div class="left1 validate" id="btn2019040416" style="float:left">
                    <div class="btn-group" role="group" aria-label="...">
                        <button class="copy hide" data-ga="copy"></button>
                        <input name="validate" data-ga="validate" type="submit" id="validate" class="btn btn-primary"
                            value="格式化校验">
                        <input type="button" onclick="show(1)" class="btn  btn-default" value="新版">
                        <input type="button" value="压缩" id="btnYasuo" class="btn btn-default" />
                        <input type="button" value="转义" id="btnZhuanyi" class="btn btn-default" />
                        <input type="button" value="去除转义" id="btnRemoveZhuanyi" class="btn btn-default" />
                        <input type="button" value="unicode转中文" id="btnToChar" class="btn btn-info" />
                        <input click-type="copy" onclick="$(this).attr('data-clipboard-text',app.editor.getValue())"
                            class="btn btn-default" type="button" value="复制" />
                        <input name="validate" class="btn btn-default"
                            onclick="javascript:json_input.value='';$('#json_input').focus(); " type="reset"
                            value="清空" />
                    </div>
                </div>
                <div>
                    <a href="http://www.dotcpp.com/oj/problemset.html?t=bejson_big" rel="external nofollow"
                        target="_blank"><span class="tg1" style="background: #118eab;">C语言在线编程训练题库</span></a>
                    <a href="//www.layui.com/admin/std/dist/views/?from=bejson" rel="external nofollow"
                        target="_blank"><span class="tg1" style="background: #009688;">layuiAdmin-通用后台管理模板</span></a>
                </div>
            </div>
        </form>
    </div>
</body>

</html>
<script src="http://upyun.bejson.com/js/bejson/bejson_index20190109.min.js" type="text/javascript"></script>
<style>
    * {
        font-family: "Microsoft YaHei", 微软雅黑, "MicrosoftJhengHei", 华文细黑, STHeiti, MingLiu;
    }
</style>

原创不易,转载请注明出处!

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

推荐阅读更多精彩内容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,400评论 1 45
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,722评论 1 92
  • 选择器选择器是jQuery的核心。 事件 动画 扩展
    wyude阅读 468评论 0 1
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,071评论 0 3
  • 前端开发面试题 <a name='preface'>前言</a> 只看问题点这里 看全部问题和答案点这里 本文由我...
    自you是敏感词阅读 748评论 0 3