Мне посчастливилось клонировать элемент, переместить его за экран, а затем отобразить его, чтобы получить высоту клиента:
var original = document.getElementById(some_id);
var new_item = original.cloneNode(true);
document.body.appendChild(new_item); // item already hidden, so it won't show yet.
// you may wish to validate it is hidden first
new_item.style.position = "absolute";
new_item.style.left = "-1000px";
new_item.style.display = "block";
var height = new_item.clientHeight;
РЕДАКТИРОВАТЬ: Просматривая код jQuery, они делают именно то, что предлагает Цветомир Цонев. jQuery временно устанавливает стиль «display: block; position: absolute; visibility: none», а затем измеряет высоту, меняя свойства обратно после измерения.
Итак, похоже, что вы застряли с необходимостью сделать что-то хакерское, будь то клонирование узла или риск того, чтобы оно мерцало в некоторых браузерах ... Мне нравится предложение Цветомира лучше, чем мой первоначальный взлом, как минимум не требует клонирования узла в DOM, который вам не нужен. В любом случае, элемент не должен быть установлен на «display: none» для измерения его высоты. Разве DOM не замечательный? : -)
РЕДАКТИРОВАТЬ 2: Также стоит отметить, что после того, как jQuery соберет высоту, он добавляет допуски для отступов, полей и размеров полей, поэтому вам может понадобиться также.