2014-03-29 39 views
0

我已经做了一些研究,但我无法找到任何符合我需要的东西。jQuery顶部错误的位置()

我收到错误:“Uncaught TypeError:无法读取chrome中属性'top'的undefined”,但它说它来自jQuery。

$(document).ready(function() { 
    var cp = $(".cp"); 
    var cppos = cp.position(); 
    var cpleft = cppos.left; 
    cp.append('<div class="under-slider"></div>'); 

    $(".nav-item").hover(function() { 
     setTimeout(function() { 
      var pos = $(this).position(); 
      var posLeft = pos.left; 
      var td = posLeft - cpleft; 
      $(".under-slider").animate({left:td}, 200); 
      var cp = $(this); 
     }, 100); 
    }, function() {  
    }); 
}); 
+0

'this'里面的setTimeout匿名函数是指的全局窗口对象,不元素'.nav-item'。考虑使用闭包还是提供匿名函数的上下文 –

+0

什么行数,哪里出错? – idlerboris

+0

你确定你不是指“左”而不是顶?你不要在你的代码中的任何地方使用top – Banana

回答

1

我看到它,你可以使用delay代替:

$(".nav-item").hover(function() { 
     var pos = $(this).position(); 
     var posLeft = pos.left; 
     var td = posLeft - cpleft; 
     $(".under-slider").stop().delay(100).animate({ //stop() or not, depending behaviour you want 
      left: td 
     }, 200); 
}, function() { 

}); 

现在关于您的问题,this超时的匿名函数回调里面是不是你认为它应该是,但指window目的。

基本上,你可以有使用可变关闭,如:

$(".nav-item").hover(function() { 
    var $elem = $(this); 
    setTimeout(function() { 
     var pos = $elem.position(); 
     var posLeft = pos.left; 
     var td = posLeft - cpleft; 
     $(".under-slider").animate({left:td}, 200); 
    }, 100); 
}, function() { 

}); 

或者proxify /绑定上下文:

$(".nav-item").hover(function() { 
    setTimeout($.proxy(function() { 
     var pos = $(this).position(); 
     var posLeft = pos.left; 
     var td = posLeft - cpleft; 
     $(".under-slider").animate({left:td}, 200); 
     var cp = $(this); 
    }, this), 100); 
}, function() { 

});