encode脚本和normal脚本混用的问题与解决方法


Posted in Javascript onMarch 08, 2007

半年前第一次做脚本编码的时候,由于没有什么使用经验,于是在51js上询问了一下encode脚本和normal脚本混用是否有什么问题呢?结果没有得到任何有建设性的意见,这也至少说明了两个问题,一是没有人在意,二是就没有什么问题嘛。当然我更乐意于接受后一种结果,就开始了encode脚本和normal脚本的混合使用。

    在这样的理解下做了很多的脚本,似乎也真的没有出现过什么问题,于是更加笃信自己当初的判断。结果又一次被IE暗算了,encode后的脚本和normal的脚本混和使用不是没有问题,也不是都有问题,只是在特定的条件下会出问题,真是晕死。看下面这个示例: 

<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> 

    把上面的代码存为一个*.htm文件,打开后得到结果为: 

  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的代码很简单,就是: 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');
};  
    如果我们把上面两段代码替换那个html中的两段jscript.encode的代码,后面的运行将不会出任何异常,会得到这样的输出:   Object.prototype.Message
  Object.Message
  ...
    上面这些代码实例的试验,已经详细的说明了encode脚本代码的问题。就是,不能在非编码脚本中,引用编码脚本中导入到JScript内置对象上的原型(prototype)方法和静态方法。上面示例中的Object就是JScript的一个内置对象,我们分别导入了一个prototpye方法和静态方法Message()。而对于非内置对象Encode,我们在已编码代码中导入的prototype和static方法,都可以在非编码代码中正常的访问。

    那么怎么访问内置对象的导入方法呢?其实解决起来也不复杂,只是比较繁琐。我们需要使用一些wrapper方法,把他们和被编码的代码放在一起,就可以在非编码代码中访问了,比如上面的Object的导入,我们可以这样包装它: 

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();
}
    这时,我们就可以通过ObjectPrototypeMessage和ObjectMessage这样的wrapper方法访问到已编码代码中内置对象的导入方法了。

Javascript 相关文章推荐
用JavaScript实现一个代码简洁、逻辑不复杂的多级树
May 23 Javascript
javascript控制图片播放的实现代码
Jul 29 Javascript
js中substring和substr两者区别和使用方法
Nov 09 Javascript
js判断某个字符出现的次数的简单实例
Jun 03 Javascript
js中字符型和数值型数字的互相转化方法(必看)
Apr 25 Javascript
一个Vue视频媒体多段裁剪组件的实现示例
Aug 09 Javascript
vue和better-scroll实现列表左右联动效果详解
Apr 29 Javascript
layui字体图标 loading图标静止不旋转的解决方法
Sep 23 Javascript
es6函数之rest参数用法实例分析
Apr 18 Javascript
JavaScript ES6 Class类实现原理详解
May 08 Javascript
vue 动态组件(component :is) 和 dom元素限制(is)用法说明
Sep 04 Javascript
JavaScript语法约定和程序调试原理解析
Nov 03 Javascript
IE7提供XMLHttpRequest对象为兼容
Mar 08 #Javascript
使用onbeforeunload属性后的副作用
Mar 08 #Javascript
HTML中不支持静态Expando的元素的问题
Mar 08 #Javascript
使用TextRange获取输入框中光标的位置的代码
Mar 08 #Javascript
获取JavaScript用户自定义类的类名称的代码
Mar 08 #Javascript
JScript内置对象Array中元素的删除方法
Mar 08 #Javascript
在JavaScript中遭遇级联表达式陷阱
Mar 08 #Javascript
You might like
农民C键的运用技巧
2020/03/04 星际争霸
ajax完美实现两个网页 分页功能的实例代码
2013/04/16 PHP
解析PHP中的file_get_contents获取远程页面乱码的问题
2013/06/25 PHP
PHP中实现生成静态文件的方法缓解服务器压力
2014/01/07 PHP
php把时间戳转换成多少时间之前函数的实例
2016/11/16 PHP
javascript+xml技术实现分页浏览
2008/07/27 Javascript
jQuery.validate 常用方法及需要注意的问题
2013/03/20 Javascript
jQuery实现拖动调整表格单元格大小的代码实例
2015/01/13 Javascript
JS实现从表格中动态删除指定行的方法
2015/03/31 Javascript
初识Javascript小结
2015/07/16 Javascript
JS+CSS实现的蓝色table选项卡效果
2015/10/08 Javascript
JS获取文件大小方法小结
2015/12/08 Javascript
超实用的JavaScript代码段 附使用方法
2016/05/22 Javascript
手机端 HTML5使用photoswipe.js仿微信朋友圈图片放大效果
2016/08/25 Javascript
JS给Array添加是否包含字符串的简单方法
2016/10/29 Javascript
jQuery animate()实现背景色渐变效果的处理方法【使用jQuery.color.js插件】
2017/03/15 Javascript
vue项目总结之文件夹结构配置详解
2017/12/13 Javascript
Nodejs中的require函数的具体使用方法
2019/04/02 NodeJs
Vue父子组件传值的一些坑
2020/09/16 Javascript
[42:52]Optic vs Serenity 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
pandas数据分组和聚合操作方法
2018/04/11 Python
Python 正则表达式 re.match/re.search/re.sub的使用解析
2019/07/22 Python
python 实现将小图片放到另一个较大的白色或黑色背景图片中
2019/12/12 Python
IntelliJ 中配置 Anaconda的过程图解
2020/06/01 Python
Python爬虫开发与项目实战
2020/12/16 Python
Html5页面上如何禁止手机虚拟键盘弹出
2020/03/19 HTML / CSS
伦敦高级内衣品牌:Agent Provocateur(大内密探)
2016/08/23 全球购物
丝芙兰香港官网:Sephora香港
2018/03/13 全球购物
Shopbop中文官网:美国亚马逊旗下时尚购物网站
2020/12/15 全球购物
表演方阵解说词
2014/02/08 职场文书
夜不归宿检讨书
2014/02/25 职场文书
亲属关系公证书
2014/04/08 职场文书
平遥古城导游词
2015/02/03 职场文书
2016年村干部公开承诺书(公开承诺事项)
2016/03/25 职场文书
基于Redis实现分布式锁的方法(lua脚本版)
2021/05/12 Redis
教你怎么用PyCharm为同一服务器配置多个python解释器
2021/05/31 Python