“返回错误”指令间歇性地工作

时间:2013-11-19 18:40:51

标签: javascript jquery

我的侧边栏中有一个div元素(id = ecover)>点击它会显示另一个div(id = ebook_form)。这个jQuery代码如下。因为涉及到href链接,所以在显示隐藏div的代码之后使用return false。

它过去工作得很好,但现在由于某种原因,它有时会起作用,有时“返回假”似乎不起作用。

jQuery('#ecover').click(function(){     

    jQuery("#ebook_form").slideToggle('fast');      

    var ecover_vertical_position = jQuery('#ecover').offset();

    ecover_vertical_position = ecover_vertical_position.top;

    jQuery('html, body').animate({ scrollTop: ecover_vertical_position }, 500, 'easeInOutExpo');

return false;

});

1 个答案:

答案 0 :(得分:0)

return false是阻止默认操作的不好方法。这有三个主要原因:

  1. 它必须在功能结束时出现。这并不总是令人满意的行为。在处理程序的开头阻止默认行为通常更好,或者确实可以灵活地将其置于其他地方。您可以使用event.preventDefault()
  2. 来实现此目的
  3. 它可以防止其他事件处理程序进一步触发DOM树。这可能是可取的:如果是这样,您可以使用event.stopPropagation()。但没有理由认为两者应该永远在一起。
  4. 如果代码有任何错误导致Javascript抛出错误并退出该函数,则永远不会到达return false,因此将执行默认操作。如果我们将event.preventDefault()放在函数的顶部,则不会发生这种情况。这是特别糟糕的,因为在这种情况下,默认行为涉及更改页面,因此错误控制台被清除,您无法看到发生了什么错误。
  5. 因此,例如,此代码将始终阻止默认行为:

    jQuery('#ecover').click(function(event){     
        event.preventDefault();
    
        jQuery("#ebook_form").slideToggle('fast');      
    
        var ecover_vertical_position = jQuery('#ecover').offset();
    
        ecover_vertical_position = ecover_vertical_position.top;
    
        jQuery('html, body').animate({ scrollTop: ecover_vertical_position }, 500, 'easeInOutExpo');
    });
    

    这不能解决实际问题,即您的代码抛出错误。我的猜测是offset函数出了问题,所以对象没有top属性,但是我无法弄清楚如果事件处理程序被触发,它会如何发生element的click事件。但无论如何,一旦默认行为停止,您就可以使用浏览器控制台确定错误。