如何在JavaScript中创建一次性事件

有时,一个事件只需要在页面中调用一次即可。 例如,单击缩略图以加载并播放视频文件,或者单击“更多”图标,以通过Ajax检索并显示其他内容。 但是,您可能已经定义了一个事件处理程序,每次执行该操作时都会调用该事件处理程序。 充其量,它的效率有些低下,并且浏览器会保留不必要的资源。 在最坏的情况下,您的处理程序可能会执行意外操作或重新加载已经可用的数据。

幸运的是,使用JavaScript创建一次性事件处理程序相对容易。 过程:

  1. 将处理程序分配给事件,例如单击元素。
  2. 单击该元素后,处理程序将运行。
  3. 处理程序已删除。 对该元素的进一步单击将不再调用该函数。

jQuery的

首先让我们看一下最简单的解决方案。 如果您使用的是jQuery,则有一个鲜为人知的one()事件绑定方法可以实现一次性事件。

$("#myelement").one( "click", function() { alert("You'll only see this once!"); } );

它与其他jQuery事件方法的用法相同。 有关更多信息,请参阅api.jquery.com/one/

自动搬运机

如果您使用的是原始JavaScript,则任何处理程序函数都可以使用单行代码删除自身:

document.getElementById("myelement").addEventListener("click", handler);

// handler function
function handler(e) {
	// remove this handler
	e.target.removeEventListener(e.type, arguments.callee);

	alert("You'll only see this once!");
}

假设您的处理程序事件参数名为“ e”,则该行如下:

e.target.removeEventListener(e.type, arguments.callee);

将在第一次调用处理程序时将其删除。 您为处理程序使用哪种事件类型或名称都没有关系-它甚至可能是嵌入式匿名函数。

注意我使用了标准事件调用,该事件调用在IE8及以下版本中不起作用。 OldIE需要调用detachEvent ,而类型则需要使用“ on”前缀,例如“ onclick”。 但是,如果您支持oldIE,则可能使用的是jQuery或您自己的自定义事件处理程序。

如果您需要一些灵活性,例如,您只想摘机某些事件类型或在不同的条件(例如两次或多次单击)之后删除该处理程序,则自动删除处理程序可能是最佳选择。

一次性事件创建功能

像我一样,您可能太懒惰或健忘,无法向每个处理函数添加事件删除行。 让我们创建一个onetime函数,它的辛勤工作为我们:

// create a one-time event
function onetime(node, type, callback) {

	// create event
	node.addEventListener(type, function(e) {
		// remove event
		e.target.removeEventListener(e.type, arguments.callee);
		// call handler
		return callback(e);
	});

}

现在,只要需要一次性事件,就可以使用此功能:

// one-time event
onetime(document.getElementById("myelement"), "click", handler);

// handler function
function handler(e) {
	alert("You'll only see this once!");
}

尽管您不必在每个页面中都需要一次性事件,但是很高兴发现有一些可供JavaScript开发人员使用的选项。

From: https://www.sitepoint.com/create-one-time-events-javascript/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一次性函数(Immediately Invoked Function Expression,IIFE)是一种在声明时立即执行的JavaScript函数。这种函数通常用于在不污染全局命名空间的情况下,创建一个私有作用域来执行一些代码。 IIFE的基本语法如下: ``` (function() { // 这里是函数体 })(); ``` 在这个示例,我们定义了一个匿名函数并立即执行它。由于这个函数是匿名的,我们不能直接调用它。因此,我们使用括号将函数包装起来,并在末尾添加另一个括号来立即执行它。 IIFE常用于创建私有变量和函数,以及在JavaScript模拟块级作用域。例如,以下代码使用IIFE来创建一个私有作用域,并在其定义一个私有变量`counter`,并暴露一个公共方法`increment`,用于增加计数器的值: ``` var counter = (function() { var count = 0; return { increment: function() { count++; console.log(count); } }; })(); counter.increment(); // 输出1 counter.increment(); // 输出2 counter.increment(); // 输出3 ``` 在这个示例,我们定义了一个匿名函数并立即执行它,该函数返回一个对象,其包含一个名为`increment`的方法。该方法在每次调用时将`count`变量增加1,并将当前计数器值输出到控制台。由于我们只暴露了`increment`方法,因此`count`变量是私有的,并且不能直接访问。每次调用`increment`方法时,都会在私有作用域内增加计数器的值,并将其输出到控制台。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值