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 相关文章推荐
javascript 学习之旅 (3)
Feb 05 Javascript
jQuery队列控制方法详解queue()/dequeue()/clearQueue()
Dec 02 Javascript
Jquery动态进行图片缩略的原理及实现
Aug 13 Javascript
jquery选择器大全 全面详解jquery选择器
Mar 06 Javascript
JavaScript模版引擎的基本实现方法浅析
Feb 15 Javascript
RequireJS使用注意细节
May 15 Javascript
EasyUI中在表单提交之前进行验证
Jul 19 Javascript
浅谈js函数的多种定义方法与区别
Nov 29 Javascript
Vue 进阶教程之v-model详解
May 06 Javascript
使用Node.js实现RESTful API的示例
Aug 01 Javascript
详解微信小程序中的页面代码中的模板的封装
Oct 12 Javascript
详解基于vue-cli3快速发布一个fullpage组件
Mar 08 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
图解上海144收音机
2021/03/02 无线电
如何冲泡挂耳包咖啡?技巧是什么
2021/03/04 冲泡冲煮
adodb与adodb_lite之比较
2006/12/31 PHP
最新的php 文件上传模型,支持多文件上传
2009/08/13 PHP
PHP 裁剪图片成固定大小代码方法
2009/09/09 PHP
php结合表单实现一些简单功能的例子
2011/06/04 PHP
php静态文件返回304技巧分享
2015/01/06 PHP
PHP中4种常用的抓取网络数据方法
2015/06/04 PHP
PHP implode()函数用法讲解
2019/03/08 PHP
JQuery入门——用one()方法绑定事件处理函数(仅触发一次)
2013/02/05 Javascript
onkeypress字符按键兼容所有浏览器使用介绍
2013/04/24 Javascript
nodejs 提示‘xxx’ 不是内部或外部命令解决方法
2014/11/20 NodeJs
js Object2String方便查看js对象内容
2014/11/24 Javascript
JavaScript判断FileUpload控件上传文件类型
2015/09/28 Javascript
javascript+HTML5自定义元素播放焦点图动画
2016/02/21 Javascript
【经典源码收藏】基于jQuery的项目常见函数封装集合
2016/06/07 Javascript
Bootstrap fileinput文件上传预览插件使用详解
2017/05/16 Javascript
详解vue嵌套路由-query传递参数
2017/05/23 Javascript
限时抢购-倒计时的完整实例(分享)
2017/09/17 Javascript
把vue-router和express项目部署到服务器的方法
2018/02/21 Javascript
node基于puppeteer模拟登录抓取页面的实现
2018/05/09 Javascript
稍微学一下Vue的数据响应式(Vue2及Vue3区别)
2019/11/21 Javascript
ant-design-vue按需加载的坑的解决
2020/05/14 Javascript
Python函数式编程指南(一):函数式编程概述
2015/06/24 Python
itchat-python搭建微信机器人(附示例)
2019/06/11 Python
python通过robert、sobel、Laplace算子实现图像边缘提取详解
2019/08/21 Python
PyQt+socket实现远程操作服务器的方法示例
2019/08/22 Python
使用Python函数进行模块化的实现
2019/11/15 Python
屈臣氏俄罗斯在线商店:Watsons俄罗斯
2020/08/03 全球购物
加拿大拼图大师:Puzzle Master
2020/12/28 全球购物
华为C++笔试题
2014/08/05 面试题
奉献爱心演讲稿
2014/09/04 职场文书
2014年为民办实事工作总结
2014/12/20 职场文书
教师考核鉴定意见
2015/06/05 职场文书
高中生物教学反思
2016/02/20 职场文书
Mysql查询时间区间日期列表,不会由于数据表数据影响
2022/04/19 MySQL