- 浏览: 152875 次
- 性别:
- 来自: 北京
最新评论
-
科小新:
99999999999999999
[Ext扩展]两个来自Ext官方论坛的时间控件扩展,可选择时分秒 -
ldl_xz:
http://www.9958.pw/post/css_pos ...
兼容ie6、ie7、ff的css顶端固定位置定位 -
snnosnno:
有浏览器差异吖
[Ext扩展]两个来自Ext官方论坛的时间控件扩展,可选择时分秒 -
lian819:
感谢无私分享了, 必须赞一个啊
[Ext扩展]两个来自Ext官方论坛的时间控件扩展,可选择时分秒 -
Sweetme:
放进项目就行了,成功了。谢谢哦怒赞
[Ext扩展]两个来自Ext官方论坛的时间控件扩展,可选择时分秒
Ext提供了一套强大的事件处理机制,每个组件都有许多事件,用户可以很方便通过动态的方式为对象添加/删除事件监听函数(在实例化的时候不是必须的),从而动态的改变或添加对象的行为,而这一切又是如何实现的呢?
阅读前请您准备好Javascript基础知识(包括:prototype属性、Functin对象的apply和call方法、函数的作用域等)。
该脚本剥离了许多分支逻辑,修改了大多数函数的实现仅保留最基本逻辑,如需详细了解Ext内部请阅读Ext源代码。Enjoy it!
该脚本脱离了Ext库的依赖,可直接复制在firbug下运行,(推荐chrome的javascript控制台,功能更强大)
预期运行结果:
请教大家,以上代码,a就是一个数组,为什么还要通过继承的方式调用Array的slice方法呢?这不是多此一举吗?看得我头都晕了。 请问是不是有特殊作用呢?
错了 a不是数组 arguments是函数执行时的参数对象,它只是具有array的某些方法属性罢了。还有一点,这种方式方式不能叫做继承,call方法的目的是装换作用域并传参,这里是把Array.prototype.slice这个函数的作用域转到a这个对象上;这行代码意义在于创建一个新的数组对象,它的起点和终点是原来的1到a.length,这么做是因为写fireEvent这个方法的时候第一个参数始终都是事件名,之后才是监听函数所需要的参数
请教大家,以上代码,a就是一个数组,为什么还要通过继承的方式调用Array的slice方法呢?这不是多此一举吗?看得我头都晕了。 请问是不是有特殊作用呢?
obj1是观察者,被影响的目标是那些监听函数(在javascript中函数也是对象),你可以把这些监听函数想象成订阅者;在这里可以看到,Observable的fireEvent方法可以同时影响到多个注册到相同事件的方法上
更确切的说我是想说明通过在监听设置返回值为false有时是可以打断原本函数的流程的。当然这种做法实现需要 return (this.firing = false);这段代码来实现
另外一点可以从代码中看出:只要一个监听返回了false,其他后续注册在这个事件上的监听也不会被触发,譬如说我在最后面再添加一个before事件的监听,那它也会因为前面相同事件的监听返回false而不被执行
阅读前请您准备好Javascript基础知识(包括:prototype属性、Functin对象的apply和call方法、函数的作用域等)。
该脚本剥离了许多分支逻辑,修改了大多数函数的实现仅保留最基本逻辑,如需详细了解Ext内部请阅读Ext源代码。Enjoy it!
该脚本脱离了Ext库的依赖,可直接复制在firbug下运行,(推荐chrome的javascript控制台,功能更强大)
预期运行结果:
/** * 观察者模式,也称作订阅发布模式,体现一种一对多关系,一般用在一个对象的改变将影响其它多个对象的情况下。 * * */ Observable = function(name) { this.name = name; this.events = {}; this.addEvents('before', 'after'); this.getName = function() { if (this.fireEvent('before', this.name) !== false) { console.log('My name is ' + this.name); this.fireEvent('after', this.name); return this.name; } } } Observable.prototype = { /** * 添加事件名,就是个注册罢了,可以同时注册多个;试想一下如果添加就初始化了Event对象,如果一个组件有很多事件类型, * 那么每次组件初始化它所具备的事件时要把每个事件组件都是实例化,那该是一件多么费内存的操作啊! */ addEvents : function() { var a = arguments, i = a.length; while (i--) { this.events[a[i]] = true;// 这里可不是数组,这是变量的形式访问属性 } }, addListener : function(eventName, fn, scope) { var ce;// 事件对象或者是true ce = this.events[eventName] || true; if (ce == true) {//事件默认是没有初始化的 this.events[eventName] = ce = new Event(this, eventName); } ce.addListener(fn, scope); }, /** * @augments 第一个是事件名,之后是监听方法需要的参数 * @return ret 进一步执行的标实 */ fireEvent : function() { var a = arguments, ret = true, ce; ename = a[0], ce = this.events[ename]; if (Object.prototype.toString.call(ce) === '[object Object]') { ret = ce.fire.apply(ce, Array.prototype.slice.call(a, 1, a.length)); } return ret; } }; Event = function(obj, name) { this.name = name; this.obj = obj; this.listeners = []; }; Event.prototype = { addListener : function(fn, scope, options) { scope = scope || this.obj; if (this.firing) { // 如果正在触发监听事件,则用slice方法创建一个与原对象一样的新对象,这样不会影响正在触发的监听方法链 this.listeners = this.listeners.slice(0); } this.listeners.push({ fireFn : fn, scope : scope, options : options }); }, fire : function() { var listeners = this.listeners, args = Array.prototype.slice.call(arguments, 0, arguments.length), len = listeners.length, i = 0, l; if (len > 0) { this.firing = true; for (; i < len; i++) { l = listeners[i]; // 添加监听时设置的作用域具有最高优先级,其次是当前Event对象的目标对象,都没有就是window对象 if (l&& l.fireFn.apply(l.scope || this.obj || window, args) === false) { return (this.firing = false); } } } this.firing = false; return true; } }; var obj1 = new Observable('bob'); obj1.addListener('before', function() { console.log('First before listener my name is ' + this.name); }); obj1.addListener('before', function() { console.log('Second before listener my name is ' + this.obj1.name); return false; }, this); obj1.addListener('after', function() { console.log('First after listener my name is ' + this.name); }); obj1.addListener('after', function() { console.log('Second after listener my name is ' + this.name); }); obj1.getName();
评论
6 楼
chemzqm
2010-04-17
hommy8 写道
var a = arguments; Array.prototype.slice.call(a, 1, a.length);
请教大家,以上代码,a就是一个数组,为什么还要通过继承的方式调用Array的slice方法呢?这不是多此一举吗?看得我头都晕了。 请问是不是有特殊作用呢?
错了 a不是数组 arguments是函数执行时的参数对象,它只是具有array的某些方法属性罢了。还有一点,这种方式方式不能叫做继承,call方法的目的是装换作用域并传参,这里是把Array.prototype.slice这个函数的作用域转到a这个对象上;这行代码意义在于创建一个新的数组对象,它的起点和终点是原来的1到a.length,这么做是因为写fireEvent这个方法的时候第一个参数始终都是事件名,之后才是监听函数所需要的参数
5 楼
hommy8
2010-04-16
var a = arguments; Array.prototype.slice.call(a, 1, a.length);
请教大家,以上代码,a就是一个数组,为什么还要通过继承的方式调用Array的slice方法呢?这不是多此一举吗?看得我头都晕了。 请问是不是有特殊作用呢?
4 楼
chemzqm
2010-04-15
beck5859509 写道
观察者模式,也称作订阅发布模式,体现一种一对多关系,一般用在一个对象的改变将影响其它多个对象的情况下。
我又重新读了以便代码,发现上面写的代码和这句话关系好象不大,还是太抽象了,
比如
var obj1 = new Observable('bob');
obj1是观察者还是目标啊,它注册的before事件并没有影响到其它多个对象.
期待LZ详解.
我又重新读了以便代码,发现上面写的代码和这句话关系好象不大,还是太抽象了,
比如
var obj1 = new Observable('bob');
obj1是观察者还是目标啊,它注册的before事件并没有影响到其它多个对象.
期待LZ详解.
obj1是观察者,被影响的目标是那些监听函数(在javascript中函数也是对象),你可以把这些监听函数想象成订阅者;在这里可以看到,Observable的fireEvent方法可以同时影响到多个注册到相同事件的方法上
3 楼
beck5859509
2010-04-15
观察者模式,也称作订阅发布模式,体现一种一对多关系,一般用在一个对象的改变将影响其它多个对象的情况下。
我又重新读了以便代码,发现上面写的代码和这句话关系好象不大,还是太抽象了,
比如
var obj1 = new Observable('bob');
obj1是观察者还是目标啊,它注册的before事件并没有影响到其它多个对象.
期待LZ详解.
我又重新读了以便代码,发现上面写的代码和这句话关系好象不大,还是太抽象了,
比如
var obj1 = new Observable('bob');
obj1是观察者还是目标啊,它注册的before事件并没有影响到其它多个对象.
期待LZ详解.
2 楼
chemzqm
2010-04-15
beck5859509 写道
写得不错,不过有处不是很清楚。
this.getName = function() {
if (this.fireEvent('before', this.name) !== false) {
console.log('My name is ' + this.name);
this.fireEvent('after', this.name);
return this.name;
}
}
从楼主的执行结果来看,上面的 this.fireEvent("before',this.name)返回的是false,所以根本不会去执行after这个事件,楼主连续注册两次before事件,就是想让fire方法中的 return (this.firing = false) 语句返回 false,不知道我的理解对不对
this.getName = function() {
if (this.fireEvent('before', this.name) !== false) {
console.log('My name is ' + this.name);
this.fireEvent('after', this.name);
return this.name;
}
}
从楼主的执行结果来看,上面的 this.fireEvent("before',this.name)返回的是false,所以根本不会去执行after这个事件,楼主连续注册两次before事件,就是想让fire方法中的 return (this.firing = false) 语句返回 false,不知道我的理解对不对
更确切的说我是想说明通过在监听设置返回值为false有时是可以打断原本函数的流程的。当然这种做法实现需要 return (this.firing = false);这段代码来实现
另外一点可以从代码中看出:只要一个监听返回了false,其他后续注册在这个事件上的监听也不会被触发,譬如说我在最后面再添加一个before事件的监听,那它也会因为前面相同事件的监听返回false而不被执行
1 楼
beck5859509
2010-04-14
写得不错,不过有处不是很清楚。
this.getName = function() {
if (this.fireEvent('before', this.name) !== false) {
console.log('My name is ' + this.name);
this.fireEvent('after', this.name);
return this.name;
}
}
从楼主的执行结果来看,上面的 this.fireEvent("before',this.name)返回的是false,所以根本不会去执行after这个事件,楼主连续注册两次before事件,就是想让fire方法中的 return (this.firing = false) 语句返回 false,不知道我的理解对不对
this.getName = function() {
if (this.fireEvent('before', this.name) !== false) {
console.log('My name is ' + this.name);
this.fireEvent('after', this.name);
return this.name;
}
}
从楼主的执行结果来看,上面的 this.fireEvent("before',this.name)返回的是false,所以根本不会去执行after这个事件,楼主连续注册两次before事件,就是想让fire方法中的 return (this.firing = false) 语句返回 false,不知道我的理解对不对
发表评论
-
[翻译]Ex4t教程:Ext4起步
2012-02-23 21:58 01.1 浏览器 Ext JS 4 supports a ... -
[Ext入门]如何学习Ext
2010-05-29 19:26 2714国内使用Ext的可谓不少,但是多数也只限与使用其中示例,真能把 ... -
[Ext重写]必填项的label后面加星号
2010-05-20 15:49 3204Ext.form.TextField.override({ ... -
[Ext重写]限制树的深度
2010-05-19 00:51 1881以前做政府项目的时候经常涉及行政区划的树,这个树有的时候要显示 ... -
[Ext源码]Ext的核心方法
2010-05-07 01:17 1541Ext.extend方法: extend : functi ... -
[Ext插件]QM.plugin.MutilTreeFilter:为树添加过滤、展开、收缩功能
2010-05-01 19:48 3587先来看看Ext的官方API的左上角 本插件基于Ext3.0 ... -
[Ext入门]图文详解Ext常见开发工具的安装使用
2010-04-27 21:28 4718俗话说,工欲善其事,必先利其器。缺乏好的工具想要用好Ext这么 ... -
[Ext扩展]动态分页大小、动态grid高度、本地数据分页三合一
2010-04-27 02:53 6332Ext.ux.plugins.PageComboResizer ... -
[Ext扩展]两个来自Ext官方论坛的时间控件扩展,可选择时分秒
2010-04-26 22:55 21703为方便大家使用,我把控件所需的js、css、gif文件都提取出 ... -
[Ext扩展]QM.ui.TreeCombo:多功能下拉树列表,内含文档与示例
2010-04-26 20:12 5949有句老话叫不重复造轮 ... -
[Ext扩展]QM.ux.TreeFilter:树节点智能过滤,添加中文模糊匹配功能
2010-04-26 18:24 5720Ext自带一个Ext.tree.TreeFilter类,可以实 ... -
[组件用法]Ext.state.Manager对组件状态进行管理
2010-04-20 01:44 4885Ext.state.Manager存在的意义:简单说就是在客户 ... -
[Ext插件]PinyinFilter:使用拼音首字母对数据进行过滤
2010-04-19 00:37 3955这个插件的目的在于提高用户对于数据的选择效率。经常录入数据的人 ... -
[Ext扩展]根据后台json生成左侧导航菜单,5月9日更新1.1版本
2010-04-16 03:39 4919文章内不再提供示例,需要查看者请从SVN下载,地址: http ... -
[Ext扩展]MenuToolbar:根据json串生成多级菜单
2010-04-14 20:16 3739注意:html文件的Ext库引用请自行解决,效果图: ... -
[Ext扩展]JsonTreeLoader:一次加载所有树节点更新1.1版本
2010-04-14 19:58 4690仿照官网例子:XmlTreeLoader做的,下面有实例 注意 ... -
[组件用法]Ext.History用法要点
2010-04-14 01:11 2558在我的单页面试了下这个类的用法,发现这个类还是比较特殊的。 说 ... -
拒绝iframe嵌套,ajax方式轻松实现单页面
2010-04-13 00:00 6208以前单位做的项目都是上面一排菜单按钮,每点击一次按钮下面工作区 ... -
为Ext.Msg添加一个ghost提示的方法
2010-04-05 19:43 2041总觉得的老用alert的方式打断用户操作是非常不好的做法,调用 ... -
Ext.TreeNodeCascade让所有Ext的树支持级联选中
2010-04-05 04:15 6027运用了单例模式,使用的话直接让页面文件引用即可。该程序不直接关 ...
相关推荐
Ext JS源码分析与开发实例宝典光盘源码Ext JS源码分析与开发实例宝典光盘源码Ext JS源码分析与开发实例宝典光盘源码Ext JS源码分析与开发实例宝典光盘源码Ext JS源码分析与开发实例宝典光盘源码Ext JS源码分析与开发...
ext-3.1.1源码 ext-3.1.1源码ext-3.1.1源码
ext JS 源码和学习资料,包含ext-3.2.0,ext3.3.1,ext4等多个版本源码,包含多个版本中文API和实用学习pdf
Ext_JS源码分析与实例宝典 Ext_JS源码分析与实例宝典Ext_JS源码分析与实例宝典Ext_JS源码分析与实例宝典Ext_JS源码分析与实例宝典Ext_JS源码分析与实例宝典
Ext+JS源码分析与开发实例宝典.pdf,清晰完整版。彭仁夔 编著,2010.1 。该书共6个part,全部下载才能RAR解压。所有下载链接去这里找http://stephegn.download.csdn.net/ 全面剖析Ext JS 3.0的架构原理 透彻体悟...
ext项目实例源码
包含了ext自身的源代码以及本人对ext配套代码的一点解读~对读者还是非常有帮助的~!
ext3.3的源码,我自己用的就是这个,保证能用,要查看docs最好装个小型服务器
Ext+JS源码分析与开发实例宝典.pdf,清晰完整版。彭仁夔 编著,2010.1 。该书共6个part,全部下载才能RAR解压。所有下载链接去这里找http://stephegn.download.csdn.net/ 全面剖析Ext JS 3.0的架构原理 透彻体悟...
这是ext框架的源码,以及如何使用的实例
Ext 源码 大漠孤烟的神术,浅显易懂,这只是源码,木有书
ext-1.0源码+部分中文解读
JavaScript凌厉开发——Ext详解与实践_源码清单.rarJavaScript凌厉开发——Ext详解与实践_源码清单.rarJavaScript凌厉开发——Ext详解与实践_源码清单.rar
这是Ext.net官网源码,解决了其中中文随机乱码以及弹出授权窗口的源码,源码完整,放心可用
里面包含ext 源码,开发文档,api, 实用例子,不过要耐心看的
Ext3.0 JS源码分析与开发实例宝典
EXT2.2源码及中文手册,中文手册介绍了如何应用ext
包含完整的ext4文件系统的源代码,提供给大家学习和参考。
ext医院管理源码+java源码整理
NULL 博文链接:https://wv1124.iteye.com/blog/505260