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 相关文章推荐
学习YUI.Ext第七日-View&amp;JSONView Part Two-一个画室网站的案例
Mar 10 Javascript
jQuery chili图片远处放大插件
Nov 30 Javascript
通过判断JavaScript的版本实现执行不同的代码
May 11 Javascript
HTML复选框和单选框 checkbox和radio事件介绍
Dec 12 Javascript
node.js+Ajax实现获取HTTP服务器返回数据
Nov 26 Javascript
JavaScript中的值类型转换介绍
Dec 31 Javascript
JavaScript插件化开发教程 (三)
Jan 27 Javascript
jquery+css3实现会动的小圆圈效果
Jan 27 Javascript
关于Bootstrap弹出框无法调用问题的解决办法
Mar 10 Javascript
解决Js先触发失去焦点事件再执行点击事件的问题
Aug 30 Javascript
jQuery实现条件搜索查询、实时取值及升降序排序的方法分析
May 04 jQuery
JS中使用react-tooltip插件实现鼠标悬浮显示框
May 15 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
Apache 配置详解(最好的APACHE配置教程)
2010/07/04 PHP
一个PHP并发访问实例代码
2012/09/06 PHP
PHP 中关于ord($str)&amp;gt;0x80的详细说明
2012/09/23 PHP
CI框架验证码CAPTCHA辅助函数用法实例
2014/11/05 PHP
详解PHP中的Traits
2015/07/29 PHP
PHP中filter函数校验数据的方法详解
2015/07/31 PHP
php+ajax登录跳转登录实现思路
2016/07/31 PHP
yii2 数据库读写分离配置示例
2017/02/10 PHP
php使用curl下载指定大小的文件实例代码
2017/09/30 PHP
CL vs ForZe BO5 第二场 2.13
2021/03/10 DOTA
基于JQuery的密码强度验证代码
2010/03/01 Javascript
最佳6款用于移动网站开发的jQuery 图片滑块插件小结
2012/07/20 Javascript
jquery批量控制form禁用的代码
2013/08/06 Javascript
js判断字符是否是汉字的两种方法小结
2014/01/03 Javascript
代码获取历史上的今天发生的事
2014/04/11 Javascript
实现js保留小数点后N位的代码
2014/11/13 Javascript
jquery使用slideDown实现模块缓慢拉出效果的方法
2015/03/27 Javascript
浅析JavaScript动画
2015/06/10 Javascript
jQuery检查事件是否触发的方法
2015/06/26 Javascript
详解node.js 下载图片的 2 种方式
2018/03/02 Javascript
React Native基础入门之调试React Native应用的一小步
2018/07/02 Javascript
axios全局注册,设置token,以及全局设置url请求网段的方法
2018/09/25 Javascript
微信小程序页面缩放式侧滑效果的实现代码
2018/11/15 Javascript
在vue中使用console.log无效的解决
2020/08/09 Javascript
[04:26]2014DOTA2西雅图国际邀请赛 总决赛TOPPLAY
2014/07/22 DOTA
Python3实现并发检验代理池地址的方法
2016/09/18 Python
Python读取csv文件分隔符设置方法
2019/01/14 Python
Python集中化管理平台Ansible介绍与YAML简介
2019/06/12 Python
Django在admin后台集成TinyMCE富文本编辑器的例子
2019/08/09 Python
前后端结合实现amazeUI分页效果
2020/08/21 HTML / CSS
Ticketmaster德国票务网站:购买音乐会和体育等门票
2016/11/14 全球购物
Abbott Lyon官网:女士手表、珠宝及配件
2020/12/26 全球购物
正规的求职信范文分享
2013/12/11 职场文书
任命书怎么写
2015/03/02 职场文书
MySQL Router实现MySQL的读写分离的方法
2021/05/27 MySQL
一文搞懂MySQL索引页结构
2022/02/28 MySQL