在javascript中,是否可以保存一个点击触发并在以后重新应用它?
动态页面。希望禁用并稍后重新启用节。从视觉上看,它们是灰色的,但需要防止用户在以后再使用该部分 对于使用点击触发器的元素,希望:在javascript中,是否可以保存一个点击触发并在以后重新应用它?,javascript,html,dom,javascript-events,Javascript,Html,Dom,Javascript Events,动态页面。希望禁用并稍后重新启用节。从视觉上看,它们是灰色的,但需要防止用户在以后再使用该部分 对于使用点击触发器的元素,希望: 在属性中保存当前单击触发 删除当前的点击触发 添加没有默认值和门的触发器 要重新启用: 摆脱无默认触发器 重新应用以前保存的触发器 清除保存它的属性 从迄今为止的答复来看: 推测:使用纯javascript html5级别,没有委托或其他外部机制,不可能从元素中提取点击触发 解决方案 非常受委托的诱惑-由于无法防止内存泄漏而失败。最终还是用一个简单的gc完成了这
- 在属性中保存当前单击触发
- 删除当前的点击触发
- 添加没有默认值和门的触发器
- 摆脱无默认触发器
- 重新应用以前保存的触发器
- 清除保存它的属性
解决方案 非常受委托的诱惑-由于无法防止内存泄漏而失败。最终还是用一个简单的gc完成了这项工作 使用(add | push | pop | remove)PopableEventListener扩展(add | remove)EventListener,使代码更改变得微不足道。允许我将侦听器推送和弹出到任何级别—对于表单上下文更改来说都是非常好的,而不仅仅是启用/禁用 资料来源: 文件: 社论
与我所看到的大多数情况相反,能够在dom中访问侦听器将是一个巨大的好处。除了能够合理地禁用重新启用外,将它们强制到不同的作用域中的能力将非常有用。为什么不将每个onclick的启用状态保存到一个数组中,然后在每次调用时检查该数组,如果状态为false,只需返回而不运行任何操作,这也有助于跟踪哪些内容是灰色的 以下是我的想法: 这有点混乱,但两个最重要的功能是。第一个将切换(基于类),第二个将说明元素的onclick是否已启用(同样是通过类)。只要确保对象具有相同的类,其中一个会影响另一个,反之亦然。或者,您可以只传入id,而不使用类(就像我所做的那样)。
希望这能有所帮助。为什么不将每个onclick的启用状态保存到一个数组中,然后每次调用时检查该数组,如果状态为false,只需返回而不运行任何操作,这也可以帮助跟踪灰显的内容 以下是我的想法: 这有点混乱,但两个最重要的功能是。第一个将切换(基于类),第二个将说明元素的onclick是否已启用(同样是通过类)。只要确保对象具有相同的类,其中一个会影响另一个,反之亦然。或者,您可以只传入id,而不使用类(就像我所做的那样)。
希望这能有所帮助。我想您是在谈论添加和删除侦听器。您可以通过多种方式实现这一点,如果一个事件只有一个侦听器,最简单的方法就是将其添加为元素的属性。要删除它,只需分配null:
function sayHi() {
alert('hi');
}
// Add a listener
var someElement = document.getElementById('someElementID');
someElement.onclick = sayHi;
// Remove it
someElement.onclick = null;
如果一个事件需要多个侦听器,可以使用其他方案,如addEventListener和attachEvent
当然,您可以只跟踪元素的状态(例如在类或对象中),然后侦听器就可以根据状态进行响应。我想您是在谈论添加和删除侦听器。您可以通过多种方式实现这一点,如果一个事件只有一个侦听器,最简单的方法就是将其添加为元素的属性。要删除它,只需分配null:
function sayHi() {
alert('hi');
}
// Add a listener
var someElement = document.getElementById('someElementID');
someElement.onclick = sayHi;
// Remove it
someElement.onclick = null;
如果一个事件需要多个侦听器,可以使用其他方案,如addEventListener和attachEvent
当然,您可以只跟踪元素的状态(比如在类或对象中),然后侦听器就可以根据状态做出响应。类呢?差不多
function act(e) {
var target = e.currentTarget;
if (target.className === 'active') {
//element active, disable it
target.className = 'disabled';
//other stuff
}
else if (target.className === 'disabled') {
//element disabled, enable it
target.className = 'active';
e.preventDefault();
//other stuff
}
}
elem.onclick = act;
你也可以勇敢地使用
data-*
attributes()那么类呢?差不多
function act(e) {
var target = e.currentTarget;
if (target.className === 'active') {
//element active, disable it
target.className = 'disabled';
//other stuff
}
else if (target.className === 'disabled') {
//element disabled, enable it
target.className = 'active';
e.preventDefault();
//other stuff
}
}
elem.onclick = act;
你也可以勇敢地使用
data-*
attributes()处理数百个触发器的最佳方法是使用
然后检查每次单击是否与触发器匹配。如果它是禁用节的子节,则放弃单击
jQuery实现如下所示:
$('.trigger', document.body).live('click', function(e) {
var target = $(e.target);
if (target.parents('.disabled').length > 0) {
// handle click
}
});
显然,您可以根据自己的需要使用其他框架或普通JavaScript。处理数百个触发器的最佳方法是使用 然后检查每次单击是否与触发器匹配。如果它是禁用节的子节,则放弃单击 jQuery实现如下所示:
$('.trigger', document.body).live('click', function(e) {
var target = $(e.target);
if (target.parents('.disabled').length > 0) {
// handle click
}
});
显然,您可以使用其他框架或普通JavaScript,因为它们最适合您。取决于您首先附加它的方式。请显示一些代码。缓存函数并使用
removeEventListener
不起作用?@Felix-通过元素附加。addEventListener('click',func,true)@Zirak-什么是“缓存函数”?在分配侦听器时,不要声明匿名函数,而是命名祝贺。看到答案,我想这不是你想要的最终效果。这取决于你最初是如何附加它的。请显示一些代码。缓存函数并使用removeEventListener
不起作用?@Felix-通过元素附加。addEventListener('click',func,true)@Zirak-什么是“缓存函数”?在分配侦听器时,不要声明匿名函数,而是命名祝贺。看到答案,我想这不是你想要的最终效果。你的方法的问题是重新应用触发器:我需要跟踪每个元素的侦听器。这就是为什么我要先救它!您的方法的问题是重新应用触发器:我需要跟踪每个元素的侦听器。这就是为什么我要先救它@mazzzz-我想可以这样做,但有数百个触发器。有时相同的t