CKEditor尤蛮,從粘貼邏輯到光標(biāo)位置

首先ckeditor中列表與所我目前所工作的列表構(gòu)造不同,ckeditor中列表層級越大斯议,嵌套的層級也越多产捞。而目前工作的列表構(gòu)造中,層級的變化是用CSS來控制的哼御,DOM結(jié)構(gòu)只有一層嵌套坯临。所以在粘貼處理的時(shí)候方便很多。

其實(shí)著重考慮的就是兩點(diǎn)粘貼內(nèi)容粘貼位置恋昼,我稱這兩項(xiàng)為內(nèi)容環(huán)境看靠, 內(nèi)容就是一個(gè)字符串,需要整理液肌,從不同位置拷貝過來的內(nèi)容在格式上差別比較大衷笋;環(huán)境也需要整理,列表中我們?nèi)藶橐?guī)定了只能存在文本矩屁,要是粘貼內(nèi)容中有圖片辟宗、表格類似的段落,就需要拆分這個(gè)環(huán)境吝秕,內(nèi)容作為普通段落插入到被拆分后的兩個(gè)列表段落之間泊脐。


重點(diǎn)還是解決以下幾個(gè)問題

1. 先內(nèi)容還是先環(huán)境的問題?

我覺得應(yīng)該烁峭,先規(guī)范內(nèi)容容客,再考慮環(huán)境秕铛。

在最開始實(shí)現(xiàn)這個(gè)功能的時(shí)候,確實(shí)是先考慮了環(huán)境缩挑,把環(huán)境處理明白了但两,再往里加內(nèi)容。

找到光標(biāo)所在段~~》下方插空的li節(jié)點(diǎn)~~》空li節(jié)點(diǎn)處截?cái)鄜~》粘貼內(nèi)容~~》查看是否存在可合并列表

這樣的好處是谨湘,當(dāng)上傳本地圖片到編輯器中時(shí),success異步返回時(shí)芥丧,就可以直接操作DOM讓返回的內(nèi)容直接顯示在正確的位置紧阔。
缺點(diǎn)也顯而易見,要是只是粘貼文本的話续担,截?cái)嗖僮骶惋@得多余了擅耽。

所以,先內(nèi)容物遇,后環(huán)境

上傳本地圖片的異步返回中乖仇,去做替換節(jié)點(diǎn)內(nèi)容的操作,而不是去做插入新節(jié)點(diǎn)的操作询兴。

//自設(shè)binaryFlow屬性記錄剪切板轉(zhuǎn)過來的二進(jìn)制流
if(e.data.binaryFlow){
var id = Math.uuid().replace(/-/g,'');
var imgValue = e.data.binaryFlow;
var imgData = imgValue.split(',');
var data_value = imgData[1];
~
$.ajaxFileUpload({
~
data:{file_id:id,file_name:'png',image_bs64:data_value},
success:function(data,status){
    if(data.data != undefined){
        var bodyWidth = $('.mnote-document-edit-section .cke_contents[role="presentation"]')
                                .find(".cke_wysiwyg_frame.cke_reset")
                                .contents()
                                .find("body").width(),
            imgWidth = data.data.width != undefined && data.data.width != null ? data.data.width : 0,
            imgHeight = data.data.height != undefined && data.data.height != null ? data.data.height : 0;
        var tmpl = "<img {width} {height} m_width='{m_width}' m_height='{m_height}' image_id='"+ toolHelper.textHandle(data.data.file_id) +"' src='"+ toolHelper.textHandle(data.data.url) +"'/>";

        if( bodyWidth > 0 ){

         //編輯器寬度小于圖片
            if( bodyWidth < imgWidth){
                imgWidth = "100%";
                imgHeight = "";
            }
         
            //替換寬度
            if(imgWidth != undefined && imgWidth != null){
                tmpl = tmpl.replace(/{width}/g, "width=" + imgWidth).replace(/{m_width}/g, data.data.width);
            }else{
                tmpl = tmpl.replace(/{width}/g,"").replace(/{m_width}/g, "0");
            }
             
            //替換高度
            if(imgHeight != undefined && imgHeight != null){
                tmpl = tmpl.replace(/{height}/g, imgHeight == "" ? "" : "height=" + imgHeight).replace(/{m_height}/g, data.data.height);
            }else{
                tmpl = tmpl.replace(/{height}/g,"").replace(/{m_height}/g, "0");
            }
            //替換虛構(gòu)節(jié)點(diǎn)
            var tempPic = element.getDocument().findOne(" .factitiousImg ")
            tempPic.removeClass("factitiousImg");
            tempPic.getParent().setHtml(tmpl);
            

            var range = that.editor.createRange();
            range.moveToElementEditEnd( element );
            range.select();
            that.editor.fire('change');
        }else{
            alert("Error 編輯器寬度小于等于0");
        }
    }
});
}

2. 列表中行首乃沙,行中,行尾的行內(nèi)文本截?cái)鄦栴}

行首粘貼內(nèi)容應(yīng)該在其上蕉朵,行中應(yīng)該此行文本被截?cái)啻尥浚形舱迟N內(nèi)容應(yīng)該在其下

行首行尾比較簡單阳掐,就是增加空行的位置不一樣罷了始衅。行中處理邏輯有點(diǎn)亂,有三個(gè)想法缭保。

(1).光標(biāo)之后的文本做成一個(gè)li節(jié)點(diǎn)汛闸,插入到光標(biāo)所在行之下。中間再插入空段

卡手的位置:不知道怎么做成一個(gè)li節(jié)點(diǎn)艺骂。
關(guān)于range和selection不是很熟練诸老,沒有找到獲取選中域HTML的方法。

(2).復(fù)制行钳恕,上一行刪除光標(biāo)點(diǎn)到末尾别伏,下一行刪除光標(biāo)點(diǎn)到開始

卡手的位置:復(fù)制后生成行的光標(biāo)位置確定不了
首先CKeditor提供了很多設(shè)置range的方法
setStartAt和setEndAt都是在range存在于DOM中的時(shí)候,設(shè)置范圍用的忧额,兩個(gè)方法好像單獨(dú)用更合適厘肮。對于新創(chuàng)建的Range,我覺得用setStart和setEnd更靠譜一些睦番。

var deleteRange = that.editor.createRange();
//deleteRange.setStart(currentElement,cursorRange.startOffset);
deleteRange.moveToRange(that.editor.getSelection().getRanges()[ 0 ]);
deleteRange.setEnd(copyNode.getFirst(),cursorRange.startOffset);
deleteRange.select();
that.editor.getSelection().getRanges()[ 0 ].deleteeContents();
replaceLi.insertAfter(currentElement);

但是這個(gè)setEnd會報(bào)錯类茂,因?yàn)閛ffset是text節(jié)點(diǎn)中的耍属,而被克隆的是element,需要進(jìn)一步去尋找巩检。要是不加BIUS(加粗之類的)樣式厚骗,還是容易找的,但是有了樣式兢哭,節(jié)點(diǎn)就更難找了领舰。

(3).光標(biāo)處插入空白行

insertNode這個(gè)方法,真是棒極了厦瓢。提揍。。

cursorRange.insertNode(replaceLi);
var breakLi = replaceLi.getParent();
while(breakLi.getName() != 'li' && breakLi.getName() != 'body'){
    breakLi = breakLi.getParent();
}
if(breakLi.getName() == 'li'){
    replaceLi.breakParent(breakLi);
}else{
    //防范錯誤
    replaceLi.breakParent(replaceLi.getParent());
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市刨仑,隨后出現(xiàn)的幾起案子夹姥,更是在濱河造成了極大的恐慌,老刑警劉巖轻抱,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異容燕,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)醋虏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來粘舟,“玉大人霞揉,你說我怎么就攤上這事适秩。” “怎么了扬跋?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我痪宰,道長衣撬,這世上最難降的妖魔是什么垢粮? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮元潘,結(jié)果婚禮上牲距,老公的妹妹穿的比我還像新娘牍鞠。我一直安慰自己,他們只是感情好胁后,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布敲才。 她就那樣靜靜地躺著,像睡著了一般阻星。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上畦幢,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天缆蝉,我揣著相機(jī)與錄音宇葱,去河邊找鬼刊头。 笑死,一個(gè)胖子當(dāng)著我的面吹牛原杂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼畏鼓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了汗菜?” 一聲冷哼從身側(cè)響起让禀,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎菌瘪,沒想到半個(gè)月后腮敌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡俏扩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年糜工,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片录淡。...
    茶點(diǎn)故事閱讀 40,861評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡捌木,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嫉戚,到底是詐尸還是另有隱情刨裆,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布彼水,位于F島的核電站崔拥,受9級特大地震影響极舔,放射性物質(zhì)發(fā)生泄漏凤覆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一拆魏、第九天 我趴在偏房一處隱蔽的房頂上張望盯桦。 院中可真熱鬧慈俯,春花似錦、人聲如沸拥峦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽略号。三九已至刑峡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間玄柠,已是汗流浹背突梦。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留羽利,地道東北人宫患。 一個(gè)月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像这弧,于是被迫代替她去往敵國和親娃闲。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評論 2 361

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

  • 1. Vim的幾種模式 正常模式:可以使用快捷鍵命令匾浪,或按:輸入命令行皇帮。 插入模式:可以輸入文本,在正常模式下蛋辈,按...
    紅線路亞灣閱讀 17,063評論 0 1
  • 曾經(jīng)在思科的工廠測試系統(tǒng)`KlemTest` (`SUSE`命令行模式)中使用`VI`/`VIM`超過2年半玲献,現(xiàn)在...
    戈多在地獄閱讀 1,799評論 1 13
  • 目錄(?)[-] 關(guān)于Vim 1 Vim的幾種模式 啟動Vim 文檔操作 光標(biāo)的移動 1 基本移動 2 翻屏 3 ...
    SunnyLeong閱讀 8,677評論 0 32
  • 人總有一個(gè)時(shí)刻覺得自己很孤單捌年。 熱鬧是別人的,似乎與周圍的環(huán)境中間出現(xiàn)了一段真空挂洛,你在遠(yuǎn)處靜靜的看著礼预。 昨天的文章...
  • 傳承文明 經(jīng)典誦讀
    安坪小學(xué)劉影閱讀 107評論 0 0