Правильные свойства: offsetHeight
(не heightOffset) и offsetWidth
(не widthOffset).
Эти свойства должны правильно возвращать размеры, которые вы ищете, потому что дочерние элементы будут расширять элементы, чтобы соответствовать, предполагая, что переполнение установлено в видимый. Нет необходимости рассчитывать размеры детей в любой ситуации.
offsetHeight
и offsetWidth
не являются частью какого-либо стандарта, но большинство браузеров, кажется, все равно их реализовали.
Поскольку у вас проблемы с Safari и offsetHeight, возможно, вы можете попробовать метод getClientRects()
:
http://www.quirksmode.org/dom/tests/rectangles.html
var dims = links[i].getClientRects()[0];
var width = dims.right - dims.left;
var height = dims.bottom - dims.top;
Не могу сказать, что я когда-либо использовал getClientRects()
, однако. Похоже, что результаты могут быть ближе к clientWidth и clientHeight.
ДОПОЛНИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ
Я нашел обходной путь. Следующее не работает:
<a href="#">
<img onclick="press(event);" src="http://sstatic.net/so/img/logo.png" alt="" />
<!-- onclick handler alerts with size 250x15 -->
</a>
Но оборачивая тег <span>
вокруг тега <img>
, вот так:
<a href="#"><span>
<img onclick="press(event);" src="http://sstatic.net/so/img/logo.png" />
<!-- onclick handler alerts with size 250x61 -->
</span></a>
Исправляет проблему. По крайней мере, это происходит в Chrome, но, как я уже говорил, Chrome и Safari используют общий механизм рендеринга WebKit, поэтому он должен работать и в Safari.