私は(純粋なJavaScript = JQueryなしを使用して)カスタムコントロールを作成しています。これは、複数の行にまたがって最初の行のみを表示するときにコンテンツを折りたたむコンテナです。コントロール内のボタン (下向き矢印) をクリックすると、コンテナーはそのすべてのコンテンツを展開します。コンテンツが 1 行しかない場合、ボタンはまったく表示されず、通常のコンテナーとして動作します。
以下の 2 つの図は、コントロールが折りたたまれた状態 (上) と展開された状態 (下) を示しています。
私が直面している問題は、ボタンを表示するタイミングとボタンを表示しないタイミングをどのように知るか = コンテンツが複数行であるか、1 行のみにまたがっているかを検出する方法です。私のアプローチは、要素の高さを取得し、それを折りたたんで、高さが変化したかどうかを確認することです(変化した場合は、複数行でなければなりません)。
このアプローチの問題は、関数内で、createCollapsingPanel()
作成している要素がまだ DOM に追加されていないことです。関数は要素を返し、それが DOM に追加されるだけです (以下のアーキテクチャ 1で示されています)。それがその 1 つの関数だけに関係する場合は、もちろん関数内に追加を移動できます (以下のアーキテクチャ 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 */
}
主な質問
私の現在のアーキテクチャ( Architecture 1 )でそれを処理する方法についてのアイデアはありますか?コントロール要素にアタッチできるイベントがあり、要素がDOMに挿入され、ブラウザスタイルが計算された後に呼び出されるでしょうか?
追加の質問
アーキテクチャ 1で関数を記述することは悪い習慣と見なされますか? 私は非基本的な JavaScript にかなり慣れていないので、どのような優れたプラクティスがあるかわかりません。