【发布时间】:2015-06-10 15:41:09
【问题描述】:
我正在编写(使用纯 JavaScript = 无 JQuery)一个自定义控件,它是一个容器,当它们跨越多行并仅显示第一行时,它会折叠它的内容。当您单击控件中的按钮(向下箭头)时,容器会展开其所有内容。 如果内容仅跨越 1 行,我根本不显示按钮,它的行为就像一个常规容器。
下面的 2 张图片显示了控件折叠(上一张)和展开(下一张)。
我面临的问题是我如何知道何时显示按钮以及何时不显示按钮 = 如何检测内容是多行还是仅跨越单行。我的方法是获取元素的高度,然后折叠它并查看高度是否改变(如果改变了,那么它必须是多行的)。
这种方法的问题在于我的函数createCollapsingPanel() 我正在创建的元素尚未附加到 DOM - 函数返回元素,然后才会将其附加到 DOM(由 架构 1 如下)。如果这只涉及 1 个函数,我当然可以在函数内部移动附加(Architecture 2 下面)。不幸的是,这就是我编写所有函数的方式(它们返回元素,然后才将其附加到调用它们的外部函数中的父元素中),因此这意味着重新编写最终调用它的其他父函数,总的来说是我的整个功能架构。
架构 1
function createOuterElement() {
var outerElement = document.createElement(...);
outerElement.appendChild(createInnerElement());
/* Do other things with outerElement */
return outerElement;
}
function createInnerElement() {
var innerElement = document.createElement(...);
/* Do things with innerElement */
return innerElement;
}
架构 2
function createOuterElement(parentElement) {
var outerElement = document.createElement(...);
parentElement.appendChild(outerElement);
createInnerElement(outerElement);
/* Do other things with outerElement */
}
function createInnerElement(parentElement) {
var innerElement = document.createElement(...);
parentElement.appendChild(innerElement);
/* Do other things with innerElement */
}
主要问题
关于如何在我当前的架构(架构 1)中处理这个问题有什么想法吗?也许有一个事件我可以附加到控制元素上,它会在元素插入 DOM 并为其计算浏览器样式后被调用?
其他问题
在架构 1 中编写函数是否被认为是一种不好的做法?我对非基本 JavaScript 还很陌生,所以不确定什么是好的做法。
【问题讨论】:
-
你想使用“纯 JavaScript”还是像 jQuery 这样的库适合你的目的?
-
我在我的项目中使用纯 JavaScript。尽管知道任何解决方案总是好的,即使在 JQuery 中也是如此。
-
附加问题:我会在插入 dom 之前构建整个树。这可以通过两种架构来实现。在 architecture 2 的情况下,
parentElement.appendChild(...应该是createOuterElement函数的最后一次调用。 -
@dreamlab 要在将其插入到 DOM 之前构造一棵树(如您所建议的那样),Architecture 1 对我来说似乎是一个更优雅的解决方案 - 每个函数都有更小的范围,即不知道他们的父母是什么,在哪里以及如何附加。
标签: javascript dom size web-frontend