代码之家  ›  专栏  ›  技术社区  ›  icekomo

尝试在单击链接后防止鼠标移出

  •  1
  • icekomo  · 技术社区  · 8 年前

    我有一个带有mouseover和mouseout动画的导航。他们工作。我还有一个click listener语句,它添加了一个CSS类。这个类设置了一个div的高度,问题是mouseout也改变了这个div。所以我试图找到一种方法,在单击链接时禁用mouseoutlistener。

    js公司

    var currentDiv;
    
    function slideMenu(e) {
    
    if(e.type === "mouseover"){
        // console.log("mouseover");
        TweenMax.to($(this).find('div') , 0.25, {height:20});
    }
    else if(e.type === "mouseout"){
        // console.log("mouseout");
        TweenMax.to($(this).find('div') , 0.25, {height:1});
    }
    else if(e.type === "click"){
        console.log("click");
    
        if (currentDiv !== undefined){
            $(currentDiv).removeClass("selected");
        }
    
        currentDiv = $(this).find('div');
        $(currentDiv).addClass("selected");
    
        $(currentDiv).unbind('mouseout'); // not working
    
    
    
    }
    }
    
    $(".menu a").click(slideMenu);
    $(".menu a").mouseover(slideMenu);
    $(".menu a").mouseout(slideMenu);
    

    .selected{
        height: 20px;
    }
    
    2 回复  |  直到 8 年前
        1
  •  2
  •   logandeancall    8 年前

    这能实现你的目标吗?不用担心点击事件的绑定,只需在点击事件中执行任何其他操作之前检查“selected”类即可。如下所示。。。

    var currentDiv;
    
    function slideMenu(e) {
    
        if(e.type === "mouseover"){
            // console.log("mouseover");
    
            var child_div = $(this).find("div")
    
            if (!$(child_div).hasClass("selected")) {
                TweenMax.to($(this).find('div') , 0.25, {height:20});
            } else {
                $(child_div).attr("style", "") // remove inline styles attr, so that height is based on css instead of JS
            }
        }
        else if(e.type === "mouseout"){
            // console.log("mouseout");
    
            var child_div = $(this).find("div")
            if (!$(child_div).hasClass("selected")) { // check to see if selected/clicked on
                TweenMax.to($(this).find('div') , 0.25, {height:1})
            } else {
                $(child_div).attr("style", "") // remove inline styles attr, so that height is based on css instead of JS
            }
        }
        else if(e.type === "click"){
            console.log("click", this);
    
            if (currentDiv !== undefined){
                    $(currentDiv).removeClass("selected");
            }
    
            currentDiv = $(this).find('div');
    
            $(currentDiv).addClass("selected");
        }
    }
    
    $(".menu a").click(slideMenu);
    $(".menu a").mouseover(slideMenu);
    $(".menu a").mouseout(slideMenu);
    
        2
  •  1
  •   Zbrezi    8 年前

    如果我理解正确,您希望单击元素并将鼠标从元素上移开时,元素的高度保持不变。您可以尝试使用

    var currentDiv;
    
    // add a state
    var hasBeenClicked = false;
    
    function slideMenu(e) {
    
        if(e.type === "mouseover"){
            TweenMax.to($(this).find('div') , 0.25, {height:20});
        }
        else if(e.type === "mouseout"){
    
            // only resize if the element hasn't been clicked
            if (!hasBeenClicked) {
    
                TweenMax.to($(this).find('div') , 0.25, {height:1});
    
            }
    
        }
        else if(e.type === "click"){
    
            // assuming all this stuff is what you want and wasn't testing code
            if (currentDiv !== undefined){
                $(currentDiv).removeClass("selected");
            }
            currentDiv = $(this).find('div');
            $(currentDiv).addClass("selected");
    
            // set state to true
            hasBeenClicked = true;
    
        }
    
    }
    

    注意,这只适用于一个元素,如果计划对多个元素使用此函数,则需要具有 var hasBeenClicked