我需要委托一个' 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;
答案 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();
}
}
});