x-tag事件委托:访问根元素

时间:2015-06-17 14:49:17

标签: javascript x-tag

我需要委托一个' tap' event到自定义元素中的关闭按钮,然后在根元素上调用close()方法。这是一个例子:



xtag.register('settings-pane', {
  lifecycle: {
    created: function () {
      var tpl = document.getElementById('settings-pane'),
          clone = document.importNode(tpl.content, true);
      
      this.appendChild(clone);
    }
  },
  events: {
    'tap:delegate(button.close)': function (e) {
      rootElement.close(); // <- I don't know the best way to get rootElement
    }
  },
  methods: {
    close: function () {
      this.classList.add('hidden');
    }
  }
});
&#13;
<template id="settings-pane">
  <button class="close">✖</button>
</template>
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:6)

嘿那里,这是图书馆作者,让我澄清一下:

对于您在DOM,X-Tag或vanilla JS中设置的任何侦听器,您始终可以使用标准属性e.currentTarget来访问侦听器所连接的节点。对于X-Tag,无论您是否使用delegate伪,e.currentTarget始终会引用您的自定义元素:

xtag.register('x-foo', {
  content: '<input /><span></span>',
  events: {
    focus: function(e){
      // e.currentTarget === your x-foo element
    },
    'tap:delegate(span)': function(e){
      // e.currentTarget still === your x-foo element
      // 'this' reference set to matched span element
    }
  }
});

请记住,这是用于访问附加事件监听器的元素的标准API,更多信息请参见:https://developer.mozilla.org/en-US/docs/Web/API/Event/currentTarget

答案 1 :(得分:1)

解决这个问题的最佳方法是在处理它几个月之后,创建另一个&#34;伪&#34;,类似于:delegate()伪,但是以不同的方式调用回调。这会将:descendant()伪添加到xtag:

xtag.pseudos.descendant = {
    action: function descendantAction(pseudo, event) {
        var match,
            target = event.target,
            origin = target,
            root = event.currentTarget;
        while (!match && target && target != root) {
            if (target.tagName && xtag.matchSelector(target, pseudo.value)) match = target;
            target = target.parentNode;
        }
        if (!match && root.tagName && xtag.matchSelector(root, pseudo.value)) match = root;
        return match ? pseudo.listener = pseudo.listener.bind({component: this, target: match, origin: origin}) : null;
    }
};

你可以像:delegate()那样使用它,但this将引用一个对象,该对象又将引用目标元素(与CSS选择器匹配的元素,例如button.close),原点(接收事件的元素)和组件(自定义元素本身)。用法示例:

xtag.register('settings-pane', {
    methods: {
        close: function () {
            this.classList.add('hidden');
        }
    },
    events: {
        'tap:descendant(button.close)': function (e) {
            this.origin;    // <button> or some descendant thereof that was tapped
            this.target;    // <button> element
            this.component; // <settings-pane> element

            this.component.close(); 
        }
    }
});