Ext事件机制

  • 最初的事件处理方式

在早期,不存在事件的概念,开发者用javascript的两个函数来模拟事件机制(window.setTimeout和window.setInterval),由于很多原因,如效率低下等,发明了最原始的0级dom事件模型,为元素添加一个事件,在事件上绑定一个处理函数。
缺点: 这种模型不能为元素的事件添加多个处理函数
例如:

	var inp = document.createElement('input');
	inp.id = 'inp1';
	inp.type = 'button';
	inp.value = '点击';
	// 添加点击事件处理函数
	inp.onclick = function(){
		alert('点击!!!click');
	};
	// 不能添加多个处理函数
//	inp.onclick = function(){
//		alert('点击!!!click2');
//	};
	
	// 渲染到页面
	document.body.appendChild(inp);
  • 标准dom事件模型
    在存在0级事件模型之后,才成立了w3c,感觉0级事件模型不好用,就推出了2级事件模型(即标准dom事件模型)。主要提供了添加事件和移除事件的两个标准方法:
 element.addEventListener(type, listener, useCapture); // 添加事件
 element.removeEventListener(type, listener, useCapture); // 移除事件

使用方式如下:

window.onload = function(){
	var inp = document.createElement('input');
	inp.id = 'inp1';
	inp.value = '点击';
	inp.type = 'button';
	
	
	// type 事件类型
	// listener 为事件绑定的函数
	// useCapure 事件传播 true=捕获  false=冒泡
	inp.addEventListener('click', test1, false);
	inp.removeEventListener('click', test1, false);
	inp.addEventListener('click', test2, false);
	
	// 特殊浏览器 但IE11已经支持w3c标准
	// IE  attachEvent(); detachEvent();
	//	inp.attachEvent('onclick', test1);
	//	inp.attachEvent('onclick', test2);
	
	document.body.appendChild(inp);
};

function test1(){
	alert('test1');
};
function test2(){
	alert('test2');
}
  • 事件的传播机制
    w3c 提供了event事件对象,定义事件的三个阶段: 1捕获 2 目标命中 3 冒泡。
window.onload = function(){
	var inp = document.createElement('input');
	inp.id = 'inp1';
	inp.value = '点击';
	inp.type = 'button';
	
	inp.addEventLisener('click', function(event){
		alert('input execute...');
		event.stopPropagation();//阻止冒泡事件的发生
	}, false);
	
	var div = document.createElement('div');
	div.addEventListener('click', function(){
		alert('div execute...');
	}, false);
	
	document.body.addEventListener('click', function(){
		alert('body execute...');
	}, false);
	
	div.appendChild(inp);
	document.body.appendChild(div);
	
};
  • Ext.EventManager
    Ext.EventManager封装浏览器自带的事件,解决了浏览器的差异问题。
var MyExt = {};

MyExt.EventManager = {
	
	// 添加监听
	addListener:function(element, eventName, fn, useCapture){
		if(element.addEventListener){
			element.addEventListener(eventName, fn, useCapture);
		} else if(element.attachEvent){
			element.attachEvent('on'+eventName, fn);
		}
	},
	
	// 移除监听
	removeListener:function(element, eventName, fn, useCapture){
		if (element.removeEventListener){
			element.removeEventListener(eventName, fn, useCapture);
		} else if (element.detachEvent) {
			element.detachEvent('on'+eventName, fn);
		}
	}
	
};


MyExt.EventManager.on = MyExt.EventManager.addListener;
MyExt.EventManager.un = MyExt.EventManager.removeListener;


window.onload = function(){
	var btn = document.getElementById('btn');
	MyExt.EventManager.on(btn, 'click', function(){
		alert('execute ...');
	}, false);
	
	MyExt.EventManager.on(btn, 'click', function(){
		alert('execute again ...');
	}, false);
};

  • 利用观察者模式实现自定义事件
Ext.onReady(function(){
	 // 利用观察者模式实现自定义事件
	 
	 // 1:由于浏览器自己也可以定义内置事件,如click/blur等,
	 //	我们自己也可以有一个类似的类,并可以在此类中定义一些事件
	 var observable = function(){
	 	// 存储自定义的事件类型
	 	this.events = ['start', 'stop'];
	 	
	 	// 设计一种数据结构,可以维护自定义的事件类型和事件之间的绑定关系,如下:
	 	// 			'start':[fn1, fn2, ...]
	 	// 			'stop':[fn1, fn2, ...]
	 	this.listeners = {};
	 };	
	 
	 
	// 2:添加新的自定义事件类型
	observable.prototype.addEvents = function(eventName){
		this.events.push(eventName);
	};
	 
	// 3:为自己的事件类型绑定响应的函数,添加事件监听
	observable.prototype.addListener = function(eventName, fn){
		// 先判断当前事件类型是否已经存在
		if(this.events.indexOf(eventName) == -1){
			this.addEvents(eventName);//当前不存在时,加入该事件
		}
		
		// 获取事件类型绑定的所有的函数
		var arr = this.listeners[eventName];
		// 如果当前这个函数数组不存在,则需要为此事件类型绑定新添加的函数
		if (!arr) {
			arr = [fn];// 直接绑定函数
		} else {
			// 如果当前事件类型已经存在绑定的函数,则校验所绑定的函数中是否已经包含了要绑定的fn函数
			if (arr.indexOf(fn) == -1){
				arr.push(fn);//如果不包含,则加入当前要绑定的函数
			}
		}
		
		// 重新维护一下当前事件类型所绑定的事件数组的关联关系
		this.listeners[eventName] = arr;
		
	};
	
	// 4:移除事件监听
	observable.prototype.removeListener = function(eventName, fn){
		// 先校验要移除的事件类型是否已经定义
		if (this.events.indexOf(eventName) == -1) {
			return;
		}
		
		// 存在要移除的事件类型时
		// 判断当前事件绑定的函数中是否包含要移除的函数
		var arr = this.listeners[eventName];
		if (!arr) {
			return;
		}
		
		// 判断要移除的函数fn存在与当前事件的函数数组中时
		if (arr.indexOf(fn) != -1) {
			// 要移除的函数存在与事件类型对应的函数
			arr.splice(arr.indexOf(fn), 1);
		}
		
	};
	
	 
	// 5、如何触发事件   即调用这个事件类型所对应的所有函数即可
	observable.prototype.fireEvent = function(eventName){
		// 如果没有传递事件类型,或者当前传递的事件类型不存在,则直接返回
		if (!eventName || this.events.indexOf(eventName) == -1) {
			return;
		}
		
		// 存在对应事件
		var arr = this.listeners[eventName];
		if (!arr) {
			return;
		}
		
		for(var i=0, len=arr.length; i<len; i++){
			var fn = arr[i];
			fn.call(fn, this);
		}
		
	};
	 
	// 6、javascript习惯  为原型对象方法起一个简单的名称,方便开发者使用
	observable.prototype.on = observable.prototype.addListener;
	observable.prototype.un = observable.prototype.removeListener;
	observable.prototype.fr = observable.prototype.fireEvent;
	
	
	//测试
	var ob = new observable();
	var fn1 = function(){
		alert('fn1...');
	};
	ob.on('start', fn1);
	
	var fn2 = function(){
		alert('fn2...');
	};
	ob.on('stop', fn2);
	
	// 移除监听
	//ob.un('start', fn1);
	
	ob.fr('start');
	ob.fr('stop');

	
	// 添加新事件
	ob.on('run', function(){
		alert('run');
	});
	
	ob.fr('run');
	
});
  • 三种绑定事件的方式
  1. Ext.EventManager.on(el, ename, fn);
  2. Ext.EventManager.on(el, {ename1:fn1, ename2:fn2});
  3. Ext.EventManager.on(el, {ename1:{fn:fun}, ename2:{fn:fun}});
Ext.onReady(function(){
	var inp = document.createElement('input');
	inp.type = 'button';
	inp.id = 'inp1';
	inp.value = '点击';
	document.body.appendChild(inp);
	
	var extInp = Ext.get('inp1');

	Ext.EventManager.on(extInp, 'click', function(){
		alert('execute  ...');
	});
	Ext.EventManager.on(extInp, 'click', function(){
		alert('execute again ...');
	});
	
	//	绑定多个事件:方式一
	Ext.EventManager.on(extInp, {
		'click':function(){
			alert('单击!');
		},
		'mouseout':function(){
			alert('移除!');
		}
	});

	//	绑定多个事件:方式二
	Ext.EventManager.on(extInp, {
		'click':{
			fn:function(){
				alert('点击1!');
			}
		},
		'mouseout':{
			fn:function(){
				alert('点击2!');
			}
		}
	});

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 很抱歉,我是一名语言模型AI,无法为您提供视频播放器。但我可以告诉您,EXT JS 6是一种用于创建Web应用程序的JavaScript框架,可以用于构建用户界面,包括视频播放器。如果您需要特定的帮助,您可以在EXT JS论坛或相关社区寻求帮助。 ### 回答2: Ext JS是一个强大的JavaScript应用程序框架,它可以用于开发各种类型的Web应用程序。在Ext JS 6版本中,它提供了丰富的组件和工具,使开发人员可以轻松地创建视频播放器。 首先,我们可以使用Ext JS的视图组件来构建视频播放器的用户界面。例如,可以使用面板组件作为播放器的容器,并在面板上放置控制按钮和播放进度条等元素。还可以使用按钮组件来实现播放、暂停、快进和后退等功能。 其次,Ext JS提供了多媒体组件,可以用于播放视频。可以使用媒体组件加载视频文件,并使用相关方法控制视频的播放、暂停和跳转等操作。还可以使用事件处理机制来监听视频播放过程中的事件,例如播放完成、缓冲状态和播放错误等。 除了基本的播放功能,我们还可以通过Ext JS的插件机制来扩展视频播放器的功能。例如,可以使用插件来实现全屏播放、倍速播放、字幕显示和弹幕功能等。 另外,Ext JS还提供了数据绑定和模板功能,可以方便地将视频播放器与后端服务器进行交互。可以使用数据绑定来获取视频列表、播放历史记录和用户信息等数据,然后使用模板来渲染这些数据到播放器界面中。 总结来说,使用Ext JS 6可以轻松创建一个功能丰富的视频播放器。通过使用视图组件、多媒体组件、插件功能和数据绑定等特性,可以实现播放控制、界面美化和与后端服务器的数据交互等功能。 ### 回答3: Ext JS 6是一种强大的JavaScript库,用于构建现代化的Web应用程序。它提供了许多丰富的组件和工具,可以轻松地创建交互式和响应式的用户界面。 要在Ext JS 6中实现视频播放器,我们可以使用HTML5的video元素来播放视频文件。首先,我们需要创建一个包含video标签的Ext.Container组件,在页面上显示视频播放器。然后,设置video标签的属性,如视频URL、尺寸和控件选项。我们还可以设置Autoplay属性来自动开始播放视频。 除了基本功能之外,我们还可以通过使用Ext JS 6的事件和方法来增强视频播放器的功能。例如,我们可以添加事件监听器来捕获视频的播放、暂停和结束事件,并执行相应的操作。我们还可以使用JavaScript代码来控制视频的播放、暂停、快进和倒带等操作。 另外,我们还可以使用Ext JS 6的布局和样式功能来美化视频播放器。我们可以为播放器添加自定义的样式、控件按钮和进度条,以提升用户体验和界面的吸引力。 总结来说,使用Ext JS 6可以轻松地创建功能强大的视频播放器。通过使用HTML5的video元素和Ext JS 6的组件、事件和方法,我们可以实现播放、控制和美化视频的各种功能,从而为用户提供优质的视频播放体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值