Я решил эту проблему, если вы все еще заинтересованы. Решение довольно сложное. По сути, вам нужно прикрепить простой HTC к элементу и кэшировать его clientWidth / Height.
Простой HTC выглядит так:
<component lightweight="true">
<script>
window.clientWidth2[uniqueID]=clientWidth;
window.clientHeight2[uniqueID]=clientHeight;
</script>
</component>
Вам необходимо подключить HTC с помощью CSS:
.my-table td {behavior: url(simple.htc);}
Помните, что вам нужно только прикрепить поведение для IE8!
Затем вы используете JavaScript для создания методов получения для кэшированных значений:
var WIDTH = "clientWidth",
HEIGHT = "clientHeight";
if (8 == document.documentMode) {
window.clientWidth2 = {};
Object.defineProperty(Element.prototype, "clientWidth2", {
get: function() {
return window.clientWidth2[this.uniqueID] || this.clientWidth;
}
});
window.clientHeight2 = {};
Object.defineProperty(Element.prototype, "clientHeight2", {
get: function() {
return window.clientHeight2[this.uniqueID] || this.clientHeight;
}
});
WIDTH = "clientWidth2";
HEIGHT = "clientHeight2";
}
Обратите внимание, что я создал константы WIDTH / HEIGHT. Вы должны использовать их, чтобы получить ширину / высоту ваших элементов:
var width = element[WIDTH];
Это сложно, но работает. У меня была такая же проблема, как и у вас, доступ к clientWidth был невероятно медленным. Это решает проблему очень хорошо. Это все еще не так быстро, как IE7, но он снова стал пригодным для использования.