2014-09-12 3 views
0

Я пытаюсь создать простой интерфейс рисования с помощью Jquery, где можно рисовать фигуры в div. Я использую обработчики событий mousedown-mouseup для достижения этой формы. На каждом мышеловке мышь должна нарисовать фигуру на div. Я использую отдельные обработчики для mousedown и mouseup вместо одного щелчка, потому что я хочу сделать фигуру изменчивой до мыши.Mousedown-mouseup создает divs экспоненциально

ПРОБЛЕМА:
В моей fiddle, есть пространство слева, где, когда я захожу каждый клик, чтобы увидеть, сколько формы созданы.
Сначала нажмите, он отлично работает. Я получаю приятную форму. Тем не менее, на последующих попытках, один mousedown-mouseup, кажется, создает больше divs «на заднем плане». Журнал показывает дополнительные div для каждого клика, пока вы видите только одну фигуру для каждого клика.

Интересно, почему это происходит?

JS:

var num=0; 
$('.draw').mousedown(function(e){ 
    var newDiv = null; 
    newDiv = $('<div>').addClass('rec').css({ 
     'top': e.pageY, 
     'left': e.pageX 
    }).appendTo(this); 
    $(this).mouseup(function(){ 
     num++ 
     $('.elems').append($('<p>').text('rec '+num)); 

    }); 
}); 

ответ

3

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

var num=0; 
$('.draw') 
    .mousedown(function(e){ 
     var newDiv = null; 
     newDiv = $('<div>').addClass('rec').css({ 
      'top': e.pageY, 
      'left': e.pageX 
     }).appendTo(this); 
    }) 
    .mouseup(function(){ 
     num++; 
     $('.elems').append($('<p>').text('rec '+num)); 
    }) 
; 
+0

Спасибо. Это работает. Я думаю, что по какой-то причине поместите «мышь» внутрь, но поскольку это создает некоторый конфликт, я просто иду с этим. – qtgye

+0

О, кстати. Причина, по которой я сделал свой код, - это то, что в 'mouseup' я пытаюсь использовать переменную, созданную в' mousedown'. Эта переменная не будет доступна, если я подключу 'mouseup', так как он локально создан в' mousedown'. – qtgye

+0

Если вы планируете назначить его внутри события mousedown для доступа к созданному div, я бы посоветовал использовать вторую «глобальную» переменную (например, «num') для хранения ссылки на текущий« отредактированный »div 'или добавление к нему класса' last'. –

2

См http://jsfiddle.net/m6zgh5r3/3/

Это потому, что Происходило на каждом MouseDown вы связываете снова MouseUp.

Просто добавив

$(this).unbind("mouseup"); 

фиксирует это.

+0

В то время как ваше решение «решает» проблему, совершенно не нужно связывать и развязывать этот прослушиватель событий. –

+0

Я согласен с LJ_1102. Это полностью работает, хотя я и не думал о развязывании мыши. @ LJ_1102, как вы сказали, что нет необходимости отключать этот прослушиватель событий? .. – qtgye

+0

С «совершенно ненужным связывать и развязывать» я имел в виду факт включения и выключения этого прослушивателя событий. Его должно быть достаточно, чтобы связать его один раз и оставить так. Плохая формулировка на моей стороне. –

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