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 相关文章推荐
jQuery.Validate验证库的使用介绍
Apr 26 Javascript
YUI模块开发原理详解
Nov 18 Javascript
Jquery修改页面标题title其它JS失效的解决方法
Oct 31 Javascript
JavaScript编程中window的location与history对象详解
Oct 26 Javascript
AngularJS的脏检查深入分析
Apr 22 Javascript
详解HTML5 使用video标签实现选择摄像头功能
Oct 25 Javascript
基于JSONP原理解析(推荐)
Dec 04 Javascript
通过jquery获取上传文件名称、类型和大小的实现代码
Apr 19 jQuery
atom-design(Vue.js移动端组件库)手势组件使用教程
May 16 Javascript
Vue组件化开发之通用型弹出框的实现
Feb 28 Javascript
Node.js API详解之 timer模块用法实例分析
May 07 Javascript
js前端图片加载异常兜底方案
Jun 21 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
php判断当前操作系统类型
2015/10/28 PHP
PHP+JQUERY操作JSON实例
2017/03/23 PHP
laravel返回统一格式错误码问题
2019/11/04 PHP
php在linux环境中如何使用redis详解
2020/12/15 PHP
js indexOf()定义和用法
2012/10/21 Javascript
jquery乱码与contentType属性设置问题解决方案
2013/01/07 Javascript
node.js中watch机制详解
2014/11/17 Javascript
JS实现的4种数字千位符格式化方法分享
2015/03/02 Javascript
详解微信小程序开发之下拉刷新 上拉加载
2016/11/24 Javascript
Chrome浏览器的alert弹窗禁止再次弹出后恢复的方法
2016/12/30 Javascript
js实现数组去重方法及效率?Ρ? target=
2017/02/14 Javascript
Vue.js实战之通过监听滚动事件实现动态锚点
2017/04/04 Javascript
Vue项目数据动态过滤实践及实现思路
2018/09/11 Javascript
小程序实现上传视频功能
2020/08/18 Javascript
Vue中nprogress页面加载进度条的方法实现
2020/11/13 Javascript
[10:18]2018DOTA2国际邀请赛寻真——Fnatic能否笑到最后?
2018/08/14 DOTA
python中随机函数random用法实例
2015/04/30 Python
用Python编写简单的定时器的方法
2015/05/02 Python
深入理解Python中命名空间的查找规则LEGB
2015/08/06 Python
python抓取网站的图片并下载到本地的方法
2018/05/22 Python
在Pycharm中自动添加时间日期作者等信息的方法
2019/01/16 Python
python计算阶乘和的方法(1!+2!+3!+...+n!)
2019/02/01 Python
如何基于python操作excel并获取内容
2019/12/24 Python
Html5 Canvas动画基础碰撞检测的实现
2018/12/06 HTML / CSS
英国家电直销:Appliances Direct
2016/09/22 全球购物
以下为Windows NT 下的32 位C++程序,请计算sizeof 的值
2016/12/07 面试题
数据库基础的一些面试题
2012/02/25 面试题
企业员工培训感言
2014/02/26 职场文书
公职人员索取回扣检举信
2014/04/04 职场文书
大学生求职信例文
2014/06/29 职场文书
财会专业大学生求职信
2014/09/26 职场文书
官僚主义现象查摆问题整改措施
2014/10/04 职场文书
使用 Apache 反向代理的设置技巧
2022/01/18 Servers
解决IDEA翻译插件Translation报错更新TTK失败不能使用
2022/04/24 Python
Java实现带图形界面的聊天程序
2022/06/10 Java/Android
win10此电脑打不开怎么办 win10双击此电脑无响应的解决办法
2022/07/23 数码科技