当我移动鼠标太快时,Javascript函数不按预期工作.关于如何改进的想法

Javascript function works not as intended when I move mouse too quickly. Ideas on how to improve?

本文关键字:工作 于如何 鼠标 移动 函数 Javascript      更新时间:2023-09-26

我的页面上有一个可拖放控件。它有一个客户端事件' onclientdrag ',我用它来突出显示我的页面。这个想法是,页面上有不同的区域,当用户在页面的某些部分上拖动控件时,页面会相应地高亮显示。

问题是,我看到高亮闪烁时,快速移动。我没有看到任何异常被抛出,但如果我快速移动鼠标,而停留在一个"区域"内,我仍然看到高亮显示被删除和重新添加。我只能假设这是因为方法没有及时完成—并且由于被拖拽而再次触发。哪些会导致意想不到的问题?

function RemoveHighlighting(dockZone) {
    if (dockZone.get_docks().length == 0) {
        dockZone.removeCssClass("zoneDropOk");
    }
}
function AddHighlighting(dockZone) {
    if (dockZone.get_docks().length == 0) {
        dockZone.addCssClass("zoneDropOk");
    }
}
var previousZone = null;
//Evaluates whether the currently moused-over item is a RadDockZone.
function TryGetZoneFromTarget(target) {
    while (target != null && target.id) {
        if (target.id.indexOf("RadDockZone") != -1) {
            return $find(target.id);
        }
        target = target.parentNode;
    }
    return null;
}
//Adds highlighting to the dockZones when the user is dragging objects to the screen.
//Clear the old dockZone as the user moves out of it, and color new ones as they move into it.
function OnClientDragging(sender, eventArgs) {
    var target = eventArgs.get_htmlElement();
    var zone = TryGetZoneFromTarget(target);
    if (zone) {
        var currentZone = zone;
        dockZoneDroppedOnID = zone.get_id();
        if (previousZone == null) {
            previousZone = currentZone;
            $.queue(AddHighlighting(currentZone));
        }
        else if (previousZone != currentZone) {
            $.queue(RemoveHighlighting(previousZone));
            previousZone = currentZone;
            $.queue(AddHighlighting(currentZone));
        }
    }
    else {
        dockZoneDroppedOnID = "";
        if (previousZone != null && $.queue.length == 0) {
            RemoveHighlighting(previousZone);
            previousZone = null;
        }
    }
}

我应该尝试使这个脚本更有效,或者可能设置一个变量在局部作用域之外,以表明前一个事件仍在运行,并取消当前事件?

编辑:我编辑了一个队列解决方案,工作得很好!我不确定这是不是一个完美的解决方案,但它解决了我的问题。

我认为在此范围之外设置变量将是一种更有效的方法,特别是,您可以使用或模仿jQuery的fx队列工作方式。