聚合物 - 无法单击元素外部的事件来关闭自身
Polymer - can not click event outside of element to close itself
聚合物 1.*
我不得不编写自己的下拉菜单。当用户在元素外部单击时,我需要关闭菜单。但是,当用户在元素外部单击时,我无法捕获事件,因此我无法关闭菜单。
知道我做错了什么吗?
编辑:我正在研究 paper-menu-button,当我在元素外部单击时它会关闭 paper-listbox....但我看不到它捕获该事件的任何地方 https://github.com/PolymerElements/paper-menu-button/blob/master/paper-menu-button.js#L311
<dom-module id="sp-referrals-reservations-dropdown">
<template>
<style include="grid-dropdown-styles">
</style>
<div id="dropdown" class="grid-dropdown">
<paper-listbox>
<div class="grid-dropdown-item">Convert to stay</div>
<div class="grid-dropdown-item">Cancel reservation</div>
<div class="grid-dropdown-item">Delete reservation</div>
</paper-listbox>
</div>
</template>
<script>
(function() {
'use strict';
Polymer({
is: 'sp-referrals-reservations-dropdown',
behaviors: [Polymer.IronControlState],
properties: {
},
listeners: {
'tap': '_close',
'click': '_close',
'blur': '_close',
'focusout': '_close',
'focusChanged': '_close',
'focus-changed': '_close',
'active-changed': '_close',
'activeChanged': '_close',
'iron-activate': '_close',
'ironActivate': '_close',
},
open: function(e) {
},
_close: function() {
console.log('aaa');
this.$.dropdown.style.display = "none";
},
});
})();
</script>
</dom-module>
我不确定,它是否足够,但是如果你用 parent-element
包裹 sp-referrals-reservations-dropdown
元素,那么你可以像它的 [=45] 一样收听 parent-element 事件=].
<parent-element></parent-element>
<dom-module id="parent-element">
<template>
<style>
:host {
display:block;
background:green;
width:100%;
height:100vh; }
</style>
<sp-referrals-reservations-dropdown id="spref"></sp-referrals-reservations-dropdown>
在 parent 的脚本中:
Polymer({is:'parent-element', properties:{},
listeners:{ 'tap': '_taped'},
_taped:function(t){
this.$.spref._close();
}
});
这个_taped
函数将调用child的_close
函数。希望它的帮助。
- 以防万一。我们可以开发这个。
编辑
将您的元素包装到 paper-dialog 中。在 ready:function()
调用
this.$.dialog.open()
然后当你 click
在元素之外。 paper-dialog
会自动关闭。
仅供参考,您无法使其正常工作,因为自定义元素不会侦听其自身封装之外的事件,除非您明确将它们连接起来这样做......如果您这样做,您不能使用 Polymer 的 built-in 事件处理。
所以这样的事情会起作用:
// Insert this somewhere it'll get run once attached to the DOM
// This line keeps clicks within your element from closing the dropdown
this.shadowroot.addEventListener('click', (event) => { event.stopPropagation(); });
// And this listens for any click events that made it up to body, and closes the element
document.querySelector('body').addEventListener('click', this._close);
或者,至少,我是这么认为的。聚合物元素要么通过绑定到不同的事件(模糊?),要么通过让父元素触发一个点击事件告诉子元素关闭。
聚合物 1.*
我不得不编写自己的下拉菜单。当用户在元素外部单击时,我需要关闭菜单。但是,当用户在元素外部单击时,我无法捕获事件,因此我无法关闭菜单。
知道我做错了什么吗?
编辑:我正在研究 paper-menu-button,当我在元素外部单击时它会关闭 paper-listbox....但我看不到它捕获该事件的任何地方 https://github.com/PolymerElements/paper-menu-button/blob/master/paper-menu-button.js#L311
<dom-module id="sp-referrals-reservations-dropdown">
<template>
<style include="grid-dropdown-styles">
</style>
<div id="dropdown" class="grid-dropdown">
<paper-listbox>
<div class="grid-dropdown-item">Convert to stay</div>
<div class="grid-dropdown-item">Cancel reservation</div>
<div class="grid-dropdown-item">Delete reservation</div>
</paper-listbox>
</div>
</template>
<script>
(function() {
'use strict';
Polymer({
is: 'sp-referrals-reservations-dropdown',
behaviors: [Polymer.IronControlState],
properties: {
},
listeners: {
'tap': '_close',
'click': '_close',
'blur': '_close',
'focusout': '_close',
'focusChanged': '_close',
'focus-changed': '_close',
'active-changed': '_close',
'activeChanged': '_close',
'iron-activate': '_close',
'ironActivate': '_close',
},
open: function(e) {
},
_close: function() {
console.log('aaa');
this.$.dropdown.style.display = "none";
},
});
})();
</script>
</dom-module>
我不确定,它是否足够,但是如果你用 parent-element
包裹 sp-referrals-reservations-dropdown
元素,那么你可以像它的 [=45] 一样收听 parent-element 事件=].
<parent-element></parent-element>
<dom-module id="parent-element">
<template>
<style>
:host {
display:block;
background:green;
width:100%;
height:100vh; }
</style>
<sp-referrals-reservations-dropdown id="spref"></sp-referrals-reservations-dropdown>
在 parent 的脚本中:
Polymer({is:'parent-element', properties:{},
listeners:{ 'tap': '_taped'},
_taped:function(t){
this.$.spref._close();
}
});
这个_taped
函数将调用child的_close
函数。希望它的帮助。
- 以防万一。我们可以开发这个。
编辑
将您的元素包装到 paper-dialog 中。在 ready:function()
调用
this.$.dialog.open()
然后当你 click
在元素之外。 paper-dialog
会自动关闭。
仅供参考,您无法使其正常工作,因为自定义元素不会侦听其自身封装之外的事件,除非您明确将它们连接起来这样做......如果您这样做,您不能使用 Polymer 的 built-in 事件处理。
所以这样的事情会起作用:
// Insert this somewhere it'll get run once attached to the DOM
// This line keeps clicks within your element from closing the dropdown
this.shadowroot.addEventListener('click', (event) => { event.stopPropagation(); });
// And this listens for any click events that made it up to body, and closes the element
document.querySelector('body').addEventListener('click', this._close);
或者,至少,我是这么认为的。聚合物元素要么通过绑定到不同的事件(模糊?),要么通过让父元素触发一个点击事件告诉子元素关闭。