2015-03-05 6 views
-1

Я хочу, чтобы функция ниже работала непрерывно, пока мышь не работает. На данный момент функция выполняется один раз за клик. Я хочу иметь возможность продолжить выполнение функции во время mousedown и остановиться, когда мышь будет выпущена.Продолжайте работать до тех пор, пока мышь не будет отпущена.

$('#md').mousedown(function(e){ 
     var pCords = e.pageY +e.pageY; 
     var max = $(document).height()+$(document).width(); 
      var dg = 2*(pCords/max); 
     $('#div').css({ 'transform':'rotate('+dg+'deg) '}); 
    }); 
+0

Вопрос задан не правильно, и он выдает много нерелевантных ответов. Вы НЕ хотите, чтобы эта функция выполнялась непрерывно, потому что 'e.pageX' и' e.pageY' будут одинаковыми. Вам нужно установить флаги, как упоминалось в более чем шести ответах ниже, и иметь обработчик '$ ('# md'). Mousemove()' где вы будете 1) проверить флаг, установленный в событии mouseup/down 2), новые координаты указателя мыши –

+0

Проверьте мой ответ ниже –

ответ

0

Легкий способ сделать с задержкой по времени между выполнением обработчика событий:

var timerId = 0; 

$('#md').mousedown(function(e){ 
      timerId = setInterval(function() { 
         var pCords = e.pageY +e.pageY; 
         var max = $(document).height()+$(document).width(); 
         var dg = 2*(pCords/max); 
         $('#div').css({ 'transform':'rotate('+dg+'deg) '}); 
       }, 20); // specify the required time delay here 
      }); 

$('#md').mouseup(function(e){ 
     clearInterval(timerId); 
    }); 
+0

Вам определенно не нужен цикл while в этом первом фрагменте кода – peterdotjs

+0

Я его обновил :) – mohamedrias

0

Вы можете сделать это, используя простой семафор. Вот пример:

var lock = true; 

$('#md').mousedown(function() { 
    lock = false; 

    setTimeout(function() { 
     while(!lock) { 
      // Do your stuff here 
     } 
    }, 0); 
}); 

$(document).mouseup(function() { 
    lock = true; 
}); 

Я надеюсь, что это трюк. Функция setTimeout отделяет выполнение функции и создает асинхронный процесс - это делает ваш код неблокирующим.

Я уверен, что есть более сложные способы решения этой проблемы. Просто у меня еще не было моего кофе. :)

0

нравится это? делая глобальную логическую переменную для отслеживания, если мышь вставлена, а затем зацикливание вашей функции, когда мышь находится на этом элементе.

var ismouseup = false; 

$(document).ready(function(){ 
     $('#md').mousedown(function(e){ 
     ismouseup = false; 
     while(!ismouseup) 
     { 
      //do your thing 
     } 
    }); 

    $('#md').mouseup(function(e){ 
     ismouseup = true; 
    } 
}); 

--edit: set ismouseup to true, когда мышь. Прости.

+3

У вас здесь бесконечный цикл. Вы никогда не устанавливаете isMouseUp в true. Когда-либо. – David

+1

Этот метод не будет работать, потому что цикл while while блокирует выполнение, поэтому обработчик mouseup никогда не будет вызван. –

+0

ах. то тогда будет делать трюк? settimeout удалит блок выполнения цикла? –

1

Этот вопрос был рассмотрен в: jQuery continuous mousedown

Он будет включать в себя создание флага, который вы можете установить к истине, когда происходит первое событие MouseDown и вызова функции, которая финиширует только после того, как установлен флаг обратно false, когда происходит событие mouseup.

+0

спасибо. хорошая информация ... – Fergoso

0

Вы можете использовать SetTimeout. Это будет работать раз в 1 сек, когда MouseDown

$('#md').on({ 
     mousedown: function() { 
      $(this).data('clicked', true); 
      var process = function() { 
       if ($(this).data('clicked')) { 
        // Do your stuff 
        setTimeout(process, 100); 
       } 
      }; 
      process(); 
     }, 
     mouseup: function() { 
      $(this).data('clicked', false); 
     } 
    }); 
+0

спасибо. Я обновил jsFiddle, используя ваш метод. (отправлено другим человеком здесь) Кажется, проблема?http://jsfiddle.net/kacjd8dc/1/ – Fergoso

0

В качестве опции можно установить обработчик для mousemove в mousedown и удалить в mouseup как в коде

function movehandler(e) { 
    var pCords = e.pageY + e.pageY; 
    var max = $('#md').height(); 
    var dg = 20 * (pCords/max); 
    $('#md').css({ 
     'transform': 'rotate(' + dg + 'deg) ' 
    }); 
} 
$('#md').mousedown(function (e) { 
    $('body').on('mousemove', movehandler); 
}); 
$('#md').mouseup(function (e) { 
    $('body').off('mousemove'); 
}); 
$('body').mouseleave(function (e) { 
    $('body').off('mousemove'); 
}); 

Jsfiffle Пример не идеально написано, но вы можете получить идею

EDIT: Обратите внимание, что $('body').on('mousemove', может быть недостаточно в зависимости от вашей разметки.

+0

спасибо, хорошо выглядит ... – Fergoso

+0

проблема в том, что стоп-стоп реагирует, когда мышь находится вдали от красного сквайра, хотя мышь все еще опустилась. Я ищу способ сохранить функцию, как только мышь нажата и остановится только после ее выпуска. – Fergoso

+0

Но вы соглашаетесь, что обработчик 'mousedown' не решает проблему, правильно? ;) –

Смежные вопросы