2015-05-09 5 views
2

Я пытаюсь сделать простой плагин, чтобы иметь возможность перетаскивать div. Разумеется, у div может быть содержимое внутри (обычно это форма), и его нужно перетаскивать.Родительский div препятствует фокусировке своего ребенка

Вот прототип: http://jsfiddle.net/Xcb8d/539/

Проблема заключается в том, что texbox внутри этого никогда Div не получает фокус, поэтому я не могу набрать в нем:

<div id="draggable-element">Drag me! 
<form> 
    <input type="text" style="width:50px;"/> 
    <button>ok</button><br><br> 
    <input type="checkbox">check it</input> 
</form> 
</div> 

Как вы можете видеть, это не происходит к другим элементам формы. Флажок можно использовать регулярно, а также кнопку.

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

+0

Вам не нужен закрывающий тег для ввода. – Samurai

ответ

3

OnMouseDown обработчик на перетаскиваемом элемент возвращают ложные и там, остановив распространение событий, позволяя это сделать фокус ввода-состоянии и увлекая все еще работает. (По крайней мере, на хроме) ответ

document.getElementById('draggable-element').onmousedown = function (e) { 
    // memorize the offset to keep is constant during drag! 
    x_offset = e.clientX - x_elem; 
    y_offset = e.clientY - y_elem;  
    _drag_init(this); 
    return true; 
}; 
+0

Ввод текста приятный, но теперь есть странный вторичный эффект. Когда я перетаскиваю элемент вокруг, части экранов меняют цвет. Сценарий: http://snag.gy/GRm3m.jpg Это происходит проще, поскольку вы перетаскиваете элемент быстрее. Любые идеи, как избавиться от этого? – Aleks

+0

возвращение false; в _move_elem, похоже, помогает, поскольку это предотвращает действие события по умолчанию для выбора. – paradoxix

+0

Спасибо, отлично работает! – Aleks

1

В вашем onmousedown обработчике вы заканчиваете return false. Это предотвращает событие щелчка, когда вы нажимаете на вход, и, таким образом, он никогда не фокусируется. То, что я думаю, что вы ищете это:

// Bind the functions... 
document.getElementById('draggable-element').onmousedown = function (e) { 
    if (e.id == 'draggable-element') { 
     // memorize the offset to keep is constant during drag! 
     x_offset = e.clientX - x_elem; 
     y_offset = e.clientY - y_elem;  
     _drag_init(this); 
     return false; 
    } 
}; 
+0

Перетаскивание не работает – Aleks

1

paradoxix был прав, утверждая, что return false на mousedown мероприятия является предотвращение распространения всех других событий.

На любом элементе, который слушает событие mousedown, у вас не возникнут проблемы, потому что событие происходит для них сначала, и только после этого для самого окна. Но вход прослушивает событие focus, которое никогда не происходит из-за return false в событии коробки.

Раствор для предотвращения onmousedown от барботирования из дочерних элементов в поле, например, так:

var nodes = document.getElementById('draggable-element').childNodes; 
for(var i=0; i<nodes.length; i++) { 
    nodes[i].onmousedown = function(e) { 
     e.stopPropagation(); 
    } 
} 

Работы скрипка: http://jsfiddle.net/Xcb8d/546/

+0

Это работает точно так же, как и раньше. – Aleks

+0

Ошибка копирования-пасты, извинения. Вы предотвращаете пузырьки событий с stopPropagation(), но в конце код копируется. Обновлено. –

+0

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