天天看點

JS編輯器擷取選擇内容的HTML多浏覽器相容性寫法(支援Chorme、Firefox)

js編輯器擷取選擇内容的html相容性寫法問題描述:

JS編輯器擷取選擇内容的HTML多浏覽器相容性寫法(支援Chorme、Firefox)

對于如何擷取選擇的文本(包括html标簽),通常網絡上的答案是:

var  deditor=document.getelementbyid('iframe名稱').contentwindow;

ie:deditor.pos.htmltext,獲得html内容。

其它浏覽器:deditor.window.getselection().tostring(); 僅擷取不包括html标簽的文本。

問題:假充你給一段選擇的文字(包括換行、段落格式化的),加一個背影或邊框等操作時,如果html标簽都失蹤了,僅剩下文字,那就不是您想要的效果了。

JS編輯器擷取選擇内容的HTML多浏覽器相容性寫法(支援Chorme、Firefox)

解決問題步驟一:網絡搜尋 

JS編輯器擷取選擇内容的HTML多浏覽器相容性寫法(支援Chorme、Firefox)

本人并不善長js,深夜中,隻能靠程式員的本能,百度或google現搜現處理了。 

然而這個網際網路,稍為有點細活的代碼,網絡上總是難以搜尋,偶爾搜出來的,除了沒有答案,另外就是通用性:

deditor.window.getselection().tostring()或deditor.window.getselection().getrangeat(0)。

類似的隻能擷取文字,可是,我要的是包括html标簽的文本,你本應該懂的。

JS編輯器擷取選擇内容的HTML多浏覽器相容性寫法(支援Chorme、Firefox)

解決問題步驟二:代碼調試

在指定相關符合關鍵字不多的網頁中, 找到一個特殊的功能:“chrome“的腳本調試。

調試方法:工具 - 開發人員工具 - scripts - 選擇要調試的js檔案。

接下來就是左側設定斷點,右邊的設定監控變量和控制下一步等。 

很遺憾的是,雖然能調試,試了很多屬性和方法,可是還是沒發現chorme下能擷取 選擇的内容的html方式。

調試截圖如下:

JS編輯器擷取選擇内容的HTML多浏覽器相容性寫法(支援Chorme、Firefox)

解決問題步驟三:重複網絡搜尋

一般比較有價值的代碼,網上很少會直接出現,一方是開發人員比較舍不得,另一方面是大夥不太愛寫文章。

是以,繼續搜尋,從各類不同的文章中,提取出可能有用的代碼。

最後,不知在哪了,看到了一個:selection.getrangeat(0).clonecontents().childnodes。

從正常的思維中,clone後再取子節點,和直接取子節點,有啥差別呢?可是就是有差別。

解決問題步驟四:重複的代碼調試

繼續調試,斷點,監控變量及值,最後發現,通過克隆後取的子節點,可以取到outerhtml屬性,于是問題比較明朗化,寫個方法for一下組合。

JS編輯器擷取選擇内容的HTML多浏覽器相容性寫法(支援Chorme、Firefox)

    function getchormeinnerhtml(nodes)

    {

        var result='';

var node=null;

for (var i = 0; i < nodes.length; i++)

{

node=nodes[i];

if(node.outerhtml)

result+=node.outerhtml;

}

else if(node.nodevalue)

result+=node.nodevalue;

        return result.replace("<div><br></div>","<br>");

    }

JS編輯器擷取選擇内容的HTML多浏覽器相容性寫法(支援Chorme、Firefox)

 由于在chorme下每次回車都産生"<div><br></div>“,于是去掉多餘的辨別。

浏覽器相容,不會讓你太輕松

本來以為問題解決了,于是在firefox下試了一下,靠,這b的firefox,竟然不行。

于是使用firfox,進行腳本調試,發現firefox下獲得到子節點,根本沒有outerhtml屬性,太悲劇了,連這個都沒有,問題又卡住了。

解決問題步驟五:持續的網絡搜尋

關鍵換成了firefox下的js選擇html的相關内容及相容寫法,可惜,網絡上都是迷惑人标題+沒有答案的内容。

在經過n小時的頭腦風暴和搜尋體驗之後,冷靜了一下,b的,回去繼續調試,看能不能發現新大陸。

解決問題步驟六:持續的調試代碼

在firfox下,調試各屬性可能産生的值,及出來的值,明顯的沒有直接的答案。

最後發現,由于是節點,節點就是屬性,标簽名、内容文本夠成的。

調試如下圖:

JS編輯器擷取選擇内容的HTML多浏覽器相容性寫法(支援Chorme、Firefox)

解決問題步驟七:創新思維:無招剩有招,沒有現成的,不要怕麻煩,一切從頭組裝 

在發揮不怕麻煩的精神下,自己重新組合節點的outerhtml,再把所有節點的outerhtml拼接起來。

JS編輯器擷取選擇内容的HTML多浏覽器相容性寫法(支援Chorme、Firefox)

function getfirefoxinnerhtml(nodes)

        var node;

        for (var i = 0; i < nodes.length; i++)

        {

            node=nodes[i];

            if(node.nodevalue) 

 //純文字節點還原。

            {

                result+=node.nodevalue;

            }

            else if(node.tagname)

                result+="<"+node.tagname;

                if(node.innerhtml)

                {

                    //屬性還原。

                    if(node.attributes && node.attributes.length>1)

                    {

                        for(var j=0;j<node.attributes.length-1;j++) // 忽略最後一個,最後一個是firfox自己的節點。

                        {

                            result+=' '+node.attributes[j].name+"='"+node.attributes[j].value+"'";

                        }

                    }

                    result+=">"+node.innerhtml+"</"+node.tagname+">";

                }

                else

                    result+=" />";

        }

        return result;

     } 

JS編輯器擷取選擇内容的HTML多浏覽器相容性寫法(支援Chorme、Firefox)

步驟八:花點時間,記錄在案,分享成果,後續可查。

其它: 

這兩三天,花了點功能,給秋色園的部落格增加了論壇模式,簡單切換皮膚就變成了論壇,省去了部署論壇的麻煩,還省了點伺服器費用。

繼續閱讀