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 相关文章推荐
多广告投放代码 推荐
Nov 13 Javascript
用JSON做数据传输格式中的一些问题总结
Dec 21 Javascript
window.open不被拦截的实现代码
Aug 22 Javascript
js焦点文字滚动效果代码分享
Aug 25 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(二)
Jan 21 Javascript
H5图片压缩与上传实例
Apr 21 Javascript
Javascript中Promise的四种常用方法总结
Jul 14 Javascript
input file样式修改以及图片预览删除功能详细概括(推荐)
Aug 17 Javascript
利用js编写网页进度条效果
Oct 08 Javascript
基于Vue的移动端图片裁剪组件功能
Nov 28 Javascript
解决vue中修改export default中脚本报一大堆错的问题
Aug 27 Javascript
vue.js的双向数据绑定Object.defineProperty方法的神奇之处
Jan 18 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
linux下删除7天前日志的代码(php+shell)
2011/01/02 PHP
一个PHP验证码类代码分享(已封装成类)
2011/07/17 PHP
YII实现分页的方法
2014/07/09 PHP
微信公众号点击菜单即可打开并登录微站的实现方法
2014/11/14 PHP
PHP单例模式简单用法示例
2017/06/23 PHP
20款超赞的jQuery插件 Web开发人员必备
2011/02/26 Javascript
如何确保JavaScript的执行顺序 之实战篇
2011/03/03 Javascript
js如何获取兄弟、父类等节点
2014/01/06 Javascript
struts2+jquery组合验证注册用户是否存在
2014/04/30 Javascript
node.js中的fs.appendFile方法使用说明
2014/12/17 Javascript
jQuery插件zTree实现删除树节点的方法示例
2017/03/08 Javascript
使用vue构建移动应用实战代码
2017/08/02 Javascript
在 Angular 中使用Chart.js 和 ng2-charts的示例代码
2017/08/17 Javascript
微信小程序使用map组件实现路线规划功能示例
2019/01/22 Javascript
Vue注册组件命名时不能用大写的原因浅析
2019/04/25 Javascript
vue学习笔记之slot插槽基本用法实例分析
2020/02/01 Javascript
Python3.5基础之NumPy模块的使用图文与实例详解
2019/04/24 Python
Flask框架工厂函数用法实例分析
2019/05/25 Python
Python字符编码转码之GBK,UTF8互转
2020/02/09 Python
基于python实现地址和经纬度转换
2020/05/19 Python
美国生鲜及杂货电商:FreshDirect
2018/01/29 全球购物
美国在线咖啡、茶和餐厅供应商:LollicupStore
2018/05/04 全球购物
Exoticca英国:以最优惠的价格提供豪华异国情调旅行
2018/10/18 全球购物
Right-on官方网站:日本知名的休闲服装品牌
2019/07/12 全球购物
Linux的文件类型
2012/03/07 面试题
详细的大学生创业计划书模板
2014/01/27 职场文书
自我评价的范文
2014/02/02 职场文书
班主任师德师风自我剖析材料
2014/10/02 职场文书
保洁员岗位职责
2015/02/04 职场文书
事业单位年度考核个人总结
2015/02/12 职场文书
写给老师的保证书
2015/05/09 职场文书
新员工辞职信范文
2015/05/12 职场文书
2015年大学迎新工作总结
2015/07/16 职场文书
Redis中一个String类型引发的惨案
2021/07/25 Redis
《游戏王:大师决斗》将推出新卡牌包4月4日上线
2022/03/31 其他游戏
vue中使用mockjs配置和使用方式
2022/04/06 Vue.js