简体   繁体   English

如何装饰DO​​M节点的事件处理程序?

[英]How to decorate a DOM node's event handler?

如何装饰DO​​M节点,以便添加事件处理程序,但是在新处理程序中可以调用先前的处理程序?

It depends on how you're adding your handlers, of course, but here's one old-fashioned way: 当然,这取决于您如何添加处理程序,但是这是一种老式的方式:

function addClickHandler(nodeId, handler) {
  var node = document.getElementById(nodeId), old = node.onclick;
  node.onclick = function() {
    handler(old);
  }
}

Your handler function would check it's parameter to see if it's not null. 您的处理程序函数将检查其参数以查看其是否不为null。

You could of course get as fancy as you wanted to here. 您当然可以按照自己的意愿来这里。 Note that most Javascript frameworks actually don't give your event handlers much information about other handlers. 请注意,大多数Javascript框架实际上并没有为事件处理程序提供有关其他处理程序的大量信息。 Generally it's a fragile pattern to work with that sort of relationship, but I suppose if you set out with a design that regularizes tthe handler setup, it could work fine. 通常,使用这种关系是一种脆弱的模式,但是我想,如果您采用的是规范化处理程序设置的设计,那么它可以很好地工作。

I assume that you are binding events in the way element.onclick = function () {}; 我假设您以element.onclick = function () {};的方式绑定事件element.onclick = function () {}; .

Yes, you can make a function that wraps previous event handlers and execute them sequentially, eg: 是的,您可以创建一个包装以前的事件处理程序并按顺序执行的函数,例如:

function addEvent(el, event, handler) {
  var oldEvent = el['on'+event];
  if (typeof oldEvent != 'function') {
    el['on'+event] = handler;
  } else {
    el['on'+event] = function() {
      oldEvent();
      handler();
    }
  }
}

var el = document.getElementById('el');
addEvent(el, 'click', function () { alert('1'); });
addEvent(el, 'click', function () { alert('2'); });

Check the above example here . 此处检查以上示例。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM