手撕bejson,vue實(shí)現(xiàn)

bejson 在線格式化json代碼,算是比較好用的一款,經(jīng)常會(huì)有項(xiàng)目需要編寫(xiě)提交json格式的數(shù)據(jù)。所以在這里分析一下它的代碼格式以及實(shí)現(xiàn)方式恭金!

一點(diǎn)點(diǎn)拆,如果有錯(cuò)誤的地方歡迎指正褂策。

首先chormf12調(diào)試:

image.png

很明顯的一個(gè)textarea標(biāo)簽横腿。但是隱藏掉了,我們先把它展開(kāi)斤寂。
image.png

展開(kāi)后修改耿焊,發(fā)現(xiàn)并不會(huì)影響,代碼部分的展示遍搞,即便刪掉后罗侯,功能也是正常的。暫不明白作者用這個(gè)標(biāo)簽的意圖溪猿,可能是混淆視聽(tīng)钩杰?
接著往下看纫塌,先從使用方面分析:
每當(dāng)我們切換鼠標(biāo)位置時(shí),代碼的著兩處會(huì)發(fā)生改變讲弄,仔細(xì)觀察就可以知道措左,這兩處,第一處是用來(lái)輸入字符避除,第二處則是展示光標(biāo)怎披。


image.png

光標(biāo)實(shí)現(xiàn)非常簡(jiǎn)單,div元素的 border瓶摆,利用visibility屬性閃爍形成光標(biāo):


image.png

而第一處的輸入字符就比較復(fù)雜點(diǎn):

image.png

這個(gè)地方有個(gè) textarea 標(biāo)簽钳枕,標(biāo)簽上有個(gè)div這個(gè)元素使用了overflow: hidden;我們把它脫掉就可以直觀的看到,它實(shí)際上是在你點(diǎn)擊的時(shí)候修改了div的位置赏壹,把textarea 標(biāo)簽挪到你輸入的地方鱼炒。所有你的輸入其實(shí)是在這個(gè)textarea 中進(jìn)行的。

image.png

好了蝌借,目前已經(jīng)知道了輸入的實(shí)現(xiàn)昔瞧,我們?cè)谕罂瓷刹糠帧?/p>

image.png

從上面的圖片實(shí)驗(yàn)得知,每輸入一行代碼菩佑,他會(huì)生成一個(gè)div標(biāo)簽自晰,div 里標(biāo)簽包含了,行號(hào)稍坯、以及代碼片段酬荞。

那它是怎么實(shí)現(xiàn)的呢?我們先猜測(cè)一下瞧哟。
首先它有一個(gè)CodeMirror-codediv容器混巧,用來(lái)填充代碼片段。先把代碼刪干凈勤揩,發(fā)現(xiàn)它默認(rèn)會(huì)有一個(gè)子div咧党,也就是默認(rèn)1行。

image.png

每當(dāng)我們按下回車(chē)時(shí)陨亡,則會(huì)自動(dòng)插入一行div到容器中傍衡,所以這里我猜測(cè)它監(jiān)聽(tīng)了onmousedown 事件進(jìn)行插入。
前面提到我們寫(xiě)入用的是textarea负蠕,所以事件自然綁定在它上面蛙埂,因此我們找到了這個(gè)添加行的代碼

image.png

它在一個(gè)min.js文件中,雖然混淆了遮糖,但是并不能阻止我了解它绣的,我先猜測(cè)它是這個(gè)編輯器的js主文件,看看能否不往下拆解獲取這個(gè)編輯器的功能。因此我們先解析這個(gè)js文件被辑。

image.png

Ide中精簡(jiǎn)后可以看到,這其實(shí)是一個(gè)自執(zhí)行文件敬惦。因此在這個(gè)app里面應(yīng)該就是主方法,所以我們先看看這里面究竟是啥盼理。

image.png

根據(jù)內(nèi)容,里面有editor俄删、form宏怔、querycode畴椰。
然后在我們一個(gè)個(gè)分解

editor: 根據(jù)里面的內(nèi)容臊诊,很明顯它是一個(gè)方法類(lèi)。
form: 應(yīng)該是放IDEdom斜脂。
query: 目前還不清楚具體作用抓艳。
code: 寫(xiě)入的代碼就存放在這里。

現(xiàn)在非常確定它就是我們要找的功能帚戳,那我們?cè)趺慈ナ褂盟?br> 既然它的domform玷或,那我們先從form上做文章。

image.png

很明顯的有個(gè)name="main" 片任,然后我們?cè)趈s文件中查找偏友。
很遺憾并沒(méi)有找到有用的信息,那么它是怎么獲取到這個(gè)from的呢对供?接著往下看位他。
我們把js文件拷貝下來(lái),自己跑一遍产场。
image.png

發(fā)現(xiàn)了一個(gè)報(bào)錯(cuò)鹅髓,根據(jù)報(bào)錯(cuò)往上看。

image.png

from 應(yīng)該是從w.forms.main 中取得京景。
在它上面迈勋,我發(fā)現(xiàn)了
image.png

這樣一來(lái)我們就知道了

form = document.forms.main

我們先給他加上from


image.png

再往下走,發(fā)現(xiàn)它還是會(huì)報(bào)錯(cuò)醋粟,還是上面的錯(cuò)誤靡菇,缺少code
然后這里尷尬的發(fā)現(xiàn)我js引用的早了- -米愿,要在dom 加載完引用js厦凤。
現(xiàn)在我們的頁(yè)面已經(jīng)ok啦。
嘗試使用一下

image.png

非常完美育苟!接下來(lái)我把它搬到我的vue項(xiàng)目中去较鼓。

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" >
</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="">點(diǎn)擊俺最大化</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="格式化校驗(yàn)">
                        <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="轉(zhuǎn)義" id="btnZhuanyi" class="btn btn-default" />
                        <input type="button" value="去除轉(zhuǎn)義" id="btnRemoveZhuanyi" class="btn btn-default" />
                        <input type="button" value="unicode轉(zhuǎn)中文" 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="復(fù)制" />
                        <input name="validate" class="btn btn-default"
                            onclick="javascript:json_input.value='';$('#json_input').focus(); " type="reset"
                            value="清空" />
                    </div>
                </div>
                <div>
                    <a  rel="external nofollow"
                        target="_blank"><span class="tg1" style="background: #118eab;">C語(yǔ)言在線編程訓(xùn)練題庫(kù)</span></a>
                    <a  rel="external nofollow"
                        target="_blank"><span class="tg1" style="background: #009688;">layuiAdmin-通用后臺(tái)管理模板</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", 華文細(xì)黑, STHeiti, MingLiu;
    }
</style>

原創(chuàng)不易博烂,轉(zhuǎn)載請(qǐng)注明出處香椎!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市禽篱,隨后出現(xiàn)的幾起案子畜伐,更是在濱河造成了極大的恐慌,老刑警劉巖躺率,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玛界,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡悼吱,警方通過(guò)查閱死者的電腦和手機(jī)慎框,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)后添,“玉大人笨枯,你說(shuō)我怎么就攤上這事∮鑫鳎” “怎么了猎醇?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)努溃。 經(jīng)常有香客問(wèn)我硫嘶,道長(zhǎng),這世上最難降的妖魔是什么梧税? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任沦疾,我火速辦了婚禮,結(jié)果婚禮上第队,老公的妹妹穿的比我還像新娘哮塞。我一直安慰自己,他們只是感情好凳谦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布忆畅。 她就那樣靜靜地躺著,像睡著了一般尸执。 火紅的嫁衣襯著肌膚如雪家凯。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,718評(píng)論 1 305
  • 那天如失,我揣著相機(jī)與錄音绊诲,去河邊找鬼。 笑死褪贵,一個(gè)胖子當(dāng)著我的面吹牛掂之,可吹牛的內(nèi)容都是我干的抗俄。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼世舰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼动雹!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起跟压,我...
    開(kāi)封第一講書(shū)人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤胰蝠,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后裆馒,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡丐怯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年喷好,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片读跷。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡梗搅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出效览,到底是詐尸還是另有隱情无切,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布丐枉,位于F島的核電站哆键,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏瘦锹。R本人自食惡果不足惜籍嘹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望弯院。 院中可真熱鬧辱士,春花似錦、人聲如沸听绳。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)椅挣。三九已至头岔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鼠证,已是汗流浹背切油。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留名惩,地道東北人澎胡。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親攻谁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子稚伍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML標(biāo)準(zhǔn)戚宦。 注意:講述HT...
    kismetajun閱讀 27,489評(píng)論 1 45
  • 問(wèn)答題47 /72 常見(jiàn)瀏覽器兼容性問(wèn)題與解決方案个曙? 參考答案 (1)瀏覽器兼容問(wèn)題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,754評(píng)論 1 92
  • 選擇器選擇器是jQuery的核心。 事件 動(dòng)畫(huà) 擴(kuò)展
    wyude閱讀 476評(píng)論 0 1
  • 概要 64學(xué)時(shí) 3.5學(xué)分 章節(jié)安排 電子商務(wù)網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,208評(píng)論 0 3
  • 前端開(kāi)發(fā)面試題 <a name='preface'>前言</a> 只看問(wèn)題點(diǎn)這里 看全部問(wèn)題和答案點(diǎn)這里 本文由我...
    自you是敏感詞閱讀 761評(píng)論 0 3