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显示和隐藏div特效实例
Feb 27 Javascript
js 控制页面跳转的5种方法
Sep 09 Javascript
JS中完美兼容各大浏览器的scrolltop方法
Apr 17 Javascript
AngularJS中的API(接口)简单实现
Jul 28 Javascript
AngularJS中下拉框的高级用法示例
Oct 11 Javascript
React Native中TabBarIOS的简单使用方法示例
Oct 13 Javascript
Vue项目组件化工程开发实践方案
Jan 09 Javascript
VUE 3D轮播图封装实现方法
Jul 03 Javascript
如何为你的JS项目添加智能提示与类型检查详解
Mar 12 Javascript
微信小程序事件对象中e.target和e.currentTarget的区别详解
May 08 Javascript
浅谈微信小程序列表埋点曝光指南
Oct 15 Javascript
vue中v-for循环选中点击的元素并对该元素添加样式操作
Jul 17 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 session有效期问题
2009/04/26 PHP
PHP之密码加密的几种方式
2015/07/29 PHP
浅谈使用PHP开发微信支付的流程
2015/10/04 PHP
PHP实现的用户注册表单验证功能简单示例
2019/02/25 PHP
PHP观察者模式定义与用法实例分析
2019/03/22 PHP
PHP实现随机发放扑克牌
2020/04/21 PHP
jquery select操作的日期联动实现代码
2009/12/06 Javascript
Jquery中Ajax 缓存带来的影响的解决方法
2011/05/19 Javascript
script标签属性type与language使用选择
2012/12/02 Javascript
jQuery的cookie插件实现保存用户登陆信息
2014/04/15 Javascript
流量统计器如何鉴别C#:WebBrowser中伪造referer
2015/01/07 Javascript
JQuery限制复选框checkbox可选中个数的方法
2015/04/20 Javascript
NodeJs使用Mysql模块实现事务处理实例
2017/05/31 NodeJs
利用JS测试目标网站的打开响应速度
2017/12/01 Javascript
对vux点击事件的优化详解
2018/08/28 Javascript
vue路由事件beforeRouteLeave及组件内定时器的清除方法
2018/09/29 Javascript
Node.js console控制台简单用法分析
2019/01/04 Javascript
Node.js使用supervisor进行开发中调试的方法
2019/03/26 Javascript
jquery ui 实现 tab标签功能示例【测试可用】
2019/07/25 jQuery
Node.js API详解之 timer模块用法实例分析
2020/05/07 Javascript
vue Treeselect下拉树只能选择第N级元素实现代码
2020/08/31 Javascript
[01:02:47]EG vs Secret 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
python条件变量之生产者与消费者操作实例分析
2017/03/22 Python
Python自定义线程类简单示例
2018/03/23 Python
new_zeros() pytorch版本的转换方式
2020/02/18 Python
python 伯努利分布详解
2020/02/25 Python
windows下Pycharm安装opencv的多种方法
2020/03/05 Python
django之导入并执行自定义的函数模块图解
2020/04/01 Python
关于HTML5的22个初级技巧(图文教程)
2012/06/21 HTML / CSS
HTML利用九宫格原理进行网页布局
2020/03/13 HTML / CSS
印度网上购物首选目的地:Flipkart
2016/08/01 全球购物
法警的竞聘演讲稿
2014/01/02 职场文书
篝火晚会策划方案
2014/05/16 职场文书
基于HTML十秒做出淘宝页面
2021/10/24 HTML / CSS
MySQL和Oracle批量插入SQL的通用写法示例
2021/11/17 MySQL
Python之matplotlib绘制折线图
2022/04/13 Python