现在有这么一组DIV元素:
<div id="id2"></div>
<div id="id5"></div>
<div id="id6"></div>
<div id="id8"></div>
后台某个指令执行成功后,如果返回的数字可能是3,要在id2的后面插入一个新的div(<div id="id3"></div>);如果返回的是1,要在id2的前面插入一个新的div(<div id="id1"></div>);如果返回的是7,要在id6的后面插入一个新的div(<div id="id9"></div>);如果返回的是9,要在id8的后面插入一个新的div(<div id="id9"></div>);
请教该如何写?
/*
*相关于dom的操作全部基于data数组。
*每次获取新的数据后都会刷新全部重建所有的子级div,当数据量过大时会卡顿。
*你的需求最多一百条,亲测不会造成卡顿
*后期的视图层与数据层的其他操作(例如删除)直接对data数组操作即可。
*/
var data =[];//用于存放获取的数据
function getId(){
let id = Math.floor(Math.random()*100);
//要添加的div的父级
var fatherDiv = document.getElementById('fatherDiv');
//要添加的div的爷爷级
var parentDiv = fatherDiv.parentNode;
data.push(id)
//对data数组进行从小到大的排序
data.sort((a,b)=>{
return a - b
})
delDom(parentDiv,fatherDiv)
}
function addDom(father) {
//创建子级div并插入
for (let i = 0; i < data.length; i++) {
let childDiv = document.createElement('div');
childDiv.setAttribute('id',`${data[i]}id`);
father.appendChild(childDiv);
}
}
function delDom(parent,oldfather) {
//删除父级div,同时该父级下的所有子级也会全部清除
oldfather.remove();
//创建一个新的父级div
var newfather = document.createElement('div');
newfather.setAttribute('id','fatherDiv');
parent.appendChild(newfather);
addDom(newfather);
}
以为直接按照你的结构来。。按照你最新的要求改了
<div id="container">
</div>
<input type="button" value="插入Div" onclick="insertDiv(rnd(1,9))" />
<script>
function rnd(min, max) {
var tmp = min;
if (max < min) { min = max; max = tmp; }
return Math.floor(Math.random() * (max - min + 1) + min);
}
function insertDiv(id) {
var div = document.createElement('div'),
container = document.getElementById('container'),
divs = Array.prototype.slice.call(container.childNodes, 0).filter(el => el.tagName == 'DIV');
div.id = 'id' + id; div.innerHTML = id + '--' + new Date().toLocaleString();
if (divs.length == 0) container.appendChild(div);
else {
var tid = -1;
for (var i = 0; i < divs.length; i++) {
var elid = parseInt(divs[i].id.substring(2));
if (elid <= id) { tid = i; } else break;
}
if (tid === -1) container.insertAdjacentElement('afterbegin',div);
else divs[tid].insertAdjacentElement('afterend', div);
}
}
</script>
之前的div的id是通过后台返回来的吗?数据量大吗?每次返回的值都是一个吗?返回值可能重复吗?
整体的前端逻辑是:点击一个按钮,然后post到后台,后台返回一个值,然后开始动态写入div,如果第一个返回来的是3,那就写<div id="id3"></div>;然后再返回来的可能是8,那就是写在3的后面;再返回来的的是0,那就写在3的前面;再返回来的是6,那就写在8的前面;这样以此类推。有可能返回来的可能是跟之前的有重复,那就写在重复的后面(比如又返回来一个3,那就写在第一个3的后面,但一定要在4的前面)。
目前我每次返回来数据,我都会push进一个数组,然后排序。新返回来的数字,我会在这个数组中遍历一下。不过好像还是有bug,会出现已经返回数字了,但没有写入html的情况。
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<title> 页面名称 </title>
</head>
<body>
<input type="button" value="加载数据" onclick="addData();" />
<div id="parentbox">
</div>
<script type="text/javascript">
var num = 1;
function addData() {
var id = Math.floor(Math.random()*10);//随机生成一个id
var str = "第 "+num+" 次生成id: "+id;
insertDiv(id,str);
num++;
}
function insertDiv(id,str) {
var div = document.createElement('div');
div.id = 'id'+id;
div.innerHTML = str;
var arr = document.querySelectorAll("#parentbox > div");
for (var i = 0; i < arr.length; i++) {
if (parseInt(id,10) < parseInt(arr[i].id.replace("id",""), 10)) {
arr[i].insertAdjacentElement('beforebegin', div);
return;
}
}
document.getElementById("parentbox").appendChild(div);
}
</script>
</body>
</html>