修改了Prototype框架

本文分享了作者在使用Prototype框架过程中的实践经验,重点介绍了如何定制Ajax.PeriodicalUpdater组件以实现动态停止定时请求的功能,同时探讨了如何调整全局Ajax响应机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    这两天开发批量配置的页面,由于前两天刚刚看了Prototype框架的书,所以想在这个功能中小试牛刀,于是我安排小雷开发后发,我就玩玩页面。
    Prototype是时下功能比较齐全的Ajax框架,虽然不如Dojo框架的Widget多,但是也够我们这次用了,而且这次也是从基础学起,所以就没有用像Dojo这么花哨的框架。
    Prototype框架提供了很多javascript功能扩展和封装,比如说"$"符,css选择器,String的扩展方法,很多数组的扩展方法,实现的HashMap等有用的类。最重要的,做为一个Ajax框架,它提供了ajax调用的封装,包括Ajax.Request,Ajax.Updater,Ajax.PeriodicalUpdater,这3 个类都是非常有用的。Ajax.Request完成最普通的Ajax调用,Ajax.Updater能够指定Ajax响应要更新的界面元素,Ajax.PeriodicalUpdater能够定时发Ajax请求。
    我今天在使用Prototype框架的时候,遇到了两个问题。第一个是我需要用Ajax.PeriodicalUpdater来向后台发请求,并更新界面,但是当后台返回某个数据的时候,要停止发Ajax请求,可是Prototype框架并没有告诉我们怎么在Ajax.PeriodicalUpdater的回调方法中停止继续发Ajax请求。于是开始看Prototype的代码,发现是框架的Ajax.PeriodicalUpdater的updateComplete方法(位置是Prototype.js的854行,Prototype 1.5,后同)处理Ajax响应,那么我在Ajax.PeriodicalUpdater中加入一个属性叫stopTimerFlag,这个属性在初始化Ajax.PeriodicalUpdater对象时给出,修改如下:
initialize: function(container, url, options) {
    this.setOptions(options);
    this.onComplete = this.options.onComplete;
    this.stopTimeFlag = this.options.stopTimerFlag;
    this.frequency = (this.options.frequency || 2);
  ......
 
然后修改updateComplete方法如下:
updateComplete: function(request) {
    if (this.options.decay) {
      this.decay = (request.responseText == this.lastText ?
        this.decay * this.options.decay : 1);
      this.lastText = request.responseText;
   if (this.lastText.indexOf(this.stopTimerFlag) != -1)
      {return;}
    }
    this.timer = setTimeout(this.onTimerEvent.bind(this),
      this.decay * this.frequency * 1000);
  },
这样,当后台决定要停止定时器时,只要将返回给前台的responseText中加入stopTimerFlag就好了。在初始化Ajax.PeriodicalUpdater时按照下面初始化就好了:
var myAjax = new Ajax.PeriodicalUpdater(
    'divResult',
    'script1.html',
    {
     method: 'get',
     evalScripts: true,
  stopTimerFlag: 'TIMER_FLAG',
     frequency: 1,
     decay: 2
    }
   );
 
    另外一个修改的地方就是,我们可以通过Ajax.Responders.register(handler);来定义全局的Ajax响应方法和创建Ajax请求时要做的事情。但是这样定义的响应方法是在具体的Ajax响应方法之后执行的。而我要通过这个方法来做Ajax错误信息的判断和显示功能,并且当后台返回的是错误信息的时候,执行完这个全局的方法后就不执行具体的方法了。研究了下代码,发现只要改一行,就可以做到:
把Ajax.Request类中的respondToReadyState方法中如下两句换下位置(在Prototype.js的765,766行):
(this.options['on' + event] || Prototype.emptyFunction)(transport, json);
Ajax.Responders.dispatch('on' + event, this, transport, json);
也就是改为:
Ajax.Responders.dispatch('on' + event, this, transport, json);
(this.options['on' + event] || Prototype.emptyFunction)(transport, json);
就可以了,简单吧:)
 
Ajax现在已经得到了长足的方展,相信使用这项技术的网站和公司会越来越多,Ajax必然是今后的主角。要是我有money,真想开个公司,专门做基于Ajax的web应用(注意,是应用,不只是网站),现在干这个,是绝好的机会~~~~~~~~~~~~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值