公司打算進入台灣市場,最近開發了繁體版本的網站,數據庫裡的信息全是簡體,除了網頁上固定的文字手動翻譯了,文章內容標題都不是繁體。
於是在網上找了一段比較流行的繁簡切換的JS實現了,不過後來卻發現,有些頁面會卡死,根本無法執行下去。彈出信息表明都是這個繁簡切換的JS帶來的問題。
仔細查看了下,發現原來是這個問題。分享下,也許有不少人遇到類似的問題。
先上代碼:
複製代碼代碼如下:
//模仿語言包式的簡繁轉換功能插件!
var Default_isFT = 0 //默認是否繁體,0-簡體,1-繁體
var StranIt_Delay = 50 //翻譯延時毫秒(設這個的目的是讓網頁先流暢的顯現出來)
//-------代碼開始,以下別改-------
//轉換文本
function StranText(txt,toFT,chgTxt)
{
if(txt==""||txt==null)return ""
toFT=toFT==null?BodyIsFt:toFT
if(chgTxt)txt=txt.replace((toFT?"簡":"繁"),(toFT?"繁":"簡"))
if(toFT){return Traditionalized(txt)}
else {return Simplized(txt)}
}
//轉換對象,使用遞歸,逐層剝到文本
function StranBody(fobj)
{
if(typeof(fobj)=="object"){var obj=fobj.childNodes}
else
{
var tmptxt=StranLink_Obj.innerHTML.toString()
if(tmptxt.indexOf("簡")<0)
{
BodyIsFt=1
StranLink_Obj.innerHTML=StranText(tmptxt,0,1)
//StranLink.title=StranText(StranLink.title,0,1)
}
else
{
BodyIsFt=0
StranLink_Obj.innerHTML=StranText(tmptxt,1,1)
//StranLink.title=StranText(StranLink.title,1,1)
}
setCookie(JF_cn,BodyIsFt,7)
var obj=document.body.childNodes
}
for(var i=0;i<obj.length;i++)
{
var OO=obj.item(i)
if("||BR|HR|TEXTAREA|".indexOf("|"+OO.tagName+"|")>0||OO==StranLink_Obj)continue;
if(OO.title!=""&&OO.title!=null)OO.title=StranText(OO.title);
if(OO.alt!=""&&OO.alt!=null)OO.alt=StranText(OO.alt);
if(OO.tagName=="INPUT"&&OO.value!=""&&OO.type!="text"&&OO.type!="hidden")OO.value=StranText(OO.value);
if(OO.nodeType==3){OO.data=StranText(OO.data)}
else StranBody(OO)
}
}
function JTPYStr()
{
return '皚藹礙愛翱襖奧壩罷擺敗頒辦絆幫綁鎊謗剝飽寶報鮑輩貝鋇狽備憊繃筆畢斃閉邊編貶變辯辮鱉癟瀕濱賓擯餅撥缽鉑駁卜補參蠶殘慚慘燦蒼艙倉滄廁側冊測層詫攙摻蟬饞讒纏鏟產闡顫場嘗長償腸廠暢鈔車徹塵陳襯撐稱懲誠騁痴遲馳恥齒熾衝蟲寵疇躊籌綢醜櫥廚鋤雛礎儲觸處傳瘡闖創錘純綽辭詞賜聰蔥囪從叢湊竄錯達帶貸擔單鄲撣膽憚誕彈當擋黨盪檔搗島禱導盜燈鄧敵滌遞締點墊電淀釣調迭諜疊釘頂錠訂東動棟凍鬥犢獨讀賭鍍鍛斷緞兌隊對噸頓鈍奪鵝額訛惡餓兒爾餌貳發罰閥琺礬釩煩範販飯訪紡飛廢費紛墳奮憤糞豐楓鋒風瘋馮縫諷鳳膚輻撫輔賦复負訃婦縛該鈣蓋幹趕稈贛岡剛鋼綱崗皋鎬擱鴿閣鉻個給龔宮鞏貢鉤溝構購夠蠱顧剮關觀館慣貫廣規矽歸龜閨軌詭櫃貴劊輥滾鍋國過駭韓漢閡鶴賀橫轟鴻紅後壺護滬戶嘩華畫劃話懷壞歡環還緩換喚瘓煥渙黃謊揮輝毀賄穢會燴匯諱誨繪葷渾夥獲貨禍擊機積飢譏雞績緝極輯級擠幾薊劑濟計記際繼紀夾莢頰賈鉀價駕殲監堅箋間艱緘繭檢鹼鹼揀撿簡儉減薦檻鑑踐賤見鍵艦劍餞漸濺澗漿蔣槳獎講醬膠澆驕嬌攪鉸矯僥腳餃繳絞轎較秸階節莖驚經頸靜鏡徑痙競淨糾厩舊駒舉據鋸懼劇鵑絹傑潔結誡屆緊錦僅謹進晉燼盡勁荊覺決訣絕鈞軍駿開凱顆殼課墾懇摳庫褲誇塊儈寬礦曠況虧巋窺饋潰擴闊蠟臘萊來賴藍欄攔籃闌蘭瀾讕攬覽懶纜爛濫撈勞澇樂鐳壘類淚籬離裡鯉禮麗厲勵礫歷瀝隸倆聯蓮連鐮憐漣簾斂臉鏈戀煉練糧涼兩輛諒療遼鐐獵臨鄰鱗凜賃齡鈴凌靈嶺領餾劉龍聾嚨籠壟攏隴樓婁摟簍蘆盧顱廬爐擄鹵虜魯賂祿錄陸驢呂鋁侶屢縷慮濾綠巒攣孿灤亂掄輪倫崙淪綸論蘿羅邏鑼籮騾駱絡媽瑪碼螞馬罵嗎買麥賣邁脈瞞饅蠻滿謾貓錨鉚貿麼黴沒鎂門悶們錳夢謎彌覓綿緬廟滅憫閩鳴銘謬謀畝鈉納難撓腦惱鬧餒膩攆捻釀鳥聶囓鑷鎳檸獰寧擰濘鈕紐膿濃農瘧諾歐鷗毆嘔漚盤龐國愛賠噴鵬騙飄頻貧蘋憑評潑頗撲鋪樸譜臍齊騎豈啟氣棄訖牽扦釬鉛遷簽謙錢鉗潛淺譴塹槍嗆牆薔強搶鍬橋喬僑翹竅竊欽親輕氫傾頃請慶瓊窮趨區軀驅齲顴權勸卻鵲讓饒擾繞熱韌認紉榮絨軟銳閏潤灑薩鰓賽傘喪騷掃澀殺紗篩曬閃陝贍繕傷賞燒紹賒攝懾設紳審嬸腎滲聲繩勝聖師獅濕詩屍時蝕實識駛勢釋飾視試壽獸樞輸書贖屬術樹豎數帥雙誰稅順說碩爍絲飼聳慫頌訟誦擻蘇訴肅雖綏歲孫損筍縮瑣鎖獺撻抬攤貪癱灘壇譚談嘆湯燙濤絛騰謄銻題體屜條貼鐵廳聽烴銅統頭圖塗團頹蛻脫鴕馱駝橢窪襪彎灣頑萬網韋違圍為濰維葦偉偽緯謂衛溫聞紋穩問甕撾蝸渦窩嗚鎢烏誣無蕪吳塢霧務誤錫犧襲習銑戲細蝦轄峽俠狹廈鍁鮮纖咸賢銜閒顯險現獻縣餡羨憲線廂鑲鄉詳響項蕭銷曉嘯蠍協挾攜脅諧寫瀉謝鋅釁興洶銹繡虛噓須許緒續軒懸選癬絢學勳詢尋馴訓訊遜壓鴉鴨啞亞訝閹煙鹽嚴顏閻艷厭硯彥諺驗鴦楊揚瘍陽癢養樣瑤搖堯遙窯謠藥爺頁業葉醫銥頤遺儀彝蟻藝億憶義詣議誼譯異繹蔭陰銀飲櫻嬰鷹應纓瑩螢營熒蠅穎喲擁傭癰踴詠湧優憂郵鈾猶遊誘輿魚漁娛與嶼語籲禦獄譽預馭鴛淵轅園員圓緣遠願約躍鑰岳粵悅閱雲鄖勻隕運蘊醞暈韻雜災載攢暫贊贓臟鑿棗灶責擇則澤賊贈扎札軋鍘閘詐齋債氈盞斬輾嶄棧戰綻張漲帳賬脹趙蟄轍鍺這貞針偵診鎮陣掙睜猙幀鄭證織職執紙摯擲幟質鐘終種腫眾謅軸皺晝驟豬諸誅燭矚囑貯鑄築駐專磚轉賺樁莊裝妝壯狀錐贅墜綴諄濁茲資漬踪綜總縱鄒詛組鑽致鐘麼為只兇準啟板裡靂餘鏈洩台標';
}
function FTPYStr()
{
return '疊矽後夥麽甯';
}
function JTPYWord(){
var jtpyword = new Array('“','”',''',''','三管','三極管' ,'中文','串行','串列加速器','以太網' ,'奶酪','二管','二極管','交互式','阿塞拜疆','人工智能','接口','任意球','任意球員',
'服務器','字','字節','優先級','元','元兇','光盤','光驅','克地','克羅地亞','全角','冬天' ,'冬日','涼菜','冷菜',
'凶器','器','兇徒','徒','手','兇手','案','兇案','兇','','兇殘','','兇殺', '兇','分佈式','打印','列支敦士登','剪彩',
'加蓬','總線','局域網','特立尼和多巴哥','特立尼達和托巴哥','半角','卡塔','卡塔爾','打印', '打印機','厄立特里','厄立特里亞','厄瓜多爾','厄瓜多',
'斯威士蘭','斯威士','吉布提','吉布堤','基里巴斯','瓦','圖瓦盧','哈薩克斯坦','哥斯黎加','哥斯達黎加','格吉','格魯吉亞','佐治亞','佐治','嘴',
'土庫曼斯坦','薯仔','土豆','土豆網','坦桑尼亞','坦桑尼','端口','塔吉克斯坦','塞舌爾','塞舌','塞浦路斯','夏天','夏日',
'多明尼加共和','多米尼加共和國','多米尼加共和','多米尼加國','多明尼加','穿梭','航天飛機','尼日利亞','尼日利',
'字符','字號','字庫','字符集','存盤','安提瓜和巴布','安提瓜和巴布達','宋元','洪都拉斯','尋址','寒假','寬帶','老','老撾',
'打門','比','贊比亞','尼日','尼日爾','山洞','巴布新畿','巴布亞新幾內亞','巴巴多斯','布基納法索' ,'布基法索','布什','布殊','帕勞','例程',
'平治之亂','平治之','幾內亞比紹','比','彩帶','彩排','彩樓','彩牌樓','','復甦','心', '快閃存儲器','閃存','傳感','習用','戲彩娛親',
'手電筒','手電','括號','拿破','拿破崙','架','掃瞄儀','掛鉤','','控件','台球','桌球', '便攜式','故事','調製解調器','制解器','斯洛文尼','斯洛文尼亞',
'新紀元','新元','日子','春假','春天','春日','','芯片','暑假','乍得','克林','克林頓','格林','格林納達','凡高','森林','榴','榴蓮','仿真',
'毛里裘斯','毛里求斯','械人','機器人','字段','元音','永曆','文萊','沙特阿拉伯','沙地阿拉伯','波斯尼黑塞哥那','波斯尼亞和黑塞哥維那','博茨瓦納','博茨瓦','侯賽因','侯因',
'深','光標','鼠標','算法','烏茲別克斯坦','詞組','塞拉利昂','危地馬拉','危地拉','岡比亞','比','疑' ,'疑凶','皮秋','旺','盧旺達','真兇','真','矽片','矽谷',
'硬盤','硬件','盤片','磁盤','磁道','福士','秋假','秋天','秋日','程控','突尼斯','尾註','蹦極跳','綁緊跳','等於','短','短信','新西','新西蘭','所羅門群島','所群',
'索里','索馬里','結彩','佛得角','','網絡','互','因特網','彩球','彩綢','彩線','彩船','彩衣' ,'緝兇','','兇','意大利','老字號',
'聖基茨和尼維斯','吉斯域斯','文森特和格林丁斯','聖文森特和格林納丁斯','聖盧西亞','西','聖馬力諾', '力','肚','肯尼亞','肯雅','任意球',
'航天大學','苦','毛里塔尼亞','毛里塔尼','莫桑比克','萬曆','瓦努阿圖','瓦努阿','也','也門','著','科摩','科摩羅','布隆迪','圭那','圭亞那','火鍋蓋帽','蘇里南',
'行凶','行','行凶後','行後','行凶後','流','移動電話','行程控制','衛生','生','埃塞俄比亞','埃塞俄比','勾外','面','分辨率','譯碼','出租車','權限','瑙魯','瑙',
'變量','科特迪瓦','','貝寧','伯利','伯利茲','','買兇','兇' ,'數據庫','信息論','奔馳', '平治','利比里亞','利比里','索托','萊索托','軟驅','件','軟件','加載',
'津巴布韋','津巴布','詞彙','加納','加','追兇','追','','信道','逞凶狠','逞狠','逞兇鬥狠','即食','方便麵','快速面','連字號','進制','入球','算子','程控制','遠程控制',
'','院','酰','巨商','鉤','','鉤心鬥角','心角','寫保護','阿拉伯聯合酋長國','阿拉伯合酋','噪聲','脫機','雪','雪蕻','雪鐵龍','異步','聲卡','缺省','頒布','',
'域','頭球','粒入球','馬里共和國','里共和','馬耳他','馬爾代夫','代夫','事得','狄安娜','戴安娜','','位圖','商舖','商','提交','店鋪','店','台灣','台灣','發布','布');
return jtpyword;
}
function FTPYWord(){
var ftpyword = new Array('「','」','『','』','三','三','中文','串列','串列加速器','乙太', '乳酪','二','二','互式','塞拜然','人工智慧','介面','任意球','任意球',
'伺服器','位元','位元','先序','元兇','元兇','光碟','光碟','克埃西','克埃西','全形','冬天','冬日','冷','冷',
'凶器','凶器','兇徒','兇徒','兇手','兇手','兇案','兇案','兇','兇','兇','兇','兇','兇','分散式','列印','列支敦斯登','剪',
'加彭','流排','域','千里托哥','千里托哥','半形','卡','卡','印表','印表','厄利垂','厄利垂','厄瓜多','厄瓜多',
'史瓦','史瓦','吉布地','吉布地','吉里巴斯','吐瓦','吐瓦','哈克','哥斯大黎加','哥斯大黎加','治','治','治','治','嘴',
'土曼','土豆','土豆','土豆','坦尚尼','坦尚尼','埠','塔吉克','塞席','塞席','塞普勒斯','夏天','夏日',
'多明尼加','多明尼加','多明尼加','多米尼克','多米尼克','太空梭','太空梭','奈及利','奈及利',
'字元','字型大小','字型','字符集','存','安地卡及巴布','安地卡及巴布', '宋元','宏都拉斯','定址','寒假','','寮','寮',
'射','尚比','尚比','尼日','尼日','山洞', '巴布','巴布','巴多','布吉法索','布吉法索','布希','布希','帛琉','常式',
'平治之','平治之','比索','比索','彩','彩排','彩','彩牌','','','心','快','快','感','用','',
'手筒','手筒','括弧','拿破','拿破','捷豹','瞄器','','','控制','撞球','撞球' ,'型','故事', '','','斯洛尼','斯洛尼',
'新元','新元','日子','春假','春天','春日','','晶元','暑假','查德','柯林','柯林','格瑞那','格瑞那','梵谷','森林','榴','榴','模',
'模里西斯','模里西斯','器人','器人','位','母音','永','汶','沙地阿拉伯','沙地阿拉伯','波士尼赫塞哥','波士尼赫塞哥','波札那','波札那','海珊','海珊',
'深','遊','滑鼠','演算法','克','片','子山','瓜地拉','瓜地拉','甘比','甘比','疑凶','疑凶','皮秋','安','安','真兇','真兇','矽片','矽谷',
'硬碟','硬','碟片','磁碟','磁','福斯','秋假','秋天','秋日','程式控制','突尼西','章附','笨跳','笨跳','等於','','','西','西','索群','索群',
'索利','索利','','德角','路','路','路','路','球','','','船','衣','兇','兇','兇','大利','老字',
'克里斯多福及尼斯','克里斯多福及尼斯','文森及格瑞那丁','文森及格瑞那丁','露西','露西','利', '利','肚','肯','肯','自由球',
'航天大','苦','茅利塔尼','茅利塔尼','莫三比克','','那杜','那杜','','','著','葛摩','葛摩','蒲隆地','那','那','火','利南',
'行凶','行凶','行凶後','行凶後','行凶後','行','行','行程控制','生','生','衣索比', '衣索比','勾外','面','解析度','解','程','可','','',
'','象牙海岸','南','南','里斯','里斯','兇','兇','兇','料','理','士','士','比瑞','比瑞','索托','索托','碟','','','入',
'辛巴威','辛巴威','','迦','迦','追兇','追兇','','通道','逞凶狠','逞凶狠', '逞凶狠','速食','速食','速食','字','位','球','算元','程控制','程控制',
'那杜','院','醯','','','','心角','心角','防','阿拉伯合大公','阿拉伯合大公','' ,'','雪','雪蕻','雪','非同步','音效卡','','布','布',
'域','槌','球','利共和','利共和','他','地夫','地夫','自','黛安娜','黛安娜', '','','展','展','送出','展','展','','','','');
return ftpyword;
}
function Traditionalized(cc){
var str='',ss=JTPYStr(),tt=FTPYStr();
var ssa = JTPYWord(),tta = FTPYWord();
for(var i=0;i<cc.length;i++)
{
if(cc.charCodeAt(i)>10000&&ss.indexOf(cc.charAt(i))!=-1)str+=tt.charAt(ss.indexOf(cc.charAt(i)));
else str+=cc.charAt(i);
}
for(var j=0;j<ssa.length;j++){
if(str.indexOf(ssa[j]) >= 0){
str = str.replace(ssa[j],tta[j]);
}else{
str = str;
}
}
return str;
}
function Simplized(cc){
var str='',ss=JTPYStr(),tt=FTPYStr();
var ssa = JTPYWord(),tta = FTPYWord();
for(var i=0;i<cc.length;i++)
{
if(cc.charCodeAt(i)>10000&&tt.indexOf(cc.charAt(i))!=-1)str+=ss.charAt(tt.indexOf(cc.charAt(i)));
else str+=cc.charAt(i);
}
for(var j=0;j<ssa.length;j++){
if(str.indexOf(tta[j]) >= 0){
str = str.replace(tta[j],ssa[j]);
}else{
str = str;
}
}
return str;
}
function setCookie(name, value) //cookies設置
{
var argv = setCookie.arguments;
var argc = setCookie.arguments.length;
var expires = (argc > 2) ? argv[2] : null;
if(expires!=null)
{
var LargeExpDate = new Date ();
LargeExpDate.setTime(LargeExpDate.getTime() + (expires*1000*3600*24));
}
document.cookie = name + "=" + escape (value)+((expires == null) ? "" : ("; expires=" +LargeExpDate.toGMTString()));
}
function getCookie(Name) //cookies讀取
{
var search = Name + "="
if(document.cookie.length > 0)
{
offset = document.cookie.indexOf(search)
if(offset != -1)
{
offset += search.length
end = document.cookie.indexOf(";", offset)
if(end == -1) end = document.cookie.length
return unescape(document.cookie.substring(offset, end))
}
else return ""
}
}
var StranLink_Obj=document.getElementById("StranLink")
if (StranLink_Obj)
{
var JF_cn="ft"+self.location.hostname.toString().replace(//./g,"")
var BodyIsFt=getCookie(JF_cn)
if(BodyIsFt!="1")BodyIsFt=Default_isFT
with(StranLink_Obj)
{
if(typeof(document.all)!="object") //非IE瀏覽器
{
href="javascript:StranBody()"
}
else
{
href="#";
onclick= new Function("StranBody();return false")
}
title=StranText("點擊以繁體中文方式瀏覽",1,1);
innerHTML=StranText(innerHTML,1,1);
}
if(BodyIsFt=="1"){setTimeout("StranBody()",StranIt_Delay)}
}
起初我以為是那個遞歸的問題引起的,但是測試發現就算是很多字符,它仍然能快速的進行替換。
經過排查,原來是JS和OBJECT標籤會帶來卡死的問題。繁簡切換實現必然會跳過某些標籤,看到這段,它的作用就是來判斷替換哪些標籤裡的文字。
複製代碼代碼如下:
for(var i=0;i<obj.length;i++)
{
var OO=obj.item(i)
if("||BR|HR|TEXTAREA|".indexOf("|"+OO.tagName+"|")>0||OO==StranLink_Obj)continue;
if(OO.title!=""&&OO.title!=null)OO.title=StranText(OO.title);
if(OO.alt!=""&&OO.alt!=null)OO.alt=StranText(OO.alt);
if(OO.tagName=="INPUT"&&OO.value!=""&&OO.type!="text"&&OO.type!="hidden")OO.value=StranText(OO.value);
if(OO.nodeType==3){OO.data=StranText(OO.data)}
else StranBody(OO)
}
加上這個就一切正常了:
複製代碼代碼如下:
if(OO.tagName=="OBJECT")continue;
if(OO.tagName=="SCRIPT")continue;