我们在 JavaScript 中面临一个相当可怕的问题,我们似乎都没有能力解决:
我们如何在页面上不实际显示组件的情况下获取 DOM 元素的宽度和高度,包括子元素、整个盒子模型等?
请记住:我正在寻找建议。即使没有完全回答问题(或不完全符合指定参数)的答案也可能并且可能会有所帮助。
主要目标:我通过 Javascript 将 HTML 元素添加到页面中 - 来自数据库的具有大小和样式的 HTML 元素。问题是它们行为不端,通常是错误的对齐,由于填充/边距,一个元素大于另一个元素,因此我需要检查它们的实际大小以解决这些问题。
正如 BigMacAttack 在评论中所描述的那样,最终的应用程序将是一个“紧密结合的第 3 方 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's 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 宽度和高度属性来测量它,但这些都不适用于没有直接显示在页面上的 DOM 对象。我尝试的另一种方法是将对象添加到 document.body 中的几个函数,获取宽度和高度,然后立即将其删除 - 但是,由于我们的 CSS 文件非常具体,除非您插入整个 rootElement,否则这是不可靠的,这将是由于我们的组件变得相当复杂,因此性能和内存都非常糟糕。
我认为完全删除 .CSS 文件并直接通过 JS 定义样式的方法至少可以解决我们的部分困境,但必须有更好的方法。
开始赏金以获得更多想法和建议。只是射击人,即使答案不完全在问题的范围内(你会/你是怎么做的等等) - 我想要实现的目标是让我的 JS 生成的 HTML 控件正确组合在一起。