<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style>
*{
margin: 0;
padding: 0;
}
#box_id {
width: 400px;
height: 200px;
background-color: pink;
cursor: pointer;
position: relative;
}
#box_id_c{
width: 200px;
height: 150px;
background-color: greenyellow;
margin-left: 20px;
border: 1px;
}
button{
position: absolute;
top: 10px;
right: 10px;
font-weight: 700;
font:700 30px/30px "微软雅黑";
}
.box_c_1 {
width: 100px;
height: 100px;
cursor: pointer;
border-color: red;
}
.yincang{
display: none;
}
.xianshi{
display: block;
}
</style>
</head>
<body>
<div id="box_id" title="aa" class="box_class">
<div id="box_id_c" class="box_class_c">深度复制</div>
<button id="but">✘</button>
</div>
<div id="box_id_1" class="box_class_1"></div>
<input name="myInput" type="text" size="20" />
<input name="myInput" type="text" size="21" />
<div id="box" value="111">NodeType,NodeName,NodeValue</div>
<script>
//Dom 节点获取
//理解:节点的关系是以属性方式存在的 节点不孤立 所以可以通过节点之间的相对关系获取
var boxId = document.getElementById("box_id"); // 查找id获取html标签(单一返回值)
var bqArr = document.getElementsByTagName("div"); // 查找标签名 (返回:标签数组) 由上之下子元素也包含
var boxCArr = document.getElementsByClassName("box_class"); //查找类名 (返回:标签数组) IE 5,6,7,8 中无效
var nameArr = document.getElementsByName("myInput"); //查找name标签 (返回:标签数组)
var nameArr = document.getElementsByTagNameNS("","");//只是它根据命名空间和名称来检索元素 只有使用命名空间的XML文档才会使用它
console.log(bqArr[0]); // 输出:<div id="box_id" class="box_class">
console.log("bqArr第一个元素是: "+ bqArr[0]); // 输出:bqArr第一个元素是: [object HTMLDivElement] ---》(发现会有类型转换)
//节点分类
// 父节点:(调用者).parentNode !!!!!
//
// 兄弟节点 :
// 下一个兄弟节点:=====> (调用者).nextElementSibling || (调用者).nextSibling
// (调用者).nextSibling: 在IE678中指下一个元素节点(标签)。在火狐谷歌IE9+以后都指的是下一个节点(包括空文档和换行节点)
// (调用者).nextElementSibling: 在火狐谷歌IE9都指的是下一个元素节点。
// 总结:在IE678中用nextSibling,在火狐谷歌IE9+以后用nextElementSibling
//
// 前一个兄弟节点:=====> (调用者).previousElementSibling|| (调用者).previousSibling
// (调用者).previousSibling:IE678中指前一个元素标签 在火狐谷歌IE9+以后都指的是前一个节点(包括空文档和换行节点)
// (调用者).previousElementSibling: 在火狐谷歌IE9都指的是前一个元素节点。
// 总结:在IE678中用previousSibling,在火狐谷歌IE9+以后用previousElementSibling。
//
//
// 单个子节点:
// 第一个子节点:=====> 父节点.firstElementChild || 父节点.firstChild
// (调用者).firstChild:调用者是父节点 IE678中指第一个子元素标签在火狐谷歌IE9+以后都指的是第一个节点(包括空文档和换行节点)
// (调用者).firstElementChild: 在火狐谷歌IE9都指的第一个元素节点。
// 最后一个子节点:=====> 父节点.lastElementChild|| 父节点.lastChild
// (调用者).lastChild: IE678中指最后一个子元素节点(标签)。在火狐谷歌IE9+以后都指的是最后一个节点(包括空文档和换行节点)
// (调用者).lastElementChild: 在火狐谷歌IE9都指的最后一个元素节点。
//
// 所有子节点 !!!!!
// 父节点.childNodes:=====> 标准属性 获取所有节点包括HTML节点,所有属性,文本节点 火狐 谷歌等高本版会把换行也看做是子节点
// 父节点.children:=====> 非标准属性 但是几乎所有浏览器都支持 但不返回文本节点 。(使用较多)
//
// 随意节点: =====> 节点自己.parentNode.children[index];
//节点的操作
// 创建节点:
// 新的标签(节点) = document.createElement("标签名");
// var createDiv = document.createElement("div");
// 插入节点:
// 插入到最后: =====> 父节点.appendChild(新节点);
// boxId.appendChild(createDiv);
//
// 插入到指定节点之前: =====> 父节点.insertBefore(新节点,参考节点)在参考节点前插入;
// boxId.insertBefore(createDiv,bqArr[1]);
//
// 删除节点:
// 知道父节点:=====> 父节点.removeChild(子节点);必须制定要删除的子节点
// box_id.removeChild();
// 不知道父节点: =====> node.parentNode.removeChild(box_id_c);
// bqArr[1].parentNode.removeChild(bqArr[1]);
//
// 复制节点 :
// oldNode.cloneNode(true) //复制后需要重新插入 才有效果
// var copyNode = bqArr[1].cloneNode(true);
// boxId.appendChild(copyNode);
// console.log(bqArr[0]);
function getEle(id){
return document.getElementById(id);
}
/**
* 功能:给定元素查找他的第一个元素子节点,并返回
* @param ele
* @returns {Element|*|Node}
*/
function getFirstNode(ele){
var node = ele.firstElementChild || ele.firstChild;
return node;
}
/**
* 功能:给定元素查找他的最后一个元素子节点,并返回
* @param ele
* @returns {Element|*|Node}
*/
function getLastNode(ele){
return ele.lastElementChild || ele.lastChild;
}
/**
* 功能:给定元素查找他的下一个元素兄弟节点,并返回
* @param ele
* @returns {Element|*|Node}
*/
function getNextNode(ele){
return ele.nextElementSibling || ele.nextSibling;
}
/**
* 功能:给定元素查找他的上一个兄弟元素节点,并返回
* @param ele
* @returns {Element|*|Node}
*/
function getPrevNode(ele){
return ele.previousElementSibling || ele.previousSibling;
}
/**
* 功能:给定元素和索引值查找指定索引值的兄弟元素节点,并返回
* @param ele 元素节点
* @param index 索引值
* @returns {*|HTMLElement}
*/
function getEleOfIndex(ele,index){
return ele.parentNode.children[index];
}
/**
* 功能:给定元素查找他的所有兄弟元素,并返回数组
* @param ele
* @returns {Array}
*/
function getAllSiblings(ele){
//定义一个新数组,装所有的兄弟元素,将来返回
var newArr = [];
var arr = ele.parentNode.children;
for(var i=0;i<arr.length;i++){
//判断,如果不是传递过来的元素本身,那么添加到新数组中。
if(arr[i]!==ele){
newArr.push(arr[i]);
}
}
return newArr;
}
//节点属性: =====> 调用者:节点。 有参数。 没有返回值。每一个方法意义不同
// 获取:getAttribute(名称)
// 设置:setAttribute(名称, 值)
// 删除:removeAttribute(名称)
var ele = document.getElementById("box");//元素节点
var att = ele.getAttributeNode("id");//属性节点
var txt = ele.firstChild;
//nodeType
console.log(ele.nodeType);//1
console.log(att.nodeType);//2
console.log(txt.nodeType);//3
//nodeName
console.log(ele.nodeName);//DIV
console.log(att.nodeName);//id
console.log(txt.nodeName);//#text
//nodeValue
console.log(ele.nodeValue);//null
console.log(att.nodeValue);//box
console.log(txt.nodeValue);//你好
//onclick事件 控制隐藏与消失
var but = document.getElementById("but");
but.onclick = function (){
if(but.innerHTML==="✘"){
bqArr[1].className = "yincang";
console.log(bqArr[1]);
but.innerHTML="✔";
}else{
bqArr[1].className = "xianshi";
but.innerHTML="✘";
}
}
</script>
</body>
</html>