.setCapture and .releaseCapture in Chrome

后端 未结 2 675
南旧
南旧 2020-12-15 11:39

I have an HTML5 canvas based Javascript component that needs to capture and release mouse events. In the control the user clicks an area inside it and drags to affect a cha

相关标签:
2条回答
  • 2020-12-15 11:54

    An article written in 2009 details how you can implement cross-browser dragging which will continue to fire mousemove events even if the user's cursor leaves the window.

    http://news.qooxdoo.org/mouse-capturing

    Here's the essential code from the article:

    function draggable(element) {
        var dragging = null;
    
        addListener(element, "mousedown", function(e) {
            var e = window.event || e;
            dragging = {
                mouseX: e.clientX,
                mouseY: e.clientY,
                startX: parseInt(element.style.left),
                startY: parseInt(element.style.top)
            };
            if (element.setCapture) element.setCapture();
        });
    
        addListener(element, "losecapture", function() {
            dragging = null;
        });
    
        addListener(document, "mouseup", function() {
            dragging = null;
        }, true);
    
        var dragTarget = element.setCapture ? element : document;
    
        addListener(dragTarget, "mousemove", function(e) {
            if (!dragging) return;
    
            var e = window.event || e;
            var top = dragging.startY + (e.clientY - dragging.mouseY);
            var left = dragging.startX + (e.clientX - dragging.mouseX);
    
            element.style.top = (Math.max(0, top)) + "px";
            element.style.left = (Math.max(0, left)) + "px";
        }, true);
    };
    
    draggable(document.getElementById("drag"));
    

    The article contains a pretty good explanation of what's going on, but there are a few gaps where knowledge is assumed. Basically (I think), in Chrome and Safari, if you handle mousemove on the document then, if the user clicks down and holds the mouse, the document will continue receiving mousemove events even if the cursor leaves the window. These events will not propagate to child nodes of the document, so you have to handle it at the document level.

    0 讨论(0)
  • 2020-12-15 12:13

    Chrome supports setPointerCapture, which is part of the W3C Pointer events recommendation. Thus an alternative would be to use pointer events and these methods.

    You might want to use the jquery Pointer Events Polyfill to support other browsers.

    0 讨论(0)
提交回复
热议问题