JS編輯器獲取選擇內容的HTML多瀏覽器兼容性寫法(支持Chorme、Firefox)


昨天突然興起,准備完善秋色園后台的編輯器關於Chrome、FireFox下的選擇內容的HTML兼容處理。

 

JS編輯器獲取選擇內容的HTML兼容性寫法問題描述:

對於如何獲取選擇的文本(包括Html標簽),通常網絡上的答案是:

var  deditor=document.getElementById('iframe名稱').contentWindow;

IE:deditor.pos.htmlText,獲得html內容。

其它瀏覽器:deditor.window.getSelection().toString(); 僅獲取不包括html標簽的文本。

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

 

既然知道了問題,如何解決JS兼容性

 

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

本人並不善長js,深夜中,只能靠程序員的本能,百度或Google現搜現處理了。 

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

deditor.window.getSelection().toString()或deditor.window.getSelection().getRangeAt(0)。

類似的只能獲取文字,可是,我要的是包括Html標簽的文本,你本應該懂的。

 

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

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

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

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

 

很遺憾的是,雖然能調試,試了很多屬性和方法,可是還是沒發現Chorme下能獲取 選擇的內容的Html方式。

調試截圖如下:

 

解決問題步驟三:重復網絡搜索

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

因此,繼續搜索,從各類不同的文章中,提取出可能有用的代碼。

最后,不知在哪了,看到了一個:selection.getRangeAt(0).cloneContents().childNodes。


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

 

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

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

     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>");
    }

 由於在Chorme下每次回車都產生"<div><br></div>“,於是去掉多余的標識。

瀏覽器兼容,不會讓你太輕松

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

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

 

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

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

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

 

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

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

最后發現,由於是節點,節點就是屬性,標簽名、內容文本夠成的。

調試如下圖:


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

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

function GetFireFoxInnerHTML(nodes)
    {
         var result='';
         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;

     } 

 

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


其它: 

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

博客論壇模式示例:微博粉絲精靈 官網論壇示例,后續再考慮是否綁定BBS二級域名的SEO問題。 


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM