如何在Javascript中只执行一次事件处理程序
How to execute event handler only once in Javascript?
我正在创建一个按钮,它允许进入帖子部分。我正在检查主体是否有类"已登录"。如果test为false,我想为消息"Youhavelogi-in"创建div容器,并将其附加到我的节中我的问题:每次单击此按钮时,都会附加新节点。-如何只调用一次处理程序?
if( !isOnline ) {
e.preventDefault();
var divForLog = document.createElement('div'),
linkElement = document.createElement('a');
linkElement.setAttribute('href', 'http://domain/login');
linkElement.text = "log in"
divForLog.innerHTML = "You have to ";
divForLog.appendChild(linkElement);
document.getElementById('last_questions').appendChild(divForLog);
}
有几个潜在的解决方案,但我在这里只列出几个。
"全局"
在创建处理程序的作用域中创建一个变量var loginShown
。然后,在if语句中将! isOnline
检查更改为! isOnline && ! loginShown
,并在附加div后设置loginShown = true
篡改DOM
根据#last_questions
的其他内容,您可以简单地使用测试登录元素是否已经附加
if ( ! document.getElementById('last_questions').querySelector('div > a[href="http://domain/login"]' ) ) {
...
}
如果做不到这一点,您可以按照注释中提到的@NewToJS操作,并向父级添加一个可以测试的属性(一旦添加了div),例如ID或data-
属性。
取消绑定事件
如果您使用的是jQuery,那么就更容易了,正如@Pawel所提到的,您可以在添加div后简单地解除事件绑定。可能是最干净的解决方案,但实施起来也更棘手。它还取决于处理程序正在执行的其他操作。
尝试将属性id
设置为您的div
(在我的示例中为container
),当用户click
检查文档中是否已经存在具有id
的元素时,如果不添加它:
if( !isOnline && document.getElementById('container').length==0) {
e.preventDefault();
var divForLog = document.createElement('div'),
linkElement = document.createElement('a');
linkElement.setAttribute('href', 'http://domain/login');
linkElement.text = "log in"
divForLog.innerHTML = "You have to ";
divForLog.appendChild(linkElement);
divForLog.setAttribute('id', 'container'); //Add id attribute
document.getElementById('last_questions').appendChild(divForLog);
}
希望这能有所帮助。
如果您正在使用jQuery,您可以做一些事情(从documentation.one|jQuery)。
$("#button" ).one( "click", function() {
var divForLog = document.createElement('div'),
linkElement = document.createElement('a');
linkElement.setAttribute('href', 'http://domain/login');
linkElement.text = "log in"
divForLog.innerHTML = "You have to ";
divForLog.appendChild(linkElement);
document.getElementById('last_questions').appendChild(divForLog);
});
然而,我可以想到的另一种方法是使用jQuery的
$('#last_questions').html(divForLog);
更新
如果这不是一个选项(很可能,因为#last_questionsdiv可能包含其他内容),您可以创建一个<div id="log-in-alert"></div>
,它将位于#last_questions
中,并且只替换这个中的html
希望我能帮忙??
- 引导程序崩溃一次只能看到一个
- 在Angular应用程序中每个帖子投票一次
- 谷歌图表在运行应用程序时只能显示一次
- Angular.js指令格式化程序只调用过一次,或者如何告诉ngModel表现得像watchCollection
- 在谷歌应用程序脚本中,如何在满足条件的情况下只发送一次电子邮件
- Chrome扩展程序:浏览器操作单击按钮工作一次
- 您可以在节点.js上一次运行多个应用程序吗?
- iOS cordova应用程序中的文本区域只接受一次输入
- 在单页web应用程序中一次只显示特定的表单
- 页面上有两个jQuery应用程序,一次只能运行一个
- 引导程序警报只起作用一次
- 如何只调用一次事件处理程序,而不是每次单击项目时调用事件处理程序
- 我想单击一个按钮,一次只执行已经制作的程序中的一行代码.(JavaScript)
- Jquery 只为我在第 Asp.net 页上显示的引导程序警报工作一次
- 如何创建只能单击一次的点击处理程序
- Chrome 扩展程序,每分钟刷新一次页面,并在每次刷新时运行 (javascript) 脚本
- Angular 提供程序服务需要 init 函数运行一次
- 我的按钮的 jQuery 事件处理程序只工作一次
- 更改事件处理程序只触发一次,jQuery
- 每5秒调用一次程序命令