jQuery верхняя ошибка с position ()

0

Я провел некоторое исследование по этому вопросу, но я не могу найти что-либо, что мне нужно.

Я получаю сообщение об ошибке: "Uncaught TypeError: Невозможно прочитать свойство" верхний "неопределенного" в хроме ", но оно говорит о его выходе из 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
    Какой номер строки, где вы получили ошибку?
Показать ещё 1 комментарий
Теги:

1 ответ

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/bind context:

$(".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() {

});

Ещё вопросы

Сообщество Overcoder
Наверх
Меню