Немного опоздал на ответ, но недавно я столкнулся с похожей проблемой с IE8, и я решил поделиться этим, чтобы помочь другим с подобной проблемой. В проекте, над которым я работал, была попытка избежать использования библиотеки jQuery, так что вот решение не из jQuery.
По сути, я реализовал обходной путь, установив свойство scrollTop со значением, которое мне нужно, чтобы оно прокручивалось до соответствующей строки. Значение должно быть рассчитано. Это решение было нацелено на проблему вертикальной прокрутки.
Код подробно описан ниже. Обратите внимание, что вспомогательная функция BrowserIsIE8()
может быть легко найдена через поиск в WWW.
Рисунок 1: Основной телефонный код
var direction = determineRowScrollDirection(parentPane, row);
scrollRowIntoView(parentPane, row, direction);
Рисунок 2: Вспомогательные функции
// Determines the direction to scroll to bring the row into view.
function determineRowScrollDirection(parentPane, row)
{
var parentTop = parentPane.scrollTop;
var parentBottom = parentTop + parentPane.clientHeight;
var childTop = row.offsetTop;
var childBottom = childTop + row.clientHeight;
var direction = 0; // Row is already in view, no scrolling required.
if (parentTop > childTop)
{
direction = -1; // Require scrolling up.
}
else if (parentBottom < childBottom)
{
direction = 1; // Require scrolling down.
}
return direction;
}
// Scroll the pane in the relevant direction to bring the row into view
function scrollRowIntoView(parentPane, row, direction)
{
var distance = 0;
if (BrowserIsIE8() && direction != 0)
{
// scrollIntoView() is broken under ie8 so we need to do it this way.
distance = calculateScrollTopDistance(row, direction);
parentPane.scrollTop = distance;
}
else
{
// If scroll in top direction ...
if (direction == -1)
{
row.scrollIntoView(true);
}
else if (direction == 1) // Scroll in bottom direction.
{
row.scrollIntoView(false);
}
}
}
// Calculates the distance required to bring a row into view.
function calculateScrollTopDistance(parentPane, row, direction)
{
var distance = 0;
if (direction === -1) // upwards scroll
{
distance = row.offsetTop;
}
else if (direction === 1) // downwards scroll
{
var paddingLength = parentPane.clientHeight - row.clientHeight;
distance = row.offsetTop - paddingLength;
}
return distance;
}