2

我需要将“点击”事件委托给自定义元素中的关闭按钮,然后调用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');
    }
  }
});
<template id="settings-pane">
  <button class="close">✖&lt;/button>
</template>

4

2 回答 2

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

于 2016-01-28T11:08:48.267 回答
1

在处理了几个月后,解决这个问题的最佳方法是创建另一个“伪”,类似于: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(); 
        }
    }
});
于 2016-01-18T19:55:01.143 回答