如何select iron中的多个元素-select或通过鼠标拖动
How to select multiple elements in iron-selector by mouse drag
如何通过单击、按住并拖动鼠标,甚至用鼠标绘制一个矩形,然后 select 遍历所有 select iron-selector
中的多个项目它下面的项目?
我使用 Polymer 1.11.3 和 iron-select或 2.1.0,阅读文档没有提供明显的解决方案。
这是我要在其中启用拖动的实际元素-selection:
我的目标是能够点击例如星期日 7,拖动鼠标到 15,松开点击,有 7-15 selected.
您可以 select iron-selector
中具有 multi
属性的多个项目:
<iron-selector attr-for-selected="name" selected-items = "{{selected}}" multi>
<div name="foo">Foo</div>
<div name="bar">Bar</div>
<div name="zot">Zot</div>
</iron-selector>
所选项目将是 selected
属性 处的数组。
为了能够 select 我的鼠标单击和拖动,请执行以下操作:
将 css 属性 user-select: none;
设置为包含 select 可用物品的元素。
将 on-track="handleTrack"
添加到包含 select 可用项目的元素。
将此 div 放在您的元素中的某处:<div id="selectionBox" style="position:absolute; top:0; left:0; height:0; width:0; border:2px solid #000; background-color:rgba(128, 128, 128, 0.3); z-index:999;"></div>
然后,将这些函数添加到您的元素中:
handleTrack: function(e) {
switch(e.detail.state) {
case "start":
this.x1 = e.detail.x;
this.y1 = e.detail.y;
this.drawRectangle(this.x1, this.y1, this.x2, this.y2);
break;
case "track":
this.x2 = e.detail.x;
this.y2 = e.detail.y;
this.drawRectangle(this.x1, this.y1, this.x2, this.y2);
break;
case "end":
this.x2 = e.detail.x;
this.y2 = e.detail.y;
this.drawRectangle(0, 0, 0, 0);
this.selectRectangle(e);
break;
}
},
drawRectangle: function(x1, y1, x2, y2) {
this.$.selectionBox.style.left = x1 + 'px';
this.$.selectionBox.style.top = y1 + 'px';
this.$.selectionBox.style.width = (x2 - x1) + 'px';
this.$.selectionBox.style.height = (y2 - y1) + 'px';
},
selectRectangle: function(e) {
var tol = 20;
var ironSelectors = Polymer.dom(e.currentTarget).querySelectorAll("iron-selector");
ironSelectors.forEach(function(selector) {
selector.items.forEach(function(i) {
var el = i.getBoundingClientRect();
if ((el.left+tol >= this.x1) && (el.top+tol >= this.y1) && (el.right-tol <= this.x2) && (el.bottom-tol <= this.y2)) {
selector.select(i.value);
}
}.bind(this));
}.bind(this));
}
如果您有多个 iron-selector
,此代码也有效。
如何通过单击、按住并拖动鼠标,甚至用鼠标绘制一个矩形,然后 select 遍历所有 select iron-selector
中的多个项目它下面的项目?
我使用 Polymer 1.11.3 和 iron-select或 2.1.0,阅读文档没有提供明显的解决方案。
这是我要在其中启用拖动的实际元素-selection:
我的目标是能够点击例如星期日 7,拖动鼠标到 15,松开点击,有 7-15 selected.
您可以 select iron-selector
中具有 multi
属性的多个项目:
<iron-selector attr-for-selected="name" selected-items = "{{selected}}" multi>
<div name="foo">Foo</div>
<div name="bar">Bar</div>
<div name="zot">Zot</div>
</iron-selector>
所选项目将是 selected
属性 处的数组。
为了能够 select 我的鼠标单击和拖动,请执行以下操作:
将 css 属性
user-select: none;
设置为包含 select 可用物品的元素。将
on-track="handleTrack"
添加到包含 select 可用项目的元素。将此 div 放在您的元素中的某处:
<div id="selectionBox" style="position:absolute; top:0; left:0; height:0; width:0; border:2px solid #000; background-color:rgba(128, 128, 128, 0.3); z-index:999;"></div>
然后,将这些函数添加到您的元素中:
handleTrack: function(e) {
switch(e.detail.state) {
case "start":
this.x1 = e.detail.x;
this.y1 = e.detail.y;
this.drawRectangle(this.x1, this.y1, this.x2, this.y2);
break;
case "track":
this.x2 = e.detail.x;
this.y2 = e.detail.y;
this.drawRectangle(this.x1, this.y1, this.x2, this.y2);
break;
case "end":
this.x2 = e.detail.x;
this.y2 = e.detail.y;
this.drawRectangle(0, 0, 0, 0);
this.selectRectangle(e);
break;
}
},
drawRectangle: function(x1, y1, x2, y2) {
this.$.selectionBox.style.left = x1 + 'px';
this.$.selectionBox.style.top = y1 + 'px';
this.$.selectionBox.style.width = (x2 - x1) + 'px';
this.$.selectionBox.style.height = (y2 - y1) + 'px';
},
selectRectangle: function(e) {
var tol = 20;
var ironSelectors = Polymer.dom(e.currentTarget).querySelectorAll("iron-selector");
ironSelectors.forEach(function(selector) {
selector.items.forEach(function(i) {
var el = i.getBoundingClientRect();
if ((el.left+tol >= this.x1) && (el.top+tol >= this.y1) && (el.right-tol <= this.x2) && (el.bottom-tol <= this.y2)) {
selector.select(i.value);
}
}.bind(this));
}.bind(this));
}
如果您有多个 iron-selector
,此代码也有效。