(AS3)使用闭包给事件监听附带参数

本文介绍了一种使用闭包优化按钮点击事件处理的方法,通过将循环中的索引值作为闭包的上值保存,实现了动态注册事件监听器并解决了传统方法中按钮数量变化导致的问题。

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

情景再现:有5个按钮,变量名分别是btn1~btn5,需求就是需要在点击的时候知道到底点了第几个按钮,也就是需要获取到btnx中的x(那个文本框是infoTxt),看下面:


简单的做法:

for (var i:int = 1; i <= 5; ++i)
{
	this["btn"+i].addEventListener(MouseEvent.CLICK, onClick);
}
function onClick(e:Event):void
{
	var name_:String = e.target.name;
	var index:int = int(name_.substr(name_.length - 1 , 1));
	infoTxt.text="点击了"+index+"号按钮";
}
function dispose():void
{
	for (var i:int = 1; i <= 5; ++i)
	{
		this["btn"+i].removeEventListener(MouseEvent.CLICK, onClick);
	}
}

很明显这样已经达到了想要的功能,但觉得这样的代码针对性太强,有可能我的按钮数量达到了2位数以上,那substr是不是要指定len为2呢?或者觉得这样写不够高端。。(很蛋疼是不是~)

为了简化代码,闭包很适时的出现在了我的脑海中,我们只要把 i 当成一个 upvalue ,这样就可以把这个值保存起来,在调用的时候直接拿参数就OK,看代码:

var listenerList:Array = [];
for (var i:int = 1; i <= 5; ++i)
{
	var f:Function = onClick(i);
	this["btn"+i].addEventListener(MouseEvent.CLICK, f);
	listenerList.push({elem:this["btn"+i],eventType:MouseEvent.CLICK,func:f});
}
function onClick(i_:int):Function
{
	return function(e:Event):void
	{
		infoTxt.text="点击了"+i_+"号按钮";
	}
}
function dispose():void
{
	for each (var obj:Object in listenerList) 
	{
		obj.elem.removeEventListener(obj.eventType, obj.func);
	}
}

在事件监听的地方,使用闭包传递了一个 i 进去,返回了一个匿名方法,当然为了移除监听,我们需要把这个方法一起保存起来以便销毁。


当然两种方法都是可以解决问题的,能解决问题的方法都是好方法。

第一种方法甚至更简洁方便,不过多使用不同的技巧去实现功能需求对编程的能力增长还是很有意义的。

 

转载于:https://www.cnblogs.com/yili16438/archive/2012/05/23/2514540.html

内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
### JavaScript 中向按钮事件监听器传递参数的方法 在 JavaScript 中,可以通过多种方式向事件监听器传递额外的参数。以下是几种常见的方式: #### 使用闭包捕获外部变量 当定义匿名函数作为事件处理器时,可以利用闭包来访问外部作用域中的变量。 ```javascript function setupButtonClickListener(buttonId, param) { document.getElementById(buttonId).addEventListener(&#39;click&#39;, () => { console.log(`The parameter is ${param}`); }); } setupButtonClickListener(&#39;myButton&#39;, &#39;extra data&#39;); ``` 这种方式允许将任意数量的数据绑定到特定的 DOM 元素上,并且这些数据可以在点击事件触发时被访问[^1]。 #### 利用 `bind` 方法固定部分参数 `Function.prototype.bind()` 可以为函数创建一个新的版本,在新版本中 this 关键字指向指定的对象,并且可以选择性地预设一些初始参数。 ```javascript const handleClickWithBind = function(param) { console.log(`Bound parameter: ${param}`); }; document.querySelector(&#39;#boundButton&#39;).addEventListener( &#39;click&#39;, handleClickWithBind.bind(null, &#39;fixed argument&#39;) ); ``` 这里使用了 bind 将第一个参数设定为固定的字符串 "fixed argument"[^4]。 #### 创建自定义属性存储附加信息 HTML 的 dataset 属性提供了一种方便的方式来保存与元素关联的小量元数据。这使得可以直接从事件对象获取所需的信息而无需显式传参。 ```html <button id="dataAttrBtn" data-info="some info">Click me</button> <script> document.getElementById(&#39;dataAttrBtn&#39;).addEventListener(&#39;click&#39;, (event) => { let extraInfo = event.target.getAttribute(&#39;data-info&#39;); alert(extraInfo); // 显示 some info }); </script> ``` 这种方法特别适用于那些只需要少量静态配置的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值