【发布时间】:2013-09-24 08:22:00
【问题描述】:
我们在 JavaScript 中面临一个相当可怕的问题,我们似乎都没有能力解决:
我们如何在页面上不实际显示组件的情况下获取 DOM 元素的宽度和高度,包括子元素、整个盒子模型等?
记住:我正在寻找建议。即使是不能完全回答问题(或不完全符合指定参数)的答案也可能而且可能会有帮助。
主要目标:我通过 Javascript 将 HTML 元素添加到页面中 - 来自数据库的具有大小和样式的 HTML 元素。问题是它们行为不端,通常是错误的对齐方式,由于填充/边距,一个元素大于另一个元素,因此我需要检查它们的实际大小以解决这些问题。
最终的应用程序将是一个,正如 BigMacAttack 在 cmets 中所描述的那样,一个“紧密结合的第 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 控件正确地组合在一起。
【问题讨论】:
-
将对象插入隐藏的
iframe工作吗? -
@Mathijs Flietstra 好吧,我不妨将它直接插入 body 并获取其子项的大小,问题是它在性能方面变得太成问题(要么没有应用,要么没有应用样式,任君挑选)
-
你不能有
position:absolute; opacity:0;,然后在你有尺寸时删除它吗? -
你不能。只需将其添加到身体,测量它,然后将其移除。如果你在同一个代码块中这样做,它甚至不会在屏幕上闪烁,而且速度非常快(如果这成为一个瓶颈,你需要重新考虑你是如何做事的;计算 CSS 将花费比附加到 DOM 结构)
-
我过去曾尝试过类似的事情,但从未构建过如此复杂的东西,以至于将其添加到文档中会有很大的危害。当我陷入 Javascript 中的这些宽度问题时,我通常将它们添加到文档中或使用固定大小...
标签: javascript jquery html css dom