Я провел некоторое исследование по этому вопросу, но я не могу найти что-либо, что мне нужно.
Я получаю сообщение об ошибке: "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() {
});
});
Как я вижу, вместо этого вы можете использовать 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() {
});
this
внутренняя анонимная функция setTimeout ссылается на объект глобального окна, а не на элемент.nav-item
. Рассмотрите возможность использования замыкания или предоставления контекста анонимной функции.