Editor.md自動保存插件的開發(fā)

Markdown編輯器Editor.md自動保存插件的開發(fā)靶端。文章編輯器沒有自動保存功能怎么行,萬一不小心忘記保存不就辛苦白費了拄氯,然后就著手給自己的編輯器加了個自動保存功能躲查,分享給有需要的朋友。
原文地址:代碼匯個人博客 http://www.codehui.net/info/40.html

  • 此文章代碼僅供參考译柏。用于開發(fā)環(huán)境時可根據(jù)自己需要進行修改镣煮。

自動保存基于localStorage開發(fā),請注意瀏覽器兼容鄙麦。(IE7及以下不兼容)典唇。各個瀏覽器對localStorage的存儲大小支持都是不同的,chrome是5M 胯府,IE10是1630K介衔,其他的可以自行測試,基本保存一篇文章綽綽有余了骂因。

1. 插件運行流程

插件使用方法:在編輯區(qū)輸入內(nèi)容后,會自動保存內(nèi)容到客戶端本地存儲炎咖,頁面關(guān)閉和斷電對保存的內(nèi)容不受影響。保存的內(nèi)容沒有過期時間寒波,直到手動去除乘盼。

代碼匯

2. 創(chuàng)建插件文件

plugins目錄下創(chuàng)建 code-auto-save/code-auto-save.js文件。

3. 頁面使用插件

為更方便使用緩存俄烁,我們在編輯器的工具欄添加一個自定義的按鈕绸栅,就和ueditor類似,點擊按鈕讀取緩存內(nèi)容到編輯器页屠。頁面代碼如下粹胯,都有注釋的

<!DOCTYPE html>
<html lang="zh">
    <head>
        <meta charset="utf-8" />
        <title>editormd自動保存插件</title>
        <link rel="stylesheet" href="css/style.css" />
        <link rel="stylesheet" href="../css/editormd.css" />
    </head>
    <body>
        <div id="test-editormd">
            <textarea style="display:none;"></textarea>
        </div>
        <script src="js/jquery.min.js"></script>
        <script src="../editormd.js"></script>
        <script type="text/javascript">
            var testEditor = editormd("test-editormd", {
                path: '../lib/',
                // 工具欄添加一個自定義方法
                toolbarIcons: function() {
                    // 給工具欄full模式添加一個自定義方法
                    return editormd.toolbarModes.full.concat(["customIcon"]);
                },
                // 自定義方法的圖標 指定一個FontAawsome的圖標類
                toolbarIconsClass: {
                    customIcon: "fa-paste"
                },
                // 沒有圖標可以插入內(nèi)容,字符串或HTML標簽
                toolbarIconTexts: {
                    customIcon: "從草稿箱加載"
                },
                // 圖標的title
                lang: {
                    toolbar: {
                        customIcon: "從草稿箱加載"
                    }
                },
                // 自定義工具欄按鈕的事件處理
                toolbarHandlers: {
                    customIcon: function(){
                        // 讀取緩存內(nèi)容
                        testEditor.CodeAutoSaveGetCache();
                    }
                },
                // 自定義工具欄按鈕的事件處理
                onload: function() {
                    // 引入插件 執(zhí)行監(jiān)聽方法
                    editormd.loadPlugin("../plugins/code-auto-save/code-auto-save", function() {
                        // 初始化插件 實現(xiàn)監(jiān)聽
                        testEditor.CodeAutoSave();
                    });
                }
            });
            // 刪除緩存
            testEditor.CodeAutoSaveDelCache();
            // 清空緩存的文檔內(nèi)容
            testEditor.CodeAutoSaveEmptyCacheContent();
            // 自定義設(shè)置緩存
            testEditor.CodeAutoSaveSetCache('緩存內(nèi)容');
        </script>
    </body>

</html>

4. 插件的內(nèi)容

防止緩存沖突辰企,將頁面url作為存儲的key進去區(qū)分风纠。監(jiān)聽編輯器change事件最好有一小段時間的緩沖,不然操作緩存太頻繁造成性能問題牢贸。

/*!
 * editormd圖片粘貼上傳插件
 *
 * @file   code-auto-save.js
 * @author codehui
 * @date   2018-10-27
 * @link   https://www.codehui.net
 */

(function() {

    var factory = function (exports) {
        // 定義插件名稱
        var pluginName   = "code-auto-save";  
        
        // 緩存key
        var cacheKey = 'editormd_cache';
        // 編輯器內(nèi)容緩存key 替換url中的符號
        var cacheContentKey = ( location.protocol + location.host + location.pathname + location.search ).replace( /[.:?=\/-]/g, '_' );
        // 定義全局變量
        var cm;

        exports.fn.CodeAutoSave = function() {
            // 初始化系統(tǒng)變量
            var _this       = this;
            cm              = _this.cm;
            var settings    = _this.settings;
            var classPrefix = _this.classPrefix;
            var id          = _this.id;   // 編輯器id
            
            // 定時器
            var _saveFlag = null;    
            // 自動保存間隔時間议忽, 單位ms
            var saveInterval = 500;   

            if(typeof(Storage)=="undefined"){
                console.log('對不起,您的瀏覽器不支持 web 存儲十减。');
                return ;
            }
            
            // 設(shè)置編輯器為當前域名+編輯器id
            cacheContentKey = cacheContentKey + "_" + id;
            
            console.log('初始化插件成功');
            
            // 注冊change事件
            cm.on('change', function(){
                
                //已經(jīng)存在定時器關(guān)閉 重新開始 防止多次執(zhí)行
                if(_saveFlag){
                    window.clearTimeout( _saveFlag );
                }
                //定時器的作用是加緩沖
                _saveFlag = window.setTimeout( function () {
                    // 執(zhí)行設(shè)置緩存方法  cm.getValue() 是編輯器的源文檔
                    _this.CodeAutoSaveSetCache(cm.getValue());
                }, saveInterval);
            })

        };
        // 設(shè)置緩存
        exports.fn.CodeAutoSaveSetCache = function(value) {
            value = value || cm.getValue();
            console.log('設(shè)置緩存');
            var cacheContent = {};
            cacheContent[cacheContentKey] = value;
            localStorage.setItem(cacheKey, JSON.stringify(cacheContent));
        }
        
        // 讀取緩存
        exports.fn.CodeAutoSaveGetCache = function() {
            // 判斷緩存key
            if(localStorage.hasOwnProperty(cacheKey)){
                var cacheData = JSON.parse(localStorage.getItem(cacheKey));
                if(cacheData[cacheContentKey]){
                    console.log('讀取緩存 設(shè)置文檔內(nèi)容')
                    cm.setValue(cacheData[cacheContentKey]);
                }
            }else{
                console.log('緩存中沒有數(shù)據(jù)')
            }
        }
        
        // 刪除緩存
        exports.fn.CodeAutoSaveDelCache = function() {
            console.log('刪除緩存')
            localStorage.removeItem(cacheKey);
        }
        
        // 清空緩存的文檔內(nèi)容
        exports.fn.CodeAutoSaveEmptyCacheContent = function() {
            console.log('清除緩存文檔內(nèi)容')
            _this.CodeAutoSaveSetCache('');
        }

    };
    
    // CommonJS/Node.js
    if (typeof require === "function" && typeof exports === "object" && typeof module === "object")
    { 
        module.exports = factory;
    }
    else if (typeof define === "function")  // AMD/CMD/Sea.js
    {
        if (define.amd) { // for Require.js

            define(["editormd"], function(editormd) {
                factory(editormd);
            });

        } else { // for Sea.js
            define(function(require) {
                var editormd = require("./../../editormd");
                factory(editormd);
            });
        }
    } 
    else
    {
        factory(window.editormd);
    }

})();

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末栈幸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子帮辟,更是在濱河造成了極大的恐慌速址,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件由驹,死亡現(xiàn)場離奇詭異芍锚,居然都是意外死亡,警方通過查閱死者的電腦和手機蔓榄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門并炮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人逃魄,你說我怎么就攤上這事±浇粒” “怎么了伍俘?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵勉躺,是天一觀的道長癌瘾。 經(jīng)常有香客問我咬荷,道長糖赔,這世上最難降的妖魔是什么萍丐? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任逝变,我火速辦了婚禮,結(jié)果婚禮上奋构,老公的妹妹穿的比我還像新娘壳影。我一直安慰自己,他們只是感情好弥臼,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布宴咧。 她就那樣靜靜地躺著,像睡著了一般径缅。 火紅的嫁衣襯著肌膚如雪掺栅。 梳的紋絲不亂的頭發(fā)上烙肺,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天,我揣著相機與錄音氧卧,去河邊找鬼桃笙。 笑死,一個胖子當著我的面吹牛沙绝,可吹牛的內(nèi)容都是我干的搏明。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼闪檬,長吁一口氣:“原來是場噩夢啊……” “哼星著!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起粗悯,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤虚循,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后为黎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體邮丰,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年铭乾,在試婚紗的時候發(fā)現(xiàn)自己被綠了剪廉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡炕檩,死狀恐怖斗蒋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情笛质,我是刑警寧澤泉沾,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站妇押,受9級特大地震影響跷究,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜敲霍,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一俊马、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧肩杈,春花似錦柴我、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春界睁,著一層夾襖步出監(jiān)牢的瞬間觉增,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工翻斟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留抑片,地道東北人。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓杨赤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親截汪。 傳聞我的和親對象是個殘疾皇子疾牲,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

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

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML標準衙解。 注意:講述HT...
    kismetajun閱讀 27,422評論 1 45
  • 繼續(xù)寫API獲取豆瓣電影前250的程序阳柔。 鏈接:https://api.douban.com/v2/movie/t...
    每日派森閱讀 296評論 0 0
  • 昨天晚上和愛人朱玉瓊、兒子陳志邦蚓峦、冠珠團隊的家人舒彩霞舌剂、高靜、曹雅琳暑椰、高靜霍转、唐光輝、一起去觀看了電影無問西東一汽。這部...
    31c47a10aded閱讀 223評論 0 3
  • “唯有對藝術(shù)家是應該告訴他死期的”避消。 天才畫家祁答院在25歲的時候換上了痔瘡。盡管飽受病魔的折磨召夹,他卻無心...
    流洋tututu閱讀 753評論 0 0