js實現簡體繁體轉換插件(全業態)並真實應用於項目

 
/***
  *@TITLE   <javasrctipt中文簡體轉換爲繁體AND中文轉換英文插件>
  *@TIME   2014/4/27   22:10
  *@AUTHOR  任孟洋(RMY)  RenMengYangIT@163.com
  *@封裝模式爲自調用匿名函數(function(){})(); 這樣的好處是開發不污染頂層變量,防止在項目中多人開發時函數重命名
  *解釋:  var  i = function(){ alert(xx);} ;  i() ;與  (function(){ alert(xxx);})();是相同的    
  * 轉換英文:我準備用goole的APi作
  *Cookie的增查
  *中文字符庫(從百度而來字體因爲,我用的經常使用的字庫,那麼翻譯率爲80%以上);
  *使用實例:
  *  <html>
  *<script type="text/javascript">
  *   window.onload = function () {
  *       $.init('xxx');
  *  }
  *</script>
  * <a id="xxx" >繁體中文</a>
  *  <html>
  *配置項:Simplified_lib 中文簡體包
  *配置項:Traditional_lib繁體簡體包
  *順便說一下,代碼在oschina的發佈,代碼有點亂,原本很工整的嘛
  **/
(function(){

  // 默認配置文件
    var Config =  { 
         ExpiresDay :  1 ,          //Cookie的默認過時的時間
         DefaultCoding : 0,  //默認是否繁體,0:簡體,1:繁體,2: 中文轉英文(這裏不能修改)
         TranslateDelay : 40,    //翻譯延時毫秒(定時器多少時間內進行翻譯)
         SelectDemo : '||BR|HR|TEXTAREA|INPUT|' ,  
         Simplified_lib : ' '   //簡體語言包
         Traditional_lib:' '  //繁體語言包
   };

 // 封裝一個經常使用的dom操做--dom操做- 
    var RMY = function(id) {
     return document.getElementById(id);
    };

    RMY.AllBodyNodes = function () { 
    return  document.body.childNodes;
 }

    //封裝一個檢查當前是繁體||簡體的操做
    RMY.init = function(id){
      Dom_Obj =  RMY(id) ;
     if ( Dom_Obj ) {
                  //self.location.hostname   self表示wiondws .location表示url . hostname:主機名字 並域名中的.替換成空
       Host_Cn = "RMY"+self.location.hostname.toString().replace(/\./g,"");   
       HostBodyCoding = RMY.GetCookie(Host_Cn); //定義全局變量
       if ( HostBodyCoding != "1")  HostBodyCoding= Config.DefaultCoding;
     /* 可擴展處
      switch (HostBodyCoding) {
                case  '0' : 
                case  '1' :
                 case  '2':
     }
     */
    with(Dom_Obj){   //取得A標籤元素

      if (window.ActiveXObject){  //IE瀏覽器
            href="#";  //向A中添加屬性
            nclick= new Function("$.ConvertBody();return false");   //添加一個事件
        }else{
            //w3c標準
           href="javascript:$.ConvertBody()";  //添加屬性
        } 
          title = RMY.CheckFont("繁體中文瀏覽",1,1);  //添加屬性
          innerHTML = RMY.CheckFont(innerHTML,1,1);   //填充內容

     }
         
     HostBodyCoding == "1" ? setTimeout("$.ConvertBody()",Config.TranslateDelay) : '';//在隔多少時間進行自動翻譯
  };

  };

  //執行翻譯遞歸解析出元素值與文本,再進行轉換

  RMY.ConvertBody = function (Dom_Html) {

    if (typeof(Dom_Html) === "object" ) {  
  
               var   Dom_BodyNodes = Dom_Html.childNodes ; //得到頁面中全部的HTMldome元素 這一步是爲了遞歸考慮

    } else {
         //若是未定義對象
         var  txt = Dom_Obj.innerHTML.toString();     
       if (txt.indexOf("簡")<0) {
           HostBodyCoding = 1 ;  //變成繁體
           Dom_Obj.innerHTML=RMY.CheckFont(txt,0,1);  //原理的繁體變簡體
           Dom_Obj.title =RMY.CheckFont(Dom_Obj.title ,0,1);  //原理的簡體變繁體
       } else {
        
           HostBodyCoding = 0 ; //變簡體     
           Dom_Obj.innerHTML=RMY.CheckFont(txt,1,1); 
           Dom_Obj.title =RMY.CheckFont(Dom_Obj.title ,1,1); 
       }

          RMY.SetCookie(Host_Cn,HostBodyCoding);
                                            //獲取網頁的全部的Dome元素

         var   Dom_BodyNodes = RMY.AllBodyNodes();
         //若是定義了對象
 
    }
         
            //取出dom元素下的系類文本 ...
   for(var i=0;i<Dom_BodyNodes.length;i++)
   {                        
     var Chlid=Dom_BodyNodes.item(i);
     if(Config.SelectDemo.indexOf("|"+Chlid.tagName+"|") > 0 || Chlid == Dom_Obj) continue;
     if(Chlid.title!=""&&Chlid.title!=null)Chlid.title=RMY.CheckFont(Chlid.title.replace(/^\s+|\s+$/g,""));  //取出Title
     if(Chlid.alt!=""&&Chlid.alt!=null)Chlid.alt=RMY.CheckFont(Chlid.alt.replace(/^\s+|\s+$/g,""));   //去alert
     if(Chlid.tagName=="INPUT"&&Chlid.value!=""&&Chlid.type!="text"&&Chlid.type!="hidden") Chlid.value=RMY.CheckFont(Chlid.value.replace(/^\s+|\s+$/g,"")) ;
           if(Chlid.nodeType==3){Chlid.data=RMY.CheckFont(Chlid.data.replace(/^\s+|\s+$/g,"")); }else{   
      RMY.ConvertBody(Chlid); //遞歸
         };
     
   }

  }

  //檢查當前字體
   RMY.CheckFont = function(txt,toFT,chgTxt){
    if(txt==""||txt==null)return ""
    toFT=toFT==null?HostBodyCoding:toFT;

    if (chgTxt) txt = txt.replace((toFT?"簡":"繁"),(toFT?"繁":"簡"));
    if (toFT) {

      return RMY.FontChanger(txt,1); 
    
    } else {

      return  RMY.FontChanger(txt,0)
    }
   };
   //字體轉換
      //Tap  0 簡體 1:繁體  2:英文
   RMY.FontChanger= function(txt,Tap=1){
   var Str='',Str_Simplified =Config.Simplified_lib,Str_Traditional=Config.Traditional_lib;
   var StrLen =txt.length;   //長度
   switch (Tap) {
         case   0 :  //繁體轉簡體
          for (var i =0; i<StrLen; i++) {
              var StrIndex = Str_Traditional.indexOf(txt.charAt(i)); //在簡體字庫中搜索文本下標
              if(txt.charCodeAt(i)>10000&&StrIndex !=-1) { //排除沒搜索到的而且Undecde編號要大於10000
               Str +=Str_Simplified.charAt(StrIndex);  //到繁體字庫中去查找索引下標爲Strndex 文 字     
              }  else {
                Str +=txt.charAt(i); //文字中有簡體
              }
          }
             break;
         case   1 :  //簡體轉繁體
          for (var i =0; i<StrLen; i++) {
              var StrIndex = Str_Simplified.indexOf(txt.charAt(i)); //在簡體字庫中搜索文本下標
              if(txt.charCodeAt(i)>10000&&StrIndex !=-1) { //排除沒搜索到的而且Undecde編號要大於10000 
               Str+=Str_Traditional.charAt(StrIndex);  //到繁體字庫中去查找索引下標爲Strndex 文字     
              }  else {         
               Str+=txt.charAt(i); //文字中有簡體
              }
           }
          break;
         case  2 :  break;
       }

   Str_Simplified = null ;  Str_Traditional = null; StrIndex= null; //變量銷燬

   return   Str ;
    }

   //封裝一個設置Cookie
   //arguments獲取當前函數的參數的列表, 
   //若是當前參數大於了2個說明設置了多個參數那麼第三個參數就是設置的過時時間
   //直接把第三個參數的值賦值ExpiresTime,若是沒設置那麼直接爲空,
   //若是寫的比較嚴謹的話這裏還要對第三個參數的進行驗證,必須數字類型,目前就先不寫了,其實也不太影響
  RMY.SetCookie = function(Name,Value) {
     var ExpiresDay = (arguments.length> 2) ? arguments[2] :  Config.ExpiresDay; 
     var LargeExpDate = new Date ();
            LargeExpDate.setTime(LargeExpDate.getTime() + (ExpiresDay*1000*3600*24));
           document.cookie = Name + "="+ escape (Value) + ";expires=" + LargeExpDate.toGMTString();  //寫入Cookie
  }

  //封裝一個獲取Cookie
   RMY.GetCookie = function(Name) {
   var Search = Name + "=";
   if(document.cookie.length > 0) 
   {
    Offset = document.cookie.indexOf(Search) ;  //查找字符的開始位置    
    if (Offset != -1)  //沒有當前的Cookie
    {
     Offset += Search.length;
     End = document.cookie.indexOf(";", Offset);
     if (End == -1) End = document.cookie.length;
     return unescape(document.cookie.substring(Offset, End));
     }else{return '';}

     }
  }

 window.$ = RMY;

})();
相關文章
相關標籤/搜索