2014-03-29 37 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() { 

});