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 常用操作方法
Jan 28 Javascript
js 实现复制到粘贴板的功能代码
May 13 Javascript
js判断背景图片是否加载成功使用img的width实现
May 29 Javascript
javascript实现选中复选框后相关输入框变灰不可用的方法
Aug 11 Javascript
JS非Alert实现网页右下角“未读信息”效果弹窗
Sep 26 Javascript
关于JavaScript 原型链的一点个人理解
Jul 31 Javascript
JavaScript中如何使用cookie实现记住密码功能及cookie相关函数介绍
Nov 10 Javascript
Vue组件通信之Bus的具体使用
Dec 28 Javascript
vue踩坑记-在项目中安装依赖模块npm install报错
Apr 02 Javascript
解决vue.js提交数组时出现数组下标的问题
Nov 05 Javascript
vue-cli设置css不生效的解决方法
Feb 07 Javascript
JavaScript中如何调用Java方法
Sep 16 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页面间参数传递的四种方法详解
2013/06/09 PHP
PHP查找一列有序数组是否包含某值的方法
2020/02/07 PHP
PHP dirname简单使用代码实例
2020/11/13 PHP
Jquery优化效率 提升性能解决方案
2010/09/06 Javascript
JQuery1.6 使用方法三
2011/11/23 Javascript
JS防止用户多次提交的简单代码
2013/08/01 Javascript
jquery cookie的用法总结
2013/11/18 Javascript
JS实现支持Ajax验证的表单插件
2016/03/24 Javascript
AngularJS动态生成div的ID源码解析
2016/08/29 Javascript
jQuery Validate验证表单时多个name相同的元素只验证第一个的解决方法
2016/12/24 Javascript
基于pako.js实现gzip的压缩和解压功能示例
2017/06/13 Javascript
使用JS中的Replace()方法遇到的问题小结
2017/10/20 Javascript
详解angular路由高亮之RouterLinkActive
2018/04/28 Javascript
关于TypeScript模块导入的那些事
2018/06/12 Javascript
JavaScript中 ES6变量的结构赋值
2018/07/10 Javascript
jQuery ajax仿Google自动提示SearchSuggess功能示例
2019/03/28 jQuery
webpack HappyPack实战详解
2019/10/08 Javascript
Vue中常用rules校验规则(实例代码)
2019/11/14 Javascript
微信小程序后端实现授权登录
2020/02/24 Javascript
基于javascript实现放大镜特效
2020/12/03 Javascript
Python实现partial改变方法默认参数
2014/08/18 Python
从局部变量和全局变量开始全面解析Python中变量的作用域
2016/06/16 Python
tensorflow之并行读入数据详解
2020/02/05 Python
python如何实现单链表的反转
2020/02/10 Python
python实现图像拼接功能
2020/03/23 Python
matplotlib bar()实现多组数据并列柱状图通用简便创建方法
2021/02/24 Python
The Beach People美国:澳洲海滨奢华品牌
2018/07/05 全球购物
2014信息技术专业毕业生自我评价
2014/01/17 职场文书
广告词串烧
2014/03/19 职场文书
中学生秋季运动会广播稿
2014/09/21 职场文书
2015年房产经纪人工作总结
2015/05/15 职场文书
2015年政务公开工作总结
2015/05/19 职场文书
志愿服务心得体会
2016/01/15 职场文书
CSS 实现Chrome标签栏的技巧
2021/08/04 HTML / CSS
使用CSS实现一个搜索引擎的原理解析
2021/09/25 HTML / CSS
关于MySQL中explain工具的使用
2023/05/08 MySQL