Кросс-браузерное обнаружение кликов против перетаскивания мышью в 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 '';
    };
})();
Другие вопросы по тегам