как различать события onclick и onmousedown на одном элементе
как различать события onclick и onmousedown на одном элементе?
Например обработка событий на элементе id='test' всегда заканчивается с результатом "onMouseDoun"
document.write("<div id='test'>Test onClik and onMouseDoun</div>");
tegTest = document.getElementById('test');
tegTest.onclick = function(){this.innerHTML = "onClick"};
tegTest.onmousedown = function(){this.innerHTML = "onMouseDoun"};
|
Что значит как различать?
|
Элемент должен по разному реагировать на два события onclick и onmousedown.
onmousedown используется для перемещения элемента. onclick - для раскрытия списка. |
Ну так у них разные обработчики событий. В чём проблема?
|
Событие onclick не обрабатывается.
Для проверки замени
tegTest.onclick = function(){this.innerHTML = "onClick"};
на
tegTest.onclick = function(){alert('onClick')};
|
Подтверждаю. Opera 10.50.
Не генерируется событие click при щелчке по тексту. При этом при щелчке на самом диве событие стартует. Замена
tegTest.onmousedown = function(){this.innerHTML = "onMouseDoun"};
на
tegTest.onmousedown = function(){
this.removeChild(this.childNodes[0]);
this.appendChild(document.createTextNode("textnode test"));
};
приводит к аналогичным результатам. Поведение следующее: — mousedown над текстовой нодой; — замена одной текстовой ноды на другую; — mouseup над новой текстовой нодой; — click не генерируется, так как события совершены над разными нодами. А вот тут-то самое интересное. Цитата:
Цитата:
|
Получется, что фактически нельзя/неэффективно совмещать события onclick и onmousedown на одном элементе.
Для своего случая решил проблему заменив onclick на ondblclick. Не то что хотел, но зато работает так как и ожидалось. |
Да можно, почему нельзя…
Просто не трогайте особо этот элемент — записывайте данные в другой, или, вообще, alert. |
Код в первом сообщении я привел как для примера.
В моем случае мне нужно было разделять эти события для управяления меню. Меню можно переместить (события onmousedown, onmousemove, onmouseup) и свернуть развернуть (событие onclick/ondblclick). И все это на одном элементе. Вот пример решения проблемы который был приведен мной в первом сообшении:
var master = (function() {
// функция обработки события onDblClick
function mouseOnDblClick(){
alert('mouseClick');
return false;
}
// функция обработки события onMouseMove
function mouseMove(){
alert('mouseDown and mouseMove');
return false;
}
// функция обработки события onMouseUp
function mouseUp(){
// очистить обработчики, т.к перенос закончен
document.onmousemove = null;
document.onmouseup = null;
document.ondragstart = null;
document.body.onselectstart = null;
}
function mouseDown(){
document.onmousemove = mouseMove;
document.onmouseup = mouseUp;
document.onclick = mouseOnDblClick;
// отменить перенос и выделение текста при клике на обьекте
document.ondragstart = function() {return false};
document.body.onselectstart = function() {return false};
return false;
}
return {
makeDraggable: function(element){
element.onmousedown = mouseDown;
}
}
}());
document.write("<div id='test'>Test onClik and onMouseDoun</div>");
master.makeDraggable(document.getElementById('test'));
|
Ну, во-первых, для таких вещей используйте, все-таки, addEventListener/attachEvent!
Ну, а во-вторых, Вам таки и не обязатеьно тут использовать событие click. Поставьте обработчики mouseup, mousedown и mousemove на document, а потом отслеживайте события. Как это сделать, я расписывал тут и приводил более «живые» примеры тут. Потом все очень просто. Mousedown на подходящем элементе переводит скрипт в… эм-м… особый режим, когда тот отслеживает mousemove по всему документу, и при этом «гасит» событие через e.preventDefault(). Mouseup, соответственно, это дело завершает. А теперь мы просто сидим и ждем. Если mousemove случился раньше, чем mouseup, то действет так, будто это драг-н-дроп; если перед mouseup так и не случилось mousemove, то действуем так, будто это клик. |
| Часовой пояс GMT +3, время: 01:48. |