【发布时间】:2016-06-22 04:06:13
【问题描述】:
我在div 有几个孩子(不是固定数量)。有一个text input 可以让用户输入一个数字。
然后有一个function organizeNumberOfRows,它根据input 中的数字来组织孩子。让我举个例子吧。假设我有 4 个孩子,text input 有 3 个。organizeNumberOfRows 将为每 3 个孩子创建一个 div 并将其添加到父元素。
结果层次结构:
- 4 个孩子,
input3:#parentElem > .innerWrapper > (.child * 3) + .innerWrapper > .child - 4 个孩子,
input2:#parentElem > .innerWrapper > (.child * 2) + .innerWrapper > (.child * 2)
希望这很清楚。
每次text input 更改时,我都必须重新配置 dom。我这样做的方式是 (function clearTiles),我将所有子元素添加到 var,即 div,然后调用 organizeNumberOfRows。
当我调用organizeNumberOfRows(更改textInput 之后)时,什么也没有发生。在text input 中插入数字后如何重新配置孩子?
var parentTileElement = document.getElementById('parentTileElement'),
amountOfRowsInput = document.getElementById('amountOfRows');
function NumberOfRows( /** Int */ defaultValue) {
var value = defaultValue;
this.set = function(val) {
value = val;
var parent = clearTiles();
console.log(parent, val);
organizeNumberOfRows(val, parent);
};
this.get = function() {
return parseInt(value);
}
}
var _numberOfRows = new NumberOfRows(3);
var _outerTilesWrapper = document.createElement('div');
var _innerTilesWrapper;
amountOfRows.addEventListener('keyup', function(e) {
_numberOfRows.set(this.value);
});
organizeNumberOfRows(_numberOfRows.get(), parentTileElement);
function organizeNumberOfRows( /** Int */ numberOfRows, /** DOM Element */ parentElem) {
while (parentElem.children.length) {
var currentTile = parentElem.children[0];
if (typeof _innerTilesWrapper === 'undefined' || _innerTilesWrapper.children.length === numberOfRows) {
_innerTilesWrapper = document.createElement('div');
_innerTilesWrapper.className = 'innerWrapper';
_outerTilesWrapper.appendChild(_innerTilesWrapper);
}
_innerTilesWrapper.appendChild(currentTile);
}
parentTileElement.appendChild(_outerTilesWrapper);
}
function clearTiles() {
var tempDiv = document.createElement('div');
var innerTileWrappers = parentTileElement.firstElementChild.children;
while (innerTileWrappers.length) {
while (innerTileWrappers[0].children.length) {
tempDiv.appendChild(innerTileWrappers[0].children[0]);
}
parentTileElement.firstElementChild.removeChild(innerTileWrappers[0]);
}
parentTileElement.removeChild(parentTileElement.firstElementChild);
return tempDiv; /** DOM Elem */
}
body {
margin: 0;
}
#outerTileWrapper {
display: flex;
flex-wrap: wrap;
}
#tileWrapper {
padding: 0;
margin: 0;
display: flex;
flex-wrap: wrap;
}
.tile {
width: 100px;
height: 100px;
background-color: lightgreen;
list-style: none;
border: 1px solid black;
}
<div id="parentTileElement">
<div class="tile">01</div>
<div class="tile">02</div>
<div class="tile">03</div>
<div class="tile">04</div>
</div>
<input type="text" id="amountOfRows">
【问题讨论】:
标签: javascript html dom