2012-10-16 39 views
3

我有两个事件:一个是onclick,当我点击菜单时滚动到某个div,另一个在onscroll这个时候“突出显示”菜单项滚动靠近div。当另一个执行jquery时,“不允许”执行一个事件

我的问题是:我怎么能“禁止”一个envent的执行,而另一个正在执行。

这里是我的代码:

function goToByScroll(id){ 
    var value = $(id).offset().top; 
    var scrl = value - 154; 
    $('html,body').animate({ 
    scrollTop: scrl}, 
    'slow'); 
} 

//scroll menu control 
$("#menu-home ul li a").click(function(e) { 
    e.preventDefault(); 
    $("#menu-home ul li a").removeClass('menu-home-active'); 
    $(this).addClass('menu-home-active'); 
    goToByScroll($(this).attr("href"));  
}); 

//scroll bar control 
$(window).scroll(function() { 
    var scrv = $(this).scrollTop(); 
    var allmenu = $("#menu-home ul li a"); 
    if(scrv == 0){ 
    allmenu.removeClass('menu-home-active'); 
    $('#menu-div1').addClass('menu-home-active'); 
    } 
    if(scrv > 458 && scrv < 478){ 
    allmenu.removeClass('menu-home-active'); 
    $('#menu-div2').addClass('menu-home-active'); 
    } 
    if(scrv > 989 && scrv < 1009){ 
    allmenu.removeClass('menu-home-active'); 
    $('#menu-div3').addClass('menu-home-active'); 
    } 
    if(scrv >= 1324){ 
    allmenu.removeClass('menu-home-active'); 
    $('#menu-div4').addClass('menu-home-active'); 
    } 
}); 

感谢

回答

3

第一个;当滚动事件(或其他方式)时,点击事件不会触发。当你看到滚动事件时,点击事件已经完成。

你应该做的是设置什么变量上的click事件是这样的:

function goToByScroll(id) { 
    window.isAutoScrolling = true; 
    var value = $(id).offset().top; 
    var scrl = value - 154; 
    $('html,body').animate({scrollTop: scrl}, 'slow', goToByScrollCompleted); 
} 
function goToByScrollCompleted() { 
    window.isAutoScrolling = false; 
} 

然后添加到滚动事件的开始这样的:

if(window.isAutoScrolling) return; 

而且,对于注册goToByScrollCompleted,这可能可以用很多方式完成,但是,因为我不知道你怎么做滚动我不能说。

+0

我想我把变量在一个错误的地方完成滚动。我使用自动滚动功能更新了代码。谢谢 –

+0

我已经用新的goToByScroll函数更新了答案 – Alxandr

+0

完美!谢谢 –

1

你可以有全局布尔变量lock,检查wheter这是假的,如果是的,它设置为true,执行你的函数。然后重置它。

相关问题