Хорошо, я выяснил, что происходит, если не совсем так, и я смог придумать обходной путь.
В IE 7, если мой метод вызывается из события прокрутки содержимого div, методы jquery position и offset всегда возвращают одинаковые значения в контексте события. Несмотря на то, что элемент перемещается несколько раз, эти методы возвращают значения для позиции, которую он занимал в начале события. Если метод вызывается с помощью других средств, таких как событие готовности документа, кажется, что все работает правильно, и вычисления положения чувствительны к изменяющейся позиции элемента. Я также должен отметить, что откат назад и расчет позиции с использованием стандартного javascript ведут себя так же.
Обходной путь, который я нашел, состоял в том, чтобы разделить мой метод позиционирования на две части, первая часть обнуляет позицию моего div, а вторая часть устанавливает новую позицию. Затем я использую setTimeout в первом методе для вызова второго метода. Это вырывает меня из контекста события, так что мои вычисления положения могут правильно найти нулевую точку деления.
var t;
function SetPosition() {
var divMoveMe = $("div#MoveMe");
if (t) {
clearTimeout(t);
}
divMoveMe.css({ "top": "0px", "left": "0px" });
divMoveMe.height(0);
divMoveMe.width(0);
t = setTimeout(function() { SetPosition2(); }, 0);
}
function SetPosition2() {
var divMoveMe = $("div#MoveMe");
var Textbox = $("input#textbox");
var divMoveMeOffset = divMoveMe.offset();
var TextboxOffset = Textbox.offset();
var divLeft = ((TextboxOffset.left - divMoveMeOffset.left)) + Textbox.outerWidth();
var divTop = (TextboxOffset.top - divMoveMeOffset.top);
divMoveMe.css({ "top": divTop + "px", "left": divLeft + "px" });
divMoveMe.height(Textbox.outerHeight());
divMoveMe.width(Textbox.outerWidth());
}
РЕДАКТИРОВАТЬ: Эта версия кода также работает правильно. Похоже, что главное - вырваться из контекста события перед выполнением расчетов позиции.
var t;
function SetPosition() {
if (t) {
clearTimeout(t);
}
t = setTimeout(function() { SetPosition2(); }, 0);
}
function SetPosition2() {
var divContent = $("div#Content");
var divMoveMe = $("div#MoveMe");
var Textbox = $("input#textbox");
divMoveMe.css({ "top": "0px", "left": "0px" });
divMoveMe.height(0);
divMoveMe.width(0);
var divMoveMeOffset = divMoveMe.offset();
var TextboxOffset = Textbox.offset();
var divLeft = ((TextboxOffset.left - divMoveMeOffset.left)) + Textbox.outerWidth();
var divTop = (TextboxOffset.top - divMoveMeOffset.top);
divMoveMe.css({ "top": divTop + "px", "left": divLeft + "px" });
divMoveMe.height(Textbox.outerHeight());
divMoveMe.width(Textbox.outerWidth());
}