![](/img/trans.png)
[英]Is it possible to remove input type=file selections with JavaScript?
[英]Type of selections
我正在尝试将突出显示的菜单悬停在具有以下属性的选择上:
除了一件事之外,所有其他方法都运行良好:如果单击现有选择,则选择消失,悬停菜单也应消失。 但是无论出于什么原因,它都不是。
在现有选择之外单击时,如果单击该选择,则选择类型将变为“插入符号”或“无”。 因此,我尝试根据类型设置菜单的可见性。 问题是,尽管通过window.getSelection()获得的对象中选择的类型似乎发生了变化,但是如果您尝试从对象中获取类型 ,则不会。
我将这个jsfiddle放在一起来说明问题。 https://jsfiddle.net/nxo2d7ew/1/
var el = document.getElementById("simple-text");
el.addEventListener("mouseup", placeDiv, false);
function placeDiv(x_pos, y_pos) {
var sel = window.getSelection();
var position = sel.getRangeAt(0).getBoundingClientRect();
// console.log(sel)
// console.log(position)
var highlighter = document.getElementById('highlighter').offsetWidth
var d = document.getElementById('highlighter');
d.style.left = position.left+position.width*0.5-highlighter*0.5 +'px';
d.style.top = position.top-50 +'px';
// console.log('sel.type: ' + sel.type)
var test = window.getSelection()
console.log(test) // returns an object with "type: None"
console.log(test.type) //returns "Range"
if (test.type !== 'Range') {
d.style.visibility = 'hidden';
}
else {
d.style.visibility = 'visible';
}
var sel = ''
}
谢谢 :-)
对选择的真正更改实际上不会在mouseup
事件上发生。 此后还有另一步更改选择,因此,当启动mouseup
时,选择尚未更改。 在控制台中看到的不是mouseup
事件中选择对象的确切状态。
我不确定是否有跨浏览器的方式可以访问真正的选择更改事件,Chrome中有一个selectionchange
事件,理应在IE中(但我无法对其进行测试)。 但是在Firefox中不可用。 就是说,用于测试是否为空选择的type
属性似乎在Firefox上也不起作用。 但是您可以使用isCollapsed
。
解决超时问题的一种方法(虽然不是最优雅的方法)是使用超时,您只需要花费几毫秒的时间即可更新选择内容,那么您的逻辑就可以了-使用isCollapsed使它在Firefox上可以工作。 像这样:
setTimeout(function(){
var test = window.getSelection()
console.log(test) // returns an object with "type: None"
console.log(test.type) //returns "Range"
if (test.isCollapsed) {
d.style.visibility = 'hidden';
}
else {
d.style.visibility = 'visible';
}}, 25);
https://jsfiddle.net/q1f4xfw9/6/
或通过Chrome中的selectionchange
事件,将隐藏条件移到该处理程序中。 像这样:
document.addEventListener("selectionchange", function () {
var d = document.getElementById('highlighter');
var test = window.getSelection()
if (test.type !== 'Range') {
d.style.visibility = 'hidden';
}
});
https://jsfiddle.net/q1f4xfw9/5/
编辑:
还有另一种解决问题的方法,您可以使用removelAllRanges
在鼠标按下时删除选择。 然后,将在mouseup
之前触发选择更改事件。 由您自己决定功能上的微小变化是否可以满足您的需求。 像这样:
el.addEventListener("mousedown", function(e){
window.getSelection().removeAllRanges()
}, false);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.