Почему Chrome поднимает mousemove на mousedown?

Я заметил, что в Chrome (я использую Chrome 35.0.1916.114 [ UPDATE: также появляется в "35.0.1916.153 m" ], 64-разрядная версия Windows 7), когда я нажимаю налево кнопка не только событие mouseDown, поднятое (как я ожидаю), но и mouseMove.

В эта скрипка, если вы щелкнете по элементу ввода, вы увидите "D" для каждого поднятого события mouseDown и "M" для каждый mouseMove.

HTML:

<input id="txt" type="text"/>
<p>Moves</p><p id="moves">0</p>
<p>Downs</p><p id="downs">0</p>
<p id="activity">Activity</p>

JS:

$( "#txt" ).mousedown(function() {
     document.getElementById("activity").innerHTML +="D";
    update(false,true);
});
$( "#txt" ).mousemove(function() {
    document.getElementById("activity").innerHTML +="M";
    update(true,false);
});

function update(move, down) 
{
    var moves=document.getElementById("moves").innerHTML;
    if (move) 
    {
        moves ++;
        document.getElementById("moves").innerHTML=moves;
    }

    var downs=document.getElementById("downs").innerHTML;
    if (down) 
    {
        downs ++;
        document.getElementById("downs").innerHTML=downs;
    }
    var d=parseInt(downs);
    var m=parseInt(moves);
    if ((d+m)%25==0)
    {
        document.getElementById("activity").innerHTML +="<br>";
    }
}

В FF и IE11, когда курсор находится во входном элементе, вы сможете получить последовательный "D" (т.е. щелчок вызывает одно событие mouseDown). В Chrome каждый щелчок мыши вызывает события mouseDown и два события mouseMove.

Это не из-за небольшого колебания мыши, поскольку я использую трекбол, поэтому курсор абсолютно неподвижен.

Кто-нибудь знает об обходном пути для этого?

Спасибо Dave

Ответ 1

странная проблема действительно, однако с небольшим флагом это можно обойти: http://jsfiddle.net/3a28p7ek/

изменение довольно прямое, установив ignoreNextMove в true на каждую мышь вниз и отменив обработчик перемещения, если этот флаг установлен, после сброса флага, чтобы правильные события перемещения обрабатывались правильно:

ignoreNextMove = false;

$( "#txt" ).mousedown(function() {
    ignoreNextMove = true;
    document.getElementById("activity").innerHTML +="D";    
    update(false,true);
});
$( "#txt" ).mousemove(function() {
        if(ignoreNextMove)
    {
        ignoreNextMove = false;
        return;
    }
    document.getElementById("activity").innerHTML +="M";
    update(true,false);
});