Javascript 双击时从对话框中选择文件时避免鼠标悬停事件

Javascript 双击时从对话框中选择文件时避免鼠标悬停事件,javascript,jquery,html,firefox,mouseup,Javascript,Jquery,Html,Firefox,Mouseup,我在我的网页中有一个输入[type=file],当文件对话框打开,我通过双击选择一个文件时,会触发mouseup事件。但是,如果我选择文件,然后单击“打开”按钮进行选择,则没有额外的事件 这种行为是Firefox特有的,我在Chrome、IE和Opera中测试过,没有额外的鼠标点击事件。此外,没有mousedown事件,因此日志将有两个连续的mouseup事件 HTML: 是一把小提琴,你可以看到这种行为。要查看它的实际操作,请确保文件对话框位于JSFIDLE页面的结果框上方 我怎样才能避免这种

我在我的网页中有一个输入[type=file],当文件对话框打开,我通过双击选择一个文件时,会触发mouseup事件。但是,如果我选择文件,然后单击“打开”按钮进行选择,则没有额外的事件

这种行为是Firefox特有的,我在Chrome、IE和Opera中测试过,没有额外的鼠标点击事件。此外,没有mousedown事件,因此日志将有两个连续的mouseup事件

HTML:

是一把小提琴,你可以看到这种行为。要查看它的实际操作,请确保文件对话框位于JSFIDLE页面的结果框上方

我怎样才能避免这种情况?这是一个浏览器错误吗?谷歌搜索没有得到任何有用的结果


编辑:此问题出现在我的Firefox版本32.0.1(Win7 64位)上,但不出现在Linux的Firefox 32.0上

我已经尝试了你的代码。我认为没有标志值是很困难的,因为当双击文件时,在释放第二次单击之前,菜单将关闭,它将触发“MouseUp”事件。 我用flag值解决了这个问题。请看这个

HTML

Java脚本


谢谢你

当我进一步研究这一点时,我意识到这种行为会创建一个在mousedown事件之后不会触发的杂散mouseup事件

mouseup事件总是在mousedown事件之后,这一事实在所有现代浏览器中都是正确的。我发现唯一不正确的情况是IE 5-8中出现双击事件

因此,我使用的解决方案是设置一个标志,表示mousedown事件发生,mouseup事件将发生。该标志应设置为true

例如:

var mousedown = false;

jQuery(document).mousedown(function (e) {
    mousedown = true;
});

jQuery(document).mouseup(function (e) {
    if (!mousedown) { // Stray mouseup event detected, handle it with 
        /*
        e.preventDefault();
        e.stopPropagation();
        */
    }
    mousedown = false;
});

也许你可以使用其中一个来表示它是对话框?我查看了e的属性,但没有看到一些有用的东西可以从双击中检测它,或者在文件对话框关闭后检测它。一个狡猾的修复方法可能是在显示对话框时解绑鼠标,在对话框关闭时重新绑定。不过,我不确定它是否有效。
jQuery(document).mouseup(function(e) {
    //...
});
<input type="file" id='file1'/>
<div id="log"></div>
var flag;
$(document).mouseup(function(e) {

    if(e.target.id != 'file1' && flag==1){
        flag = 0;
    }
    else if(e.target.id == 'file1'){
        flag = 1;        
        $('#log').prepend('mouseup: ' + (new Date()).toString() + '<br/>');
    }
    else{
        flag = 0;
        $('#log').prepend('mouseup: ' + (new Date()).toString() + '<br/>');
    }
});

$(document).mousedown(function(e) {

    $('#log').prepend('mousedown: ' + (new Date()).toString() + '<br />');

});
var mousedown = false;

jQuery(document).mousedown(function (e) {
    mousedown = true;
});

jQuery(document).mouseup(function (e) {
    if (!mousedown) { // Stray mouseup event detected, handle it with 
        /*
        e.preventDefault();
        e.stopPropagation();
        */
    }
    mousedown = false;
});