鼠标事件


常见的鼠标事件:

以下是一段示例程序,演示了如何拖动文档元素:

/**
 * Drag.js:拖动绝对定位的HTML元素
 * @param elementToDrag:mousedown事件元素或包含元素,必须是绝对定位
 * @param event:mousedown事件对象
 */
function drag(elementToDrag, event) {
    // 初始鼠标位置,转换为文档坐标
    var scroll = getScrollOffsets();
    var startX = event.clientX + scroll.x;
    var startY = event.clientY + scroll.y;
    
    // 文档坐标下待拖动元素的初始位置
    var originX = elementToDrag.offsetLeft;
    var originY = elementToDrag.offsetTop;
    
    // 计算 mousedown 事件和元素左上角之间的距离
    var deltaX = startX - originX;
    var deltaY = startY - originY;
    
    // 注册用于响应接着 mousedown 事件发生的 mousemove 和 mouseup 事件的事件处理程序
    if (document.addEventListener) {
        // 在 document 对象上注册捕获事件处理程序
        document.addEventListener("mousemove", moveHandler, true);
        document.addEventListener("mouseup", upHandler, true);
    } else if (document.attachEvent) {
        // 在 IE 事件模型中,捕获事件是通过调用元素上的 setCapture() 捕获它们
        elementToDrag.setCapture();
        elementToDrag.attachEvent("onmousemove", moveHandler);
        elementToDrag.attachEvent("onmouseup", upHandler);
        // 作为 mouseup 事件看待鼠标捕获的丢失
        elementToDrag.attachEvent("onlosecapture", upHandler);
    }
    
    // 阻止事件传播
    if (event.stopPropagation)
        event.stopPropagation();
    else
        event.cancelBubble = true;
    
    // 阻止任何默认操作
    if (event.preventDefault)
        event.preventDefault();
    else
        event.returnValue = false;
    
    /**
     * mousemove 处理函数,用于移动元素
     */
    function moveHandler() {
        if (!e)
            e = window.event;
    
        // 移动这个元素到当前鼠标位置
        var scroll = getScrollOffsets();
        elementToDrag.style.left = (e.clientX + scroll.x - deltaX) + "px";
        elementToDrag.style.top = (e.clientY + scroll.y - deltaY) + "px";
    
        if (e.stopPropagation)
            e.stopPropagation();
        else
            e.cancelBubble = true;
    }
    
    /**
     * 捕获在拖动结束时最终mouseup事件的处理函数
     */
    function upHandler() {
        if (!e)
            e = window.event;
    
        // 注销捕获事件处理程序
        if (document.removeEventListener) {
            document.removeEventListener("mousemove", moveHandler, true);
            document.removeEventListener("mouseup", upHandler, true);
        } else if (document.detachEvent) {
            elementToDrag.detachEvent("onlosecapture", upHandler);
            elementToDrag.detachEvent("onmouseup", upHandler);
            elementToDrag.detachEvent("onmousemove", moveHandler);
            elementToDrag.releaseCapture();
        }
    
        if (e.stopPropagation)
            e.stopPropagation();
        else
            e.cancelBubble = true;
    }
}

点赞 取消点赞 收藏 取消收藏

<< 上一篇: 文档加载事件

>> 下一篇: 鼠标滚轮事件