Мы сталкиваемся с довольно страшной проблемой в JavaScript, которую никто из нас, похоже, не может решить:
Как мы можем получить ширину и высоту элемента DOM, включая дочерние элементы, всю модель коробки и т.д. без отображения компонента на странице?
Помните: я ищу предложения. Даже ответы, которые полностью не отвечают на вопрос (или не совсем соответствуют указанным параметрам), могут и, возможно, будут полезны.
Основная цель: Я добавляю HTML-элементы на страницу через Javascript - HTML-элементы с размерами и стилями из базы данных. Проблема в том, что они плохо себя ведут, как правило, плохой алимент, один элемент больше, чем другой из-за заполнения/поля, и поэтому мне нужно проверить их фактический размер, чтобы исправить эти проблемы.
Результирующее приложение будет таким, как BigMacAttack описал его в комментариях, "плотно вяжущая мозаика сторонних элементов управления HTML" в значительной степени будет на месте. Он должен много походить на полноценное настольное приложение, и HTML, кажется, ненавидит эту идею со страстью. Не то чтобы я виню его.
В любом случае, вот пример кода:
JavaScript:
function exampleElement(caption, content) {
this.caption = caption;
this.content = content;
this.rootElement = document.createElement("div");
}
exampleElement.prototype.constructElement = function() {
var otherElement = document.createElement("p");
this.rootElement.className = "exampleElement";
this.rootElement.textContent = this.caption;
otherElement.className = "exampleP";
otherElement.textContent = this.content;
this.rootElement.appendChild(otherElement);
/*I need to know size of the otherElement here*/
/*here goes code adding stuff into rootElement*/
};
window.onload = function() {
var ex = new exampleElement("Hello", "Here text");
ex.constructElement();
document.body.appendChild(ex.rootElement);
};
CSS
.exampleElement {
padding: 5px;
margin: 6px;
}
.exampleElement .exampleP {
padding: 20px;
margin: 6px;
}
Теперь нам нужна наша страница, чтобы динамически реагировать на размер окна и содержимое отдельных компонентов, поэтому важно иметь возможность получить размер объекта до его отображения. Важно также, что создание объекта четко разделено на три фазы:
-
создание через новый
-
построение дерева DOM (constructElement)
-
в документ (либо непосредственно в тело, либо в другое дерево DOM)
Важно, чтобы мы знали размеры отдельных элементов на этапе строительства.
До сих пор мы пытались измерить его с помощью атрибутов jQuery, DOM width и height, но ни одно из них не работает с объектом DOM, который не отображается непосредственно на странице. Другой подход, который я пробовал, - это несколько функций, добавляющих объект в document.body, получение ширины и высоты, а затем сразу же его удаление - однако, поскольку наши файлы CSS очень специфичны, это ненадежно, если вы не введете весь rootElement, который будет ужасная производительность и память, поскольку наши компоненты становятся довольно сложными.
Я предполагаю, что подход к полностью отбрасыванию файлов .CSS и определение стилей напрямую через JS позволит решить хотя бы часть нашего затруднительного положения, но должен быть лучший способ.
Запуск баунти, чтобы получить больше идей и предложений. Просто стреляйте в людей, даже если ответ не полностью находится в пределах вопроса (как бы вы это делали и т.д.) - цель, которую я пытаюсь достичь, - это то, что мои JS-сгенерированные элементы управления HTML правильно сочетаются.