您的位置:首页 > Web前端 > JavaScript

JavaScript-dom3 json_str dom元素控制 模拟百度搜索

2018-03-16 12:29 507 查看
访问关系-封装代码

html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>访问关系封装</title>
<style>
li{
width: 100px;
height: 100px;
background-color: pink;
margin: 5px;
list-style: none;
}
</style>
</head>
<body>

<ul>
<li></li>
<li></li>
<li id="box"></li>
<li></li>
<li></li>
</ul>

<script src="tools.js"></script>
<script>
//获取box改为red
var box = getEle("box");
box.style.backgroundColor="red";

//获取第一个和最后一个子节点
var parent = box.parentNode;
getFirstNode(parent).style.backgroundColor="yellow";
getLastNode(parent).style.backgroundColor="yellow";

//获取上一个下一个兄弟节点
getNextNode(box).style.backgroundColor="blue";
getPrevNode(box).style.backgroundColor="blue";

//指定兄弟节点
getEleOfIndex(box,0).style.backgroundColor="green";
getEleOfIndex(box,1).style.backgroundColor="green";

//获取所有的兄弟节点
var arr = getAllSiblings(box);
for(var i=0;i<arr.length;i++){
arr[i].style.backgroundColor = "black";
}

// //父节点
// div.parentNode;
//
// //兄弟节点
// div.previousSibling;
// div.previousElementSibling;
// div.nextSibling;
// div.nextElementSibling;
//
// //单个子节点
// div.firstChild;
// div.firstElementChild;
// div.lastChild;
// div.lastElementChild;
//
// //所有子节点
// div.childNodes;
// div.children;
//
// //获取指定的兄弟节点
// div.parentNode.children[index];
//
// //获取所有的兄弟节点
// function fn(ele) {
//     var newArr = [];
//     var arr = ele.parentNode.children;
//     for (var i = 0; i < arr.length; i++) {
//         //如果不是ele元素本身,添加到新数组,老数组里面包含的ele
//         if (ele !== arr[i]) {
//             newArr.push(arr[i]);
//         }
//     }
// }

</script>
</body>
</html>


tool.js

function getEle(id) {
return document.getElementById(id)
}

/**
* 功能:给指定元素查找它的第一个元素子节点,并返回
* @param ele
* @returns {Element | (() => Node) | ActiveX.IXMLDOMNode | Node | SVGElementInstance}
*/
function getFirstNode(ele) {
var node = ele.firstElementChild || ele.firstChild;
return node;
}

/**
* 功能:给指定元素查找它的最后一个元素子节点,并返回
* @param ele
* @returns {Element | ActiveX.IXMLDOMNode | Node | SVGElementInstance | (() => Node)}
*/
function getLastNode(ele) {
return ele.lastElementChild || ele.lastChild;
}

/**
* 功能:给定元素查找他的下一个元素兄弟节点,并返回
* @param ele
* @returns {Element | null | Node | SVGElementInstance | ActiveX.IXMLDOMNode | (() => Node)}
*/
function getNextNode(ele) {
return ele.nextElementSibling || ele.nextSibling;
}

/**
* 功能:给定元素查找他的上一个元素兄弟节点,并返回
* @param ele
* @returns {Element | null | Node | SVGElementInstance | ActiveX.IXMLDOMNode | (() => Node)}
*/
function getPrevNode(ele) {
return ele.previousElementSibling || ele.previousSibling;
}

/**
* 功能:给定元素和索引值查找指定索引值的兄弟节点,并返回
* @param ele
* @param index
* @returns {Element}
*/
function getEleOfIndex(ele,index) {
return ele.parentNode.children[index];
}

/**
* 功能:给定元素查找它的所用兄弟元素,并返回数组
* @param ele
*/
function getAllSiblings(ele) {
var newArr = [];
var arr = ele.parentNode.children;
for (var i = 0; i < arr.length; i++) {
//如果不是ele元素本身,添加到新数组,老数组里面包含的ele
if (ele !== arr[i]) {
newArr.push(arr[i]);
}
}
return newArr;
}


style属性特点

1、样式少的时候使用

2、style是对象

3、值是字符串,没有设置值是""

4、命名规则,驼峰命名和css不一祥

5、设置了类样式不能获取(只和行内式交互,和内嵌式外链式无关)

6、box.style.cssText="字符串形式的样式"(可以赋值多个属性)

案例-文本焦点高亮显示

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文本焦点高亮显示</title>
<style>
input {
display: block;
}
</style>
</head>
<body>
<ul>
<input type="text"/>
<input type="text"/>
<input type="text"/>
<input type="text"/>
<input type="text"/>
<button>设置</button>
</ul>

<script>
var inpArr = document.getElementsByTagName("input");
var button = inpArr[inpArr.length - 1].nextElementSibling;
button.onclick = function () {
for (var i = 0; i < inpArr.length; i++) {
//当button被点击,所有input绑定事件onfocus
inpArr[i].onfocus = function () {
this.style.border = "2px solid red";
this.style.backgroundColor = "#ccc";
};
//绑定onblur事件,取消样式
inpArr[i].onblur = function () {
this.style.border = "";
this.style.backgroundColor = "";
}
}
}

</script>

</body>
</html>


案例-百度皮肤

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>百度皮肤</title>
<style>
*{
padding: 0;
margin:0;
}
body{
background: url(image/3.png) no-repeat;
}
.box{
height: 200px;
padding-top: 30px;
text-align: center;
background: rgba(255,255,255,0.3);
}
img{
cursor: pointer;
margin: 0 10px;
}
</style>
</head>
<body>
<div class="box">
<img src="image/1.png" alt="" width="200px"/>
<img src="image/2.png" alt="" width="200px"/>
<img src="image/3.png" alt="" width="200px"/>
<img src="image/4.png" alt="" width="200px"/>
<img src="image/5.png" alt="" width="200px"/>
</div>

<script>
//点击图片修改背景图片
var box=document.getElementsByTagName("div")[0];
//body js内部已优化
var body=document.body;
var imgArr=box.children;
for(var i=0;i<imgArr.length;i++){
imgArr[i].index=i;
imgArr[i].onclick = function () {
// body.style.backgroundImage = "url(image/"+(this.index+1)+".png)"
// body.style.background = "url(image/"+(this.index+1)+".png) no-repeat "

//url("http://localhost:63343/dom3/image/2.png")
body.style.backgroundImage = "url("+this.src+")";
}
}
</script>
</body>
</html>


dom元素的创建

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>dom元素的创建</title>
</head>
<body>
<button>创建</button>
<ul>
aaa
</ul>
<script>
//1、 document.write创建;会覆盖原来内容
document.write("<li>我是document.write创建的</li>");
var btn=document.getElementsByTagName("button")[0];
var ul=document.getElementsByTagName("ul")[0];

// btn.onclick = function () {
//     document.write("<li>我是document.write创建的</li>");
// }

//2、直接利用元素innerHTML方法。(innerText方法不识别标签,会覆盖原来内容用+=就行)
ul.innerHTML += "<li id='li1'>我是innerHTML创建的</li>"

//3、利用dom的api创建元素
var newli=document.createElement("li");
newli.innerHTML="我是createElement创建的";

//在赋元素的最后添加元素
// ul.appendChild(newli);
//指定位置添加(放在li1之前)
var li1=document.getElementById("li1");
ul.insertBefore(newli,li1)
</script>
</body>
</html>


dom元素的操作

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>元素的操作</title>
</head>
<body>
<ul>
<li id="li1">参照标签</li>
</ul>

<script>
// document.write()不常用容易覆盖原来的页面
// innerHTML;用的比较多,绑定属性和内容比较方便
//document.createElement;用的比较多,指定数量的时候一般用它
var ul=document.getElementsByTagName("ul")[0];
var li1=document.getElementById('li1');

//创建,添加()
var li2=document.createElement("li");
li2.innerText= "我是createElment创建的标签,用的是appendChild的方法";
ul.appendChild(li2);

var li3=document.createElement("li");
// li3.id="test";
li3.innerText= "我是createElment创建的标签,insertBefore添加";
//父节点.inserBefore(新节点,参照节点)
ul.insertBefore(li3,li1);

//删除,替换
ul.removeChild(li3);

// 父节点.replaceChild(newNode,oldNode)
// var li4=document.createElement("li");
// li4.innerText="test";
ul.replaceChild(li3,li2)

//克隆 cloneNode(true),true是深层复制
for(var i=0;i<=3;i++){
var newLi = li3.cloneNode(true);
ul.appendChild(newLi);
}

</script>

</body>
</html>


案例-选择水果

1、简单版

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>选择水果</title>
<style>
select{
width: 170px;
height: 200px;
font-size: 16px;
background-color: #a4ff43;
}
</style>
</head>

<body>
<select name="" id="sel1" size="10" multiple>
<option value="">香蕉</option>
<option value="">苹果</option>
<option value="">鸭梨</option>
<option value="">葡萄</option>
</select>
<input type="button" value=">>>"/>
<input type="button" value="<<<"/>
<input type="button" value=">"/>
<input type="button" value="<"/>
<select name="" id="sel2" size="10" multiple>
</select>

<script>
//点击>>>和<<<两个按钮

var sel1=document.getElementById("sel1");
var sel2=document.getElementById("sel2");
var inpArr=document.getElementsByTagName("input");
inpArr[0].onclick = function () {
//获取所有子元素,整体添加到另一个标签中
var arr = sel1.children;
for(var i=arr.length-1;i>=0;i--){
//放入select2,不能用push要用appendChild
sel2.appendChild(arr[0]);
}

//也可以在for循环外面定义一个变量
// var arrLen=arr.length-1;
// for(var i=0;i<=arrLen;i++){
//     //放入select2,不能用push要用appendChild
//     console.log(i);
//     // console.log(i);
//     sel2.appendChild(arr[0]);
// }
};
inpArr[1].onclick = function () {
//获取所有子元素,整体添加到另一个标签中
var arr = sel2.children;
for(var i=arr.length-1;i>=0;i--){
//放入select2,不能用push要用appendChild
sel1.appendChild(arr[0]);
}
};

//被选定的子元素跑到对面
// inpArr[2].onclick = function () {
//     //获取所有子元素,整体添加到另一个标签中
//     var arr = sel1.children;
//     for(var i=arr.length-1;i>=0;i--){
//         //放入select2,不能用push要用appendChild
//         if(arr[i].selected === true){
//             sel2.appendChild(arr[i]);
//         }
//     }
// };
inpArr[2].onclick = function () {
var arr=sel1.children;
//遍历判断数组中的元素selected属性为true,添加到相反的select标签中
for(var i=arr.length-1;i>=0;i--){
if(arr[i].selected === true){
sel2.appendChild(arr[i]);
}
}
};
inpArr[3].onclick = function () {
var arr=sel2.children;
//遍历判断数组中的元素selected属性为true,添加到相反的select标签中
for(var i=arr.length-1;i>=0;i--){
if(arr[i].selected === true){
sel1.appendChild(arr[i]);
}
}
}

</script>
</body>
</html>


2、封装版

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>选择水果</title>
<style>
select{
width: 170px;
height: 200px;
font-size: 16px;
background-color: #a4ff43;
}
</style>
</head>

<body>
<select name="" id="sel1" size="10" multiple>
<option value="">香蕉</option>
<option value="">苹果</option>
<option value="">鸭梨</option>
<option value="">葡萄</option>
</select>
<input type="button" value=">>>"/>
<input type="button" value="<<<"/>
<input type="button" value=">"/>
<input type="button" value="<"/>
<select name="" id="sel2" size="10" multiple>
</select>

<script>
//点击>>>和<<<两个按钮

var sel1=document.getElementById("sel1");
var sel2=document.getElementById("sel2");
var inpArr=document.getElementsByTagName("input");

inpArr[0].onclick = function () {
fn1(sel1,sel2)
};

inpArr[1].onclick = function () {
fn1(sel2,sel1)
};
inpArr[2].onclick = function () {
fn2(sel1,sel2)
};

inpArr[3].onclick = function () {
fn2(sel2,sel1)
};
function fn1(ele1,ele2) {
//获取所有子元素,整体添加到另一个标签中
var arr = ele1.children;
for(var i=arr.length-1;i>=0;i--){
//放入select2,不能用push要用appendChild
ele2.appendChild(arr[0]);
}
}
function fn2(ele1,ele2) {
var arr=ele1.children;
//遍历判断数组中的元素selected属性为true,添加到相反的select标签中
for(var i=arr.length-1;i>=0;i--){
if(arr[i].selected === true){
ele2.appendChild(arr[i]);
}
}
};

</script>
</body>
</html>


案例-高级隔行变色json_str

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>高级隔行变色</title>
<style>
*{
padding: 0;
margin: 0;
text-align: center;
}
.wrap{
width: 500px;
margin: 100px auto 0;
}
table{
/*separate在分隔模式下,相邻的单元格都拥有独立的边框。collapse在合并模式下,相邻单元格共享边框。*/
border-collapse: collapse;
border-spacing:0;
border: 1px solid #c0c0c0;
width: 500px;
}
th,td{
/*border: 1px solid #d0d0d0;*/
color: #404060;
padding: 10px;
}
th{
background-color: #09c;
font: bold 16px "微软雅黑";
color: #fff;
}
td{
font: 14px "微软雅黑";
}
tbody tr{
background-color: #f0f0f0;
cursor: pointer;

}
.current{
background-color: red!important;

}
</style>
</head>
<body>
<div class="wrap">
<table>
<thead>
<tr>
<th>序号</th>
<th>姓名</th>
<th>课程</th>
<th>成绩</th>
</tr>
</thead>
<tbody id="target">

</tbody>
</table>
</div>

<script>
var json_str = [
{"id":"1","name":"张三","kecheng":"英语","fenshu":"100"},
{"id":"2","name":"李四","kecheng":"英语","fenshu":"100"},
{"id":"3","name":"王二","kecheng":"英语","fenshu":"100"},
{"id":"4","name":"孙悟空","kecheng":"英语","fenshu":"100"},
{"id":"5","name":"金角大王","kecheng":"英语","fenshu":"100"},
{"id":"6","name":"金角大王","kecheng":"英语","fenshu":"100"},
{"id":"7","name":"金角大王","kecheng":"英语","fenshu":"100"},
{"id":"8","name":"金角大王","kecheng":"英语","fenshu":"100"},
{"id":"9","name":"金角大王","kecheng":"英语","fenshu":"100"},
];
var tbody=document.getElementById("target");
for(var i=0;i<json_str.length;i++){
console.log(json_str[i]);
tbody.innerHTML += "<tr>\n" +
"<td>"+json_str[i].id+"</td>\n" +
"<td>"+json_str[i].name+"</td>\n" +
"<td>"+json_str[i].kecheng+"</td>\n" +
"<td>"+json_str[i].fenshu+"</td>\n" +
"</tr>"
}

//通过document.createElement
// for(var i=0;i<json_str.length;i++){
//     tr=document.createElement("tr");
//     td1=document.createElement("td");
//     td2=document.createElement("td");
//     td3=document.createElement("td");
//     td4=document.createElement("td");
//     td1.innerText =json_str[i].id;
//     td2.innerText =json_str[i].name;
//     td3.innerText =json_str[i].kecheng;
//     td4.innerText =json_str[i].fenshu;
//     tbody.appendChild(tr);
//     tr.appendChild(td1);
//     tr.appendChild(td2);
//     tr.appendChild(td3);
//     tr.appendChild(td4);

// tbody.innerHTML += "<tr>\n" +
//     "<td>"+json_str[i].id+"</td>\n" +
//     "<td>"+json_str[i].name+"</td>\n" +
//     "<td>"+json_str[i].kecheng+"</td>\n" +
//     "<td>"+json_str[i].fenshu+"</td>\n" +
//     "</tr>"
// }

// var tbody=document.getElementById("target");
var trArr=tbody.children;
//循环判断并隔行赋值背景色
for(var i=0;i<trArr.length;i++){
if(i%2!==0){
trArr[i].style.backgroundColor = "#a3a3a3";
}else{
trArr[i].style.backgroundColor = "#ccc";
}
//鼠标经过高亮显示
//难点,鼠标移开恢复原本颜色
//计数器(进入tr立刻记录颜色,移开使用记录好的颜色)
var color="";
trArr[i].onmouseover = function () {
//赋值颜色之前记录颜色
color=this.style.backgroundColor;
this.style.backgroundColor = "#fff";
};
trArr[i].onmouseout = function () {
this.style.backgroundColor = color;
}
}

</script>
</body>
</html>


案例-模拟百度搜索

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>模拟百度搜索</title>
<style>
*{
margin: 0;
padding: 0;
}
.box{
width: 500px;
margin: 200px auto;
}
ul{
width: 392px;
padding: 5px;
list-style: none;
border: 1px solid red;
}
li:hover{
background-color: red;
}
input{
width: 400px;

}
button{
width: 70px;
}
</style>
</head>
<body>
<div class="box">
<input type="text"/>
<button>搜索</button>
<!--<ul>-->
<!--<li>aaa</li>-->
<!--<li>bbb</li>-->
<!--<li>ccc</li>-->
<!--</ul>-->

<script>
//需求:输入内容(输入事件,键盘弹起事件)
var arr = ["a","ab","abc","abcd","baa","aab"];
var box = document.getElementsByTagName("div")[0];
var inp =  box.children[0];

//绑定事件
inp.onkeyup = function () {
var newArr=[];
//创建一个字符串,里面添加满了li和对应的内容
//遍历老数组,那项是以input内容为开头的
for(var i=0;i<arr.length;i++){
//是否以input内容为开头的
var val=this.value;
if(arr[i].indexOf(val)===0){
newArr.push("<li>"+arr[i]+"</li>");
}
}

//把创建好的内容添加到ul
var str=newArr.join("");
// var aa = document.getElementsByTagName("ul")[0];

//1 如果ul存在,删除
if(box.children[2]){
//只要存在那么就是object类型
box.removeChild(box.children[2]);
}

//2 内容为空那么不能生成ul

//3 如果数组中没有input字符开头的元素,切断函数
//换个说法,newArr长度为0

if(this.value.length===0 || newArr.length === 0){
//切换函数
return;
}
var ul = document.createElement("ul");

ul.innerHTML = str;
box.appendChild(ul)
}
</script>

</div>
</body>
</html>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: