Кросс-браузерное обнаружение кликов против перетаскивания мышью в JavaScript
В терминале jQuery у меня есть код, который привязывает мышь вниз / вверх / движение, чтобы определить, использует ли пользователь щелчок, но не перетаскивание.
Код выглядит так:
(function() {
var count = 0;
var isDragging = false;
var $target;
var name = 'click_' + self.id();
self.mousedown(function(e) {
console.log('down');
isDragging = false;
$target = $(e.target);
if (e.originalEvent.button === 2) {
return;
}
self.oneTime(1, function() {
$(window).one('mousemove.terminal_' + self.id(), function() {
console.log('move');
isDragging = true;
count = 0;
});
});
}).mouseup(function() {
console.log('up');
var wasDragging = isDragging;
isDragging = false;
$(window).off('mousemove.terminal_' + self.id());
console.log(wasDragging);
if (!wasDragging) {
if (++count === 1) {
if (!self.enabled() && !frozen) {
self.focus();
command_line.enable();
count = 0;
} else {
self.oneTime(settings.clickTimeout, name, function() {
if ($target.is('.terminal') ||
$target.is('.terminal-wrapper')) {
var len = self.get_command().length;
self.set_position(len);
} else if ($target.closest('.prompt').length) {
self.set_position(0);
}
count = 0;
});
}
} else {
self.stopTime(name);
count = 0;
}
}
}).dblclick(function() {
count = 0;
self.stopTime(name);
});
})();
(Код также обрабатывает двойные щелчки, не помню почему).
но есть проблема в Chrome/MacOS (я тестирую его в VirtualBox, но кто-то также сообщал об этой проблеме) перемещение мыши вызывается даже при отсутствии движения мыши и перетаскивания.
Кажется, что событие mousemove (в MacOS/Chrome) вызывается, когда оно связывается после фактического перемещения мыши.
Есть ли лучшее решение для определения клика, но не перетаскивания, которое будет работать на MacOS, а также на других ОС / браузерах?
1 ответ
Я думаю, что я решил проблему, заменив mousemove проверкой, выделен ли какой-либо текст, с помощью этой кросс-браузерной функции.
var get_selected_text = (function() {
if (window.getSelection || document.getSelection) {
return function() {
var selection = (window.getSelection || document.getSelection)();
if (selection.text) {
return selection.text;
} else {
return selection.toString();
}
};
} else if (document.selection && document.selection.type != "Control") {
return function() {
return document.selection.createRange().text;
};
}
return function() {
return '';
};
})();