在javascript中,是否可以保存点击触发器并在以后重新应用?

时间:2011-04-24 08:22:30

标签: javascript html5 dom javascript-events

动态页面。希望禁用并稍后重新启用部分。在视觉上它们是灰色的,但需要阻止用户使用该部分直到稍后。

对于使用点击触发器的元素,希望:

  • 在属性
  • 中保存当前的点击触发器
  • 删除当前的点击触发器
  • 添加no-defaults和no-propigates
  • 的触发器

重新启用:

  • 摆脱无默认触发器
  • 重新应用之前保存的触发器
  • 清除保存的属性

到目前为止的回复:

猜想:使用纯javascript html5级别,没有委托或其他一些外部机制,无法从元素中提取点击触发器。


解决方案

非常受到代表团的诱惑 - 并且由于无法阻止内存泄漏而被击败。无论如何,最终还是通过一个简单的gc来完成这项任务。

使用(add | push | pop | remove)PopableEventListener扩展(添加|删除)EventListener,使代码更改变得微不足道。允许我将监听器推送到任何级别 - 除了启用/禁用之外,还可以进行表单上下文更改。

来源:http://code.google.com/p/chess-spider/source/browse/http/scripts/popable.js

doc:http://code.google.com/p/chess-spider/wiki/PopableEventListener?ts=1303738300&updated=PopableEventListener

编辑

与我所看到的大多数情况相反,在dom中访问监听器的能力将是一项重大的好处。除了能够理智地禁用重新启用之外,将它们强制进入不同范围的能力将非常有用。

4 个答案:

答案 0 :(得分:1)

为什么不将每个onclick的启用状态保存到数组中,然后在每次调用时检查该数组,如果状态为false,只返回而不运行任何内容,这也可以帮助跟踪灰化的内容。

以下是我的想法:http://jsfiddle.net/mazzzzz/MXEjv/1/ 它有点乱,但两个顶级功能是重要的。第一个将切换(基于类),第二个将说明元素的onclick是否已启用(再次按类)。只要确保对象具有相同的类,一个将影响另一个,反之亦然。或者,你可以传入id,而不是使用类(就像我做的那样) 希望有所帮助。

答案 1 :(得分:1)

我认为你在谈论添加和删除监听器。您可以通过多种方式执行此操作,如果您只有一个事件侦听器,则最简单的方法是将其添加为元素的属性。要删除它,只需指定null:

function sayHi() {
  alert('hi');
}

// Add a listener
var someElement = document.getElementById('someElementID');
someElement.onclick = sayHi;

// Remove it
someElement.onclick = null;

如果事件需要多个侦听器,则可以使用其他方案,例如 addEventListener attachEvent

当然,你可以只跟踪元素的状态(例如在类或对象中),然后监听器可以根据状态做出响应。

答案 2 :(得分:1)

课程怎么样?像

这样的东西
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-*属性(link

答案 3 :(得分:1)

处理数百个触发器的最佳方法是使用event delegation

然后检查每次点击是否与您的触发器匹配。如果它是禁用部分的孩子,则放弃点击。

jQuery实现如下所示:

$('.trigger', document.body).live('click', function(e) {
  var target = $(e.target);
  if (target.parents('.disabled').length > 0) {
    // handle click
  }
});

显然,您可以使用其他框架或纯JavaScript,最适合您。