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判断iphone/android手机横竖屏模式的函数
Dec 20 Javascript
关于js注册事件的常用方法
Apr 03 Javascript
浅析用prototype定义自己的方法
Nov 14 Javascript
jQuery中index()的用法分析
Sep 05 Javascript
javascript实现获取指定精度的上传文件的大小简单实例
Oct 25 Javascript
JS实现图片预加载之无序预加载功能代码
May 12 Javascript
详解如何使用vue-cli脚手架搭建Vue.js项目
May 19 Javascript
详解webpack 入门总结和实践(按需异步加载,css单独打包,生成多个入口文件)
Jun 20 Javascript
详解React-Native全球化多语言切换工具库react-native-i18n
Nov 03 Javascript
JavaScript使用百度ECharts插件绘制饼图操作示例
Nov 26 Javascript
微信小程序实现翻牌抽奖动画
Sep 21 Javascript
vue实现书本翻页动画效果实例详解
Apr 08 Vue.js
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
discuz安全提问算法
2007/06/06 PHP
PHP在网页中动态生成PDF文件详细教程
2014/07/05 PHP
简单谈谈php浮点数精确运算
2016/03/10 PHP
php getcwd与dirname(__FILE__)区别详解
2016/09/24 PHP
laravel使用数据库测试注意事项
2020/04/10 PHP
使用CSS3实现字体颜色渐变的实现
2021/03/09 HTML / CSS
用jscript实现新建word文档
2007/06/15 Javascript
JavaScript 实现模态对话框 源代码大全
2009/05/02 Javascript
加载远程图片时,经常因为缓存而得不到更新的解决方法(分享)
2013/06/26 Javascript
jquery拖拽排序简单实现方法(效果增强版)
2016/02/16 Javascript
javascript实现的上下无缝滚动效果
2016/09/19 Javascript
浅谈js中的变量名和函数名重名
2017/02/13 Javascript
jquery实现数字输入框
2017/02/22 Javascript
vue中引用swiper轮播插件的教程详解
2018/08/16 Javascript
Python实现的批量下载RFC文档
2015/03/10 Python
Django框架中render_to_response()函数的使用方法
2015/07/16 Python
Python使用smtplib模块发送电子邮件的流程详解
2016/06/27 Python
python实现汉诺塔算法
2021/03/01 Python
python使用循环打印所有三位数水仙花数的实例
2018/11/13 Python
使用Python制作新型冠状病毒实时疫情图
2020/01/28 Python
python 实现任务管理清单案例
2020/04/25 Python
Python中Selenium库使用教程详解
2020/07/23 Python
基于python实现MQTT发布订阅过程原理解析
2020/07/27 Python
英国在线发型和美容产品商店:Beauty Cutie
2019/04/27 全球购物
澳大利亚和新西兰最大的在线旅行社之一:Aunt Betty
2019/08/07 全球购物
Habitat家居英国官方网站:沙发、家具、照明、厨房和户外
2019/12/12 全球购物
Java面试题及答案
2012/09/08 面试题
护理专业推荐信
2013/11/07 职场文书
工业设计专业个人求职信范文
2013/12/28 职场文书
远程教育心得体会
2014/01/03 职场文书
优秀学生干部推荐材料
2014/02/03 职场文书
竞聘上岗演讲稿
2014/05/16 职场文书
四风专项整治工作情况汇报
2014/10/28 职场文书
2016年学校“6﹒26国际禁毒日”宣传活动总结
2016/04/05 职场文书
导游词之台湾阿里山
2019/10/23 职场文书
JavaScript流程控制(分支)
2021/12/06 Javascript