encode腳本和normal腳本混用的問(wèn)題與解決方法
更新時(shí)間:2007年03月08日 00:00:00 作者:
半年前第一次做腳本編碼的時(shí)候,由于沒有什么使用經(jīng)驗(yàn),于是在51js上詢問(wèn)了一下encode腳本和normal腳本混用是否有什么問(wèn)題呢?結(jié)果沒有得到任何有建設(shè)性的意見,這也至少說(shuō)明了兩個(gè)問(wèn)題,一是沒有人在意,二是就沒有什么問(wèn)題嘛。當(dāng)然我更樂(lè)意于接受后一種結(jié)果,就開始了encode腳本和normal腳本的混合使用。
在這樣的理解下做了很多的腳本,似乎也真的沒有出現(xiàn)過(guò)什么問(wèn)題,于是更加篤信自己當(dāng)初的判斷。結(jié)果又一次被IE暗算了,encode后的腳本和normal的腳本混和使用不是沒有問(wèn)題,也不是都有問(wèn)題,只是在特定的條件下會(huì)出問(wèn)題,真是暈死??聪旅孢@個(gè)示例:
<html>
<head>
<title>JScript Encode Research</title>
<meta name="author" content="birdshome@cnblogs" />
</head>
<body>
<script language="jscript.encode" type="text/jscript.encode">
#@~^8gAAAA==~,P~,P,Pr(L^Ycw.WDWOza+Rtn/klo~xP6E mOkGUv#@#@&,~P,P~~, @#@&~,P~P,~,P~,P,lVDDcB}4%+1Y 2MWYKOXa+Rtnd/moBbi@#@&,P~P,~P,8I@#@&PP~~,P~P@#@&,P~,P,PP}4NnmDR\+k/CLP',WE mYbGU`*@#@&P~P~~,P~ @#@&P,P~~,PP~~,P~l^nMYcEr(L+1Yc\+k/CoBbI@#@&P,~P,PP,NIGjkAAA==^#~@
</script>
<script language="jscript.encode" type="text/jscript.encode">
#@~^FgEAAA==~,P~,P,P0!x1OkKx~2mG[`#,`8@#@&@#@&~~P,P,P~2U^KNnRa.WDWOza+R\nk/Co~{PW!x1YkKxvb@#@&P~P,P~~, @#@&~P,PP,~~P,P,.kOndkU+vv2 mG[Rw.GDWOXancHnk/mo+E#p@#@&,P~P,P~~)i@#@&@#@&,PP,~~P,2 mGNn t+d/mL+,'~W!xmOrKxc#@#@&,P~,P,PPP@#@&~P,P~P,P~~,PMrYSk ncBAx1W[+ \/dlTnB*i@#@&,PP~~,P~8p~,V0MAAA==^#~@
</script>
<script language="jscript" type="text/jscript">
function Normal() {}
Normal.prototype.Message = function()
{
WriteLine('Normal.prototype.Message');
};
Normal.Message = function()
{
WriteLine('Normal.Message');
};
</script>
<script language="jscript" type="text/jscript">
var msg = '.prototype.Message" Fail.<br>';
function WriteLine(msg) { document.write(msg + '<br><br>'); }
var o = new Object();
try { o.Message(); }
catch(e) { WriteLine('Call "Object' + msg + e.message); }
try { Object.Message(); }
catch(e) { WriteLine('Call "Object.Message" Fail. <br>' + e.message); }
var e = new Encode();
try { e.Message(); }
catch(e) { WriteLine('Call "Encode' + msg + e.message); }
Encode.Message();
var n = new Normal();
try { n.Message(); }
catch(e) { WriteLine('Call "Normal' + msg + e.message); }
Normal.Message();
</script>
</body>
</html>
把上面的代碼存為一個(gè)*.htm文件,打開后得到結(jié)果為:
Call "Object.prototype.Message" Fail.
Object doesn't support this property or method
Call "Object.Message" Fail.
Object doesn't support this property or method
Encode.prototype.Message
Encode.Message
Normal.prototype.Message
Normal.Message
上面那兩段jscript.encode的代碼很簡(jiǎn)單,就是: Object.prototype.Message = function()
{
alert('Object.prototype.Message');
};
Object.Message = function()
{
alert('Object.Message');
};
function Encode() {}
Encode.prototype.Message = function()
{
WriteLine('Encode.prototype.Message');
};
Encode.Message = function()
{
WriteLine('Encode.Message');
};
如果我們把上面兩段代碼替換那個(gè)html中的兩段jscript.encode的代碼,后面的運(yùn)行將不會(huì)出任何異常,會(huì)得到這樣的輸出: Object.prototype.Message
Object.Message
...
上面這些代碼實(shí)例的試驗(yàn),已經(jīng)詳細(xì)的說(shuō)明了encode腳本代碼的問(wèn)題。就是,不能在非編碼腳本中,引用編碼腳本中導(dǎo)入到JScript內(nèi)置對(duì)象上的原型(prototype)方法和靜態(tài)方法。上面示例中的Object就是JScript的一個(gè)內(nèi)置對(duì)象,我們分別導(dǎo)入了一個(gè)prototpye方法和靜態(tài)方法Message()。而對(duì)于非內(nèi)置對(duì)象Encode,我們?cè)谝丫幋a代碼中導(dǎo)入的prototype和static方法,都可以在非編碼代碼中正常的訪問(wèn)。
那么怎么訪問(wèn)內(nèi)置對(duì)象的導(dǎo)入方法呢?其實(shí)解決起來(lái)也不復(fù)雜,只是比較繁瑣。我們需要使用一些wrapper方法,把他們和被編碼的代碼放在一起,就可以在非編碼代碼中訪問(wèn)了,比如上面的Object的導(dǎo)入,我們可以這樣包裝它:
Object.prototype.Message = function()
{
WriteLine('Object.prototype.Message');
};
Object.Message = function()
{
WriteLine('Object.Message');
};
var obj = new Object();
function ObjectPrototypeMessage()
{
obj.Message();
}
function ObjectMessage()
{
Object.Message();
}
這時(shí),我們就可以通過(guò)ObjectPrototypeMessage和ObjectMessage這樣的wrapper方法訪問(wèn)到已編碼代碼中內(nèi)置對(duì)象的導(dǎo)入方法了。
在這樣的理解下做了很多的腳本,似乎也真的沒有出現(xiàn)過(guò)什么問(wèn)題,于是更加篤信自己當(dāng)初的判斷。結(jié)果又一次被IE暗算了,encode后的腳本和normal的腳本混和使用不是沒有問(wèn)題,也不是都有問(wèn)題,只是在特定的條件下會(huì)出問(wèn)題,真是暈死??聪旅孢@個(gè)示例:
復(fù)制代碼 代碼如下:
<html>
<head>
<title>JScript Encode Research</title>
<meta name="author" content="birdshome@cnblogs" />
</head>
<body>
<script language="jscript.encode" type="text/jscript.encode">
#@~^8gAAAA==~,P~,P,Pr(L^Ycw.WDWOza+Rtn/klo~xP6E mOkGUv#@#@&,~P,P~~, @#@&~,P~P,~,P~,P,lVDDcB}4%+1Y 2MWYKOXa+Rtnd/moBbi@#@&,P~P,~P,8I@#@&PP~~,P~P@#@&,P~,P,PP}4NnmDR\+k/CLP',WE mYbGU`*@#@&P~P~~,P~ @#@&P,P~~,PP~~,P~l^nMYcEr(L+1Yc\+k/CoBbI@#@&P,~P,PP,NIGjkAAA==^#~@
</script>
<script language="jscript.encode" type="text/jscript.encode">
#@~^FgEAAA==~,P~,P,P0!x1OkKx~2mG[`#,`8@#@&@#@&~~P,P,P~2U^KNnRa.WDWOza+R\nk/Co~{PW!x1YkKxvb@#@&P~P,P~~, @#@&~P,PP,~~P,P,.kOndkU+vv2 mG[Rw.GDWOXancHnk/mo+E#p@#@&,P~P,P~~)i@#@&@#@&,PP,~~P,2 mGNn t+d/mL+,'~W!xmOrKxc#@#@&,P~,P,PPP@#@&~P,P~P,P~~,PMrYSk ncBAx1W[+ \/dlTnB*i@#@&,PP~~,P~8p~,V0MAAA==^#~@
</script>
<script language="jscript" type="text/jscript">
function Normal() {}
Normal.prototype.Message = function()
{
WriteLine('Normal.prototype.Message');
};
Normal.Message = function()
{
WriteLine('Normal.Message');
};
</script>
<script language="jscript" type="text/jscript">
var msg = '.prototype.Message" Fail.<br>';
function WriteLine(msg) { document.write(msg + '<br><br>'); }
var o = new Object();
try { o.Message(); }
catch(e) { WriteLine('Call "Object' + msg + e.message); }
try { Object.Message(); }
catch(e) { WriteLine('Call "Object.Message" Fail. <br>' + e.message); }
var e = new Encode();
try { e.Message(); }
catch(e) { WriteLine('Call "Encode' + msg + e.message); }
Encode.Message();
var n = new Normal();
try { n.Message(); }
catch(e) { WriteLine('Call "Normal' + msg + e.message); }
Normal.Message();
</script>
</body>
</html>
把上面的代碼存為一個(gè)*.htm文件,打開后得到結(jié)果為:
Call "Object.prototype.Message" Fail.
Object doesn't support this property or method
Call "Object.Message" Fail.
Object doesn't support this property or method
Encode.prototype.Message
Encode.Message
Normal.prototype.Message
Normal.Message
上面那兩段jscript.encode的代碼很簡(jiǎn)單,就是: Object.prototype.Message = function()
{
alert('Object.prototype.Message');
};
Object.Message = function()
{
alert('Object.Message');
};
function Encode() {}
Encode.prototype.Message = function()
{
WriteLine('Encode.prototype.Message');
};
Encode.Message = function()
{
WriteLine('Encode.Message');
};
如果我們把上面兩段代碼替換那個(gè)html中的兩段jscript.encode的代碼,后面的運(yùn)行將不會(huì)出任何異常,會(huì)得到這樣的輸出: Object.prototype.Message
Object.Message
...
上面這些代碼實(shí)例的試驗(yàn),已經(jīng)詳細(xì)的說(shuō)明了encode腳本代碼的問(wèn)題。就是,不能在非編碼腳本中,引用編碼腳本中導(dǎo)入到JScript內(nèi)置對(duì)象上的原型(prototype)方法和靜態(tài)方法。上面示例中的Object就是JScript的一個(gè)內(nèi)置對(duì)象,我們分別導(dǎo)入了一個(gè)prototpye方法和靜態(tài)方法Message()。而對(duì)于非內(nèi)置對(duì)象Encode,我們?cè)谝丫幋a代碼中導(dǎo)入的prototype和static方法,都可以在非編碼代碼中正常的訪問(wèn)。
那么怎么訪問(wèn)內(nèi)置對(duì)象的導(dǎo)入方法呢?其實(shí)解決起來(lái)也不復(fù)雜,只是比較繁瑣。我們需要使用一些wrapper方法,把他們和被編碼的代碼放在一起,就可以在非編碼代碼中訪問(wèn)了,比如上面的Object的導(dǎo)入,我們可以這樣包裝它:
Object.prototype.Message = function()
{
WriteLine('Object.prototype.Message');
};
Object.Message = function()
{
WriteLine('Object.Message');
};
var obj = new Object();
function ObjectPrototypeMessage()
{
obj.Message();
}
function ObjectMessage()
{
Object.Message();
}
這時(shí),我們就可以通過(guò)ObjectPrototypeMessage和ObjectMessage這樣的wrapper方法訪問(wèn)到已編碼代碼中內(nèi)置對(duì)象的導(dǎo)入方法了。
您可能感興趣的文章:
- js編碼之encodeURIComponent使用介紹(asp,php)
- JavaScript.Encode手動(dòng)解碼技巧
- Javascript下的urlencode編碼解碼方法附decodeURIComponent
- javascript encodeURI和encodeURIComponent的比較
- javascript 字符 Escape,encodeURI,encodeURIComponent
- javascript htmlencode函數(shù)(ff兼容版) 主要是編輯器中反轉(zhuǎn)html代碼
- javascript HTMLEncode HTMLDecode的完整實(shí)例(兼容ie和火狐)
- escape、encodeURI 和 encodeURIComponent 的區(qū)別
- 用JavaScript實(shí)現(xiàn)UrlEncode和UrlDecode的腳本代碼
- js將網(wǎng)址轉(zhuǎn)為urlencode類型
- 關(guān)于JAVASCRIPT urldecode URL解碼的問(wèn)題
- Javascript UrlDecode函數(shù)代碼
- js中encode、decode的應(yīng)用說(shuō)明
相關(guān)文章
如何利用ES6進(jìn)行Promise封裝總結(jié)
這篇文章主要介紹了如何利用ES6進(jìn)行Promise封裝總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02javascript replace()方法的簡(jiǎn)單分析
javascript中replace()在javascript中,String的函數(shù)replace()簡(jiǎn)直太讓人喜愛了。它靈活而強(qiáng)大的字符替換處理能力,讓我不禁想向大家介紹它。2008-11-11基于Bootstrap使用jQuery實(shí)現(xiàn)簡(jiǎn)單可編輯表格
這篇文章主要介紹了基于Bootstrap使用jQuery實(shí)現(xiàn)簡(jiǎn)單可編輯表格的相關(guān)資料,需要的朋友可以參考下2016-05-05javascript 通用loading動(dòng)畫效果實(shí)例代碼
這篇文章主要介紹了javascript 通用loading動(dòng)畫效果實(shí)例代碼,有需要的朋友可以參考一下2014-01-01javascript類型系統(tǒng)_正則表達(dá)式RegExp類型詳解
下面小編就為大家?guī)?lái)一篇javascript類型系統(tǒng)_正則表達(dá)式RegExp類型詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06JavaScript中的常見問(wèn)題解決方法(亂碼,IE緩存,代理)
這篇文章主要是對(duì)JavaScript中的常見問(wèn)題解決方法(亂碼,IE緩存,代理)進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所 幫助2013-11-11