Как я могу использовать синхронизацию JavaScript для управления остановкой мыши и событиями перемещения мыши

StackOverflow https://stackoverflow.com/questions/219322

  •  03-07-2019
  •  | 
  •  

Вопрос

Итак, у меня есть элемент управления (карта) на странице aspx. Я хочу написать некоторый JavaScript для настройки загрузки следующим образом:

<Ол>
  • когда мышь останавливается на элементе управления = некоторый код

  • когда мышь двигается = некоторый код (но только если движение длиннее 250 милсекунд)

  • Это работает для запуска кода при остановке, а затем при движении ...

    function setupmousemovement() {
    var map1 = document.getElementById('Map_Panel');
    var map = document.getElementById('Map1');
    map1.onmousemove = (function() {
        var onmousestop = function() {
                //code to do on stop
        }, thread;
    
        return function() {
            //code to do on mouse move
            clearTimeout(thread);
            thread = setTimeout(onmousestop, 25);
        };
        })();
    };
    

    Но я не могу понять, как ввести задержку в код на ходу. Я думал, что у меня это с этим ...

    function setupmousemovement() {
    var map1 = document.getElementById('Map_Panel');
    var map = document.getElementById('Map1');
    map1.onmousemove = (function() {
        var onmousestop = function() {
                //code to do on stop
                clearTimeout(thread2);
        }, thread;
    
        return function() {
            thread2 = setTimeout("code to do on mouse move", 250);
            clearTimeout(thread);
            thread = setTimeout(onmousestop, 25);
        };
        })();
    };
    

    Но он не ведет себя так, как я думал. На ходу " резьба2 " остановка никогда не очищается Чего мне не хватает?

    Это было полезно?

    Решение

    Это сложно. Немного переделок привело к этому:

    function setupmousemovement() {
    
      var map1 = document.getElementById('Map_Panel');
      map1.onmousemove = (function() {
        var timer,
            timer250,
            onmousestop = function() {
    
              // code to do on stop
    
              clearTimeout( timer250 ); // I'm assuming we don't want this to happen if mouse stopped
              timer = null;  // this needs to be falsy next mousemove start
            };
        return function() {
          if (!timer) {
    
            // code to do on start
    
            timer250 = setTimeout(function () { // you can replace this with whatever
    
              // code to do when 250 millis have passed
    
            }, 250 );
          }
          // we are still moving, or this is our first time here...
          clearTimeout( timer );  // remove active end timer
          timer = setTimeout( onmousestop, 25 );  // delay the stopping action another 25 millis
        };
    
      })();
    
    };
    

    Причина, по которой ваш код не работает, состоит в том, что при перемещении мыши происходит многократное срабатывание мыши, и вы каждый раз запускаете новые таймауты.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top