大师推荐的经典方法(持续更新)

本文介绍了三种跨浏览器的事件处理方法:John Resig的addEvent/removeEvent,Jeremy Keith的load方法,以及Dean Edwards改进的addEvent/removeEvent。Dean Edwards的方法在不同浏览器中表现一致,并妥善处理了this关键字和事件对象传递等问题。
目录:

1, John Resig自己获奖的addEvent/removeEvent方法;
2, Jeremy Keith的load方法;
3, Dean Edwards修改版的addEvent/removeEvent方法。



1, 下面是JQuery之父推荐的添加移除事件方法。

/*
*obj 要绑定事件的对象
*type 事件类型,指"click", "load", "submit", "mouseover"等
*fn 函数名
*/
function addEvent( obj, type, fn )
{
if ( obj.attachEvent )
{
obj['e' + type + fn] = fn;
obj[type + fn] = function()
{
obj['e' + type + fn]( window.event );
}
obj.attachEvent( 'on' + type, obj[type + fn] );
}
else
obj.addEventListener( type, fn, false );
}
/*
*obj 要删除事件的对象
*type 事件类型,指"click", "load", "submit", "mouseover"等
*fn 函数名
*/
function removeEvent( obj, type, fn )
{
if ( obj.detachEvent )
{
obj.detachEvent( 'on' + type, obj[type + fn] );
obj[type + fn] = null;
}
else
obj.removeEventListener( type, fn, false );
}


//addEvent( document.getElementById('foo'), 'click', doSomething );


我都没怎么翻译,大家可以看原文:http://ejohn.org/apps/jselect/event.html。

2, 下面是在Dom Scripting书上介绍的添加启动事件的方法addLoadEvent(func)。

<script language="javascript" type="text/javascript">

function addLoadEvent(func)
{
var oldonload = window.onload;

if (typeof window.onload != 'function')
{
window.onload = func;
}
else
{
window.onload = function()
{
oldonload();
func();
}
}
}

function event1() {alert("function 1!");}
function event2() {alert("function 2!");}
function event3() {alert("function 3!");}
function event4() {alert("function 4!");}
function event5(msg) {alert(msg)}

addLoadEvent(event1);
addLoadEvent(event2);
addLoadEvent(event3);
addLoadEvent(event4);
//参数传递的方式
addLoadEvent(function(){ event5('myArgument') });

</script>


3, 周六借了本《Pro JavaScript Techniques》来看,没有想到John Resig大大推荐了Dean Edwards的addEvent()方法,而没推荐自己更精简的作品,他这样评价Edwards的addEvent()的:
1, 可以在所有浏览器中工作,就算是古老得无任何支持的浏览器;
2, this关键字可在所有的绑定函数中使用,指向的是当前元素;
3, 中和了所有防止浏览器默认行为和阻止事件冒泡的各种浏览器特定函数;
4, 不管浏览器类型,事件对象总是作为第一个对象传入;
5, 唯一缺点是仅工作在冒泡阶段(因为深入使用事件绑定的传统方法)。
6, addEvent/removeEvent函数如此强大,绝对没有任何理由不在你的代码中使用。


而Dean Edwards这样说:
My solution is very different.

* it performs no object detection
* it does not use the addeventListener/attachEvent methods
* it keeps the correct scope (the this keyword)
* it passes the event object correctly
* it is entirely cross-browser (it will probably work on IE4 and NS4)
* and from what I can tell it does not leak memory

下面是Dean Edwards的addEvent/removeEvent函数:

// http://dean.edwards.name/weblog/2005/10/add-event/

function addEvent(element, type, handler) {
if (element.addEventListener) {
element.addEventListener(type, handler, false);
} else {
// 为每一个事件处理函数赋予一个独立的ID
if (!handler.$$guid) handler.$$guid = addEvent.guid++;
// 为元素建立一个事件类型的Hash表
if (!element.events) element.events = {};
// 为每对元素/事件建立一个事件处理函数的Hash表
var handlers = element.events[type];
if (!handlers) {
handlers = element.events[type] = {};
// 存储已有的事件处理函数(如果已存在一个)
if (element["on" + type]) {
handlers[0] = element["on" + type];
}
}
// 在Hash表中存储该事件处理函数
handlers[handler.$$guid] = handler;
// 赋予一个全局事件处理函数来处理所有工作
element["on" + type] = handleEvent;
}
};
// 创建独立ID的计数器
addEvent.guid = 1;

function removeEvent(element, type, handler) {
if (element.removeEventListener) {
element.removeEventListener(type, handler, false);
} else {
// 从Hash表中删除事件处理函数
if (element.events && element.events[type]) {
delete element.events[type][handler.$$guid];
}
}
};

function handleEvent(event) {
var returnValue = true;
// 获取事件处理对象(IE使用全局的事件对象)
event = event || fixEvent(((this.ownerDocument || this.document || this).parentWindow || window).event);
// 获取事件处理函数Hash表的引用
var handlers = this.events[event.type];
// 依次处理每个事件处理函数
for (var i in handlers) {
this.$$handleEvent = handlers[i];
if (this.$$handleEvent(event) === false) {
returnValue = false;
}
}
return returnValue;
};
//增加一些IE事件对象的缺乏的方法
function fixEvent(event) {
// 增加W3C标准事件方法
event.preventDefault = fixEvent.preventDefault;
event.stopPropagation = fixEvent.stopPropagation;
return event;
};
fixEvent.preventDefault = function() {
this.returnValue = false;
};
fixEvent.stopPropagation = function() {
this.cancelBubble = true;
};
本课题设计了一种利用Matlab平台开发的植物叶片健康状态识别方案,重点融合了色彩与纹理双重特征以实现对叶片病害的自动化判别。该系统构建了直观的图形操作界面,便于用户提交叶片影像并快速获得分析结论。Matlab作为具备高效数值计算与数据处理能力的工具,在图像分析与模式分类领域应用广泛,本项目正是借助其功能解决农业病害监测的实际问题。 在色彩特征分析方面,叶片影像的颜色分布常与其生理状态密切相关。通常,健康的叶片呈现绿色,而出现黄化、褐变等异常色彩往往指示病害或虫害的发生。Matlab提供了一系列图像处理函数,例如可通过色彩空间转换与直方图统计来量化颜色属性。通过计算各颜色通道的统计参数(如均值、标准差及主成分等),能够提取具有判别力的色彩特征,从而为不同病害类别的区分提供依据。 纹理特征则用于描述叶片表面的微观结构与形态变化,如病斑、皱缩或裂纹等。Matlab中的灰度共生矩阵计算函数可用于提取对比度、均匀性、相关性等纹理指标。此外,局部二值模式与Gabor滤波等方法也能从多尺度刻画纹理细节,进一步增强病害识别的鲁棒性。 系统的人机交互界面基于Matlab的图形用户界面开发环境实现。用户可通过该界面上传待检图像,系统将自动执行图像预处理、特征抽取与分类判断。采用的分类模型包括支持向量机、决策树等机器学习方法,通过对已标注样本的训练,模型能够依据新图像的特征向量预测其所属的病害类别。 此类课题设计有助于深化对Matlab编程、图像处理技术与模式识别原理的理解。通过完整实现从特征提取到分类决策的流程,学生能够将理论知识与实际应用相结合,提升解决复杂工程问题的能力。总体而言,该叶片病害检测系统涵盖了图像分析、特征融合、分类算法及界面开发等多个技术环节,为学习与掌握基于Matlab的智能检测技术提供了综合性实践案例。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值