`
wang_guo_qiang
  • 浏览: 113379 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

读GI源码、学JS编程——JavaScript中的事件实现(完整版)- 引用

阅读更多

读GI源码、学JS编程——JavaScript中的事件实现(完整版)。

引自:city22 blog
下面是全文:
         JavaScript虽着Ajax应用越来越多,也变得越来越重要,越来越多的“网络版”软件以其眼花缭乱的异步加载刷新让人感触到Ajax的威力,越来越多的程序员们也开始关注于JavaScript的学习,以至于慢慢的发现JavaScript完全由能力担任所有UI层编码的重任。
         SOA这盘菜被个大厂商炒了又炒,WebService渐渐成为标准的传输方式,Soap被越来越多的人认识。这个时候人们发现JavaScript能够调用WebService,于是有人开始试水了。不得不说用Javascipt完全可以作为为UI层的骨架,UI层的逻辑开发对于Javascipt简直就是得心应手,显示更不用说,传输用WebService,哈哈,不再需要那么多WebForm控件,让C#去更多的关注如何实现业务去吧。
         但对于JavaScript很多人不是很了解,尤其是对于大型RIA程序来说,一堆堆的脚本对于习惯了C#的程序员简直就是恶梦。就像每个人当初学C#一样,Petshop是一门不可多得的教材,当TIBCO宣布GI开源的时候,人们发现这才是JavaScript中最好最重量级的教材。我想一起与大家学习GI中值得学习的部分,学习Javascipt怎么在大型RIA中发挥作用。

 再简单介绍一下GI_BuilderGI_BuilderTIBCO公司开发的一套基于Javascipt开发的用开发开JavaScriptIDE,当然也包括一套Framework,类似于VS2005,只需要你拖拖拽拽就能实现页面上的,实现很多大家梦寐以求的Javascipt端的控件,TabTreeGrid,甚至于更佳神奇的在Firefox下用SVG比表示,在IE下用VML表示的Chart。相信这些东西如何实现肯定谁都非常感兴趣。

 好吧我们先从写基础的开始,看看大程序为了实现整个功能的运行都做了些什么。大多数人都知道,Ajax程序是以事件驱动为基础的,而实现一个事件的注册和广播也是很多框架中必要的设计,GI中是如何实现事件的机制的呢。

         我们先来看这样一段伪事件的实现:

ClassA=function()
{
    
//声明事件
    this.onAdd=function(){return false;}
    
this.Add=function(a,b)
    {
        
var c=a+b;
        
//执行事件
        if(typeof(this.onAdd)=="function")this.onAdd();
        
return c;
    }
}
ClassB
=function()
{
    
this.AlertAdd=function()
    {
        
this//这里让大家看点东西,嘿嘿
        alert("Add");
    }
    
this.Test=function()
    {
        
var a=new ClassA();
        
//绑定事件
        a.onAdd=this.AlertAdd;
        a.Add(
1,1);
    }
}
   由于Javascipt太灵活了,所以我有了可乘之机,用了一个方法,然后动态的替换它,这样就执行的时候就可以动态的执行我的那个方法咯。哈哈,好像挺完美的吧,这么简单个东西这样就搞定了,可惜这里有点问题要解决,那就是this;这个东西,呵呵。由于AlertAdd这个方法里面的内容都指向了onAdd方法了,确切地说他是在ClassAscope里面运行的,这里的this就变成了ClassA了,DOM中的事件也和这种情况差不多,具体和this的作用范围有关,乱了吧,想必很多人都遇到过这样的问题,哈。


于是乎
Asp.net Ajax中出现了这样的一个东西:
function Function.createDelegate(instance,method)
{
    
return function(){return method.apply(instance,arguments);};
}

这个东东的确好用,我经常用他也。一个apply成为了我们救星,可是又一个问题出现了我们在.net中可以一个劲儿的+=然后再+=,最后全都执行了,怎么一下子搞那么多事件。如何才能让Javascript中也实现这样的复杂机制呢?要想知道GI中如何实现,且听下回分解。

太困了,明天接着写吧,还要上班、上班呢啊


---------------------------------------------------------------------12小时后----------------------------------------------------------------------------


 

书接上回,咱们接着说事件的实现,一醉解千愁同志正解,就原理来说的确是一个Array就能来搞定,当然GI中为了实现不同的事件时用一个Object来实现的。但具体怎么实现的呢,还是来看GI的同志们怎么实现的吧。

JSX30.js中有这样的一些代码:
然后当然就是事件的注册了,事件的注册需要什么?需要知道注册到什么事件上就是onXXX,还需要知道绑定到哪个方法上,于是乎evtPub._subscribe = function(strSubject, objTarget, strMethod) 方法出现了

    /* @jsxobf-clobber */    
    evtPub._subscribe 
= function(strSubject, objTarget, strMethod) {
      
if (this._evtpubreg == null)
        
/* @jsxobf-clobber */    
        
this._evtpubreg = {};
      
var list = this._evtpubreg[strSubject];
      
if (list == null)
        list 
= this._evtpubreg[strSubject] = [];
      list.push([objTarget, strMethod]);
};

看这些参数,首先strSubject就是我们所说的onXXX,关于后面的两个参数是什么,我们来看看事件是如何执行的再说。

来广播了:
    /* @jsxobf-clobber */    
    evtPub._publish 
= function(objEvent) {
      
if (this._evtpubreg != null) {
        
var list = this._evtpubreg[objEvent.subject];
        
if (list) {
          
if (objEvent.target == null
            objEvent.target 
= this;
          list 
= list.concat(); // defensive copy
          for (var i = 0; i < list.length; i++) {
            
if (typeof(list[i][0]) == "function")
              list[i][
0](objEvent);
            
else
              list[i][
0][list[i][1]](objEvent);
          }
        }
      }
};

先声明一下,objEventGI中自己实现的一个Event类,里面有个属性subject就是那个onXXX。好了,看这个方法中,在执行事件之前做了个判断也就是说objTarget会有两种形式Objectfunction所以说他注册的话也会有两种方法咯:

objApp._queue._subscribe("qstart", objApp._progress, "onQueueStart");

objApp._queue._subscribe("qdone", function() {});

当然第一种方式是主要的使用方式,objTarget是调用方法所属的引用,strMethod是要调用的方法

另外,还需要看以下这个list = list.concat();我一直都不太明白,我猜想这个是为了线程安全的,在publish的时候如果再注销这个事件就会发生问题。还请高人指点……

最后当然是事件的注销了:
    /* @jsxobf-clobber */    
    evtPub._unsubscribe 
= function(objTarget) {
      
if (this._evtpubreg != null) {
        
for (var subject in this._evtpubreg) {
          
var list = this._evtpubreg[subject];
          
for (var i = 0; i < list.length; i++) {
            
if (list[i] == objTarget)
              list.splice(i
--1);
          }
        }
      }
};
    
/* @jsxobf-clobber */    
    evtPub._evtcleanup 
= function(objEvent) {
      
delete this._evtpubreg;
    };
    
/* @jsxobf-clobber */    
    evtPub._import 
= function(objTarget) {
      objTarget._subscribe 
= this._subscribe;
      objTarget._unsubscribe 
= this._unsubscribe;
      objTarget._publish 
= this._publish;
      objTarget._evtcleanup 
= this._evtcleanup;
    };

注销,值得一提的就是import方法,这是什么?继承-_-b….

也就是说在你的类里面需要执行以下import的方法,然后你的类里面就这些方法就都用了,不就是个call()的功能-_-b…

分享到:
评论

相关推荐

    Gi盘——基于hadoop的分布式网盘项目

    "Gi盘——基于hadoop的分布式网盘项目"是一个开源的、基于Hadoop技术实现的分布式文件存储系统,旨在提供类似网盘的功能。Hadoop是一个广泛使用的开源框架,主要用于处理和存储大规模数据集,它利用分布式计算来提高...

    javascript正则表达式参数 g与 i及 gi的使用指南.docx

    本文档旨在详细介绍JavaScript正则表达式中的两个重要参数——`g`(全局匹配)和`i`(忽略大小写),以及它们的组合`gi`。通过学习这些参数,开发者能够更加高效地使用正则表达式解决实际问题。 #### 二、基础概念 ...

    Maven插件开发(三)——Java中Processor使用与maven-compiler-plugin的结合使用

    如果要编译Java代码是不行的,而maven-compiler-plugin这个是Apache官方提供的Maven编译Java源码的功能插件,我们在项目中经常使用到,也就是我们平时使用的mvn compile指令就是通过该插件实现的。maven-compiler-...

    javascript经典特效---搜索引擎的集合.rar

    在“javascript经典特效---搜索引擎的集合.rar”这个压缩包中,我们聚焦的是JavaScript在实现搜索引擎特效上的应用。这可能包含各种交互式搜索框、自动补全、搜索结果高亮等常见功能。 首先,让我们深入理解...

    Javascript 中实现正则表达式

    ### JavaScript 中实现正则表达式的知识点详解 #### 正则表达式基础概念 在JavaScript中,正则表达式是一种强大的工具,用于处理字符串中的搜索、替换等操作。它支持多种语法结构来匹配文本中的特定模式。 #### ...

    新版Android开发教程.rar

    ----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...

    .net版本实现远程控制关闭与重启计算机实例源码-r5Gi.rar

    在.NET框架中,C#语言提供了丰富的功能,可以用来实现远程控制操作,如关闭或重启计算机。本实例源码着重展示了如何使用C#编写代码来完成这些任务。下面将详细探讨涉及的技术点。 首先,要实现远程控制,我们需要...

    gi945解除限制(pj)bios

    【标题】:“gi945解除限制(pj)bios”涉及的是针对华为GI945主板的BIOS修改技术,其主要目的是为了突破BIOS原有的功能限制,以便于用户能够安装自选的操作系统,尤其是那些可能因为硬件兼容性问题而无法正常安装的...

    jj.rar_JJ_JavaScript 导航_bgdivider.gi_导航样式_精确 延时

    在JavaScript编程领域中,导航条(Navigation Bar)是网页设计中的关键组成部分,它为用户提供了一种方便的途径来浏览网站的不同部分。"jj.rar_JJ_JavaScript 导航_bgdivider.gi_导航样式_精确 延时"这个标题暗示了...

    JavaScript-Core

    正则表达式在JavaScript中用于执行复杂的字符串搜索和替换,例如,使用`/pattern/gi`来全局搜索不区分大小写的模式。 #### 函数 函数是JavaScript的核心特性之一,可以视为一等公民。函数不仅可以被定义和调用,还...

    Advances in Real-Time Voxel-Based GI - GDC 2018.pdf

    《Advances in Real-Time Voxel-Based GI - GDC 2018》是2018年游戏开发者大会(GDC)上关于实时体素全局光照(Voxel-Based Global Illumination,简称Voxel GI)技术的一篇论文。这篇文章深入探讨了在实时图形渲染...

    javascript正则表达式g与i及gi的意义

    g: 全局匹配 i: 忽略大小写 gi: 全局匹配 + 忽略大小写

    FPGA可编程逻辑器件芯片XC3S100E-5FG484GI中文规格书.pdf

    FPGA可编程逻辑器件芯片XC3S100E-5FG484GI中文规格书.pdf

    FPGA可编程逻辑器件芯片XC3S100E-5FG400GI中文规格书.pdf

    FPGA可编程逻辑器件芯片XC3S100E-5FG400GI中文规格书.pdf

    FPGA可编程逻辑器件芯片XC3S100E-5FG320GI中文规格书.pdf

    FPGA可编程逻辑器件芯片XC3S100E-5FG320GI中文规格书.pdf

    FPGA可编程逻辑器件芯片XC3S100E-4FG484GI中文规格书.pdf

    FPGA可编程逻辑器件芯片XC3S100E-4FG484GI中文规格书.pdf

    FPGA可编程逻辑器件芯片XC3S100E-5FG484GI中文规格书.docx

    《FPGA可编程逻辑器件芯片XC3S100E-5FG484GI中文规格书》 本文将深入探讨FPGA(Field-Programmable Gate Array)可编程逻辑器件,具体为XC3S100E-5FG484GI型号,主要关注其在封装、电路板设计以及电源管理方面的...

    tibco-gi-3.5.1-pro-debug

    3. **事件驱动**:作为事件驱动的框架,GI允许通过监听和响应特定事件来驱动应用程序的行为,增加了应用的反应性和灵活性。 4. **AJAX技术**:GI利用AJAX(Asynchronous JavaScript and XML)技术,提供部分页面...

    js.rar_javascript

    这个“js.rar_javascript”压缩包文件中的“正则表达式验证.docx”文档很可能包含了一系列常用的正则表达式模式,用于在JavaScript中执行各种验证任务。 正则表达式是一种特殊的字符序列,可以用来匹配或查找其他...

    JAVASCRIPT的正规式

    JavaScript中的正规式,也称为正则表达式,是编程语言中的一个重要组成部分,尤其在处理文本字符串时发挥着关键作用。正则表达式是一种强大的模式匹配工具,能够有效地搜索、替换和提取文本。在JavaScript中,它们被...

Global site tag (gtag.js) - Google Analytics