網(wǎng)站繁簡切換的JS遇到頁面卡死的解決方法
公司打算開發(fā)繁體版本的網(wǎng)站,數(shù)據(jù)庫里的信息全是簡體,除了網(wǎng)頁上固定的文字手動翻譯了,文章內(nèi)容標(biāo)題都不是繁體。
于是在網(wǎng)上找了一段比較流行的繁簡切換的JS實(shí)現(xiàn)了,不過后來卻發(fā)現(xiàn),有些頁面會卡死,根本無法執(zhí)行下去。彈出信息表明都是這個(gè)繁簡切換的JS帶來的問題。
仔細(xì)查看了下,發(fā)現(xiàn)原來是這個(gè)問題。分享下,也許有不少人遇到類似的問題。
先上代碼:
//模仿語言包式的簡繁轉(zhuǎn)換功能插件!
var Default_isFT = 0 //默認(rèn)是否繁體,0-簡體,1-繁體
var StranIt_Delay = 50 //翻譯延時(shí)毫秒(設(shè)這個(gè)的目的是讓網(wǎng)頁先流暢的顯現(xiàn)出來)
//-------代碼開始,以下別改-------
//轉(zhuǎn)換文本
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)}
}
//轉(zhuǎn)換對象,使用遞歸,逐層剝到文本
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 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設(shè)置
{
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("點(diǎn)擊以繁體中文方式瀏覽",1,1);
innerHTML=StranText(innerHTML,1,1);
}
if(BodyIsFt=="1"){setTimeout("StranBody()",StranIt_Delay)}
}
起初我以為是那個(gè)遞歸的問題引起的,但是測試發(fā)現(xiàn)就算是很多字符,它仍然能快速的進(jìn)行替換。
經(jīng)過排查,原來是JS和OBJECT標(biāo)簽會帶來卡死的問題。繁簡切換實(shí)現(xiàn)必然會跳過某些標(biāo)簽,看到這段,它的作用就是來判斷替換哪些標(biāo)簽里的文字。
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)
}
加上這個(gè)就一切正常了:
if(OO.tagName=="OBJECT")continue;
if(OO.tagName=="SCRIPT")continue;
相關(guān)文章
JavaScript中的垃圾回收與內(nèi)存泄漏示例詳解
這篇文章主要給大家介紹了關(guān)于JavaScript中垃圾回收與內(nèi)存泄漏的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用JavaScript具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05js點(diǎn)擊button按鈕跳轉(zhuǎn)到另一個(gè)新頁面
點(diǎn)擊按鈕怎么跳轉(zhuǎn)到另外一個(gè)頁面呢?點(diǎn)擊圖片要跳轉(zhuǎn)到新的頁面時(shí),怎么做到呢?可以使用onclick=window.location=新頁面來實(shí)現(xiàn)2014-10-10JavaScript 實(shí)現(xiàn)簡單的倒計(jì)時(shí)彈窗DEMO附圖
做一個(gè)簡單的設(shè)置網(wǎng)頁,因?yàn)樾枰貑⒃O(shè)備功能,于是就想在上面加一個(gè)倒計(jì)時(shí)彈窗的界面,下面是具體的實(shí)現(xiàn),大家可以參考下2014-03-03極酷的javascirpt,讓你隨意編輯任何網(wǎng)頁
極酷的javascirpt,讓你隨意編輯任何網(wǎng)頁...2007-02-02javascript DOM編程實(shí)例(智播客學(xué)習(xí))
最近一直在努力學(xué)習(xí)DOM編程這塊,這是目前成就感最強(qiáng)烈的一塊了,畢老師很認(rèn)真的給我們講解了相關(guān)知識,并在網(wǎng)上找了很多做的非常棒的網(wǎng)頁作為例程給我們進(jìn)行講解2009-11-11JavaScript實(shí)現(xiàn)添加、查找、刪除元素
這篇文章主要匯總介紹了JavaScript實(shí)現(xiàn)添加、查找、刪除元素的方法,十分的簡單實(shí)用,有需要的小伙伴可以參考下。2015-07-07微信小程序?qū)崿F(xiàn)獲取自己所處位置的經(jīng)緯度坐標(biāo)功能示例
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)獲取自己所處位置的經(jīng)緯度坐標(biāo)功能,涉及微信小程序地圖功能獲取經(jīng)緯度信息的相關(guān)操作技巧,需要的朋友可以參考下2017-11-11