How to detect click but not drag using jQuery?
Asked Answered
A

3

14

I have code that select text when user click the p tag but I don't want to do that when user select the text inside. Is it possible to detect click but without drag?

I have simple code like this:

$('.conteiner').on('click', 'p.xxx', function() {
   $(this).selection();
});

But click is executed even if I drag between mousedown and mouseup. The selection is a plugin that select text using getSelection or Range.

Aramanta answered 18/2, 2014 at 10:31 Comment(0)
Z
16

Similar to this: Can you detect "dragging" in jQuery?

You can use mousedown and mouseup to detect whether there was a drag.

 $(function() {
    var isDragging = false;
    $(".conteiner")
    .mousedown(function() {
        $(window).mousemove(function() {
            isDragging = true;
            $(window).unbind("mousemove");
        });
    })
    .mouseup(function() {
        var wasDragging = isDragging;
        isDragging = false;
        $(window).unbind("mousemove");
        if (!wasDragging) {
            $(this).selection();
        }
    });
  });

Here is the plunker demo: http://embed.plnkr.co/Y7mrOP/

Zamia answered 18/2, 2014 at 11:3 Comment(1)
I've created a plugin for this (custom event) github.com/jcubic/jquery.draglessClickAramanta
A
0

Found better way, since I need to detect drag to select text this works better:

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 '';
    };
})();

self.mouseup(function() {
    if (get_selected_text() === '') {
       // click not drag
    }
});
Aramanta answered 12/9, 2017 at 14:55 Comment(0)
D
0

Type annotated version of the OP's solution for Closure Compiler in Advanced mode

const get_selected_text = (/** @return {function():string} */ function() {
    if (window.getSelection || document.getSelection) {
        return function () {
            const selection = /** @type {function():Object<string,?>} */ (window.getSelection || document.getSelection)();
            if (typeof selection['text'] === "string") {
                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 '';
    };
})();
Dnieper answered 1/11, 2018 at 21:51 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.