JS-WebAPI-03

innerText和textContent的兼容问题
目前浏览器都支持innerText,推荐使用,属于ie的标准
textContent本身是火狐支持,IE8不支持
innerText和textContent的区别
都可以设置标签的文本内容,如果要设置标签及内容推荐使用innerHTML
如果要获取标签中的文本,使用innerText,也可以使用innerHTML
如果要获取标签及文本,使用innerHTML
自定义属性的操作
自定义的属性:标签原本没有这个是孤星,为了存储数据,程序员自己添加的属性
自定义属性无法直接通过DOM对象的方式获取或设置,需使用特定方法
获取:
	对象.getAttribute("自定义属性名");
设置:
	对象.setAttribute("自定义属性名",值);
移除属性:
	对象。removeAttribute("属性名");

节点

文档:document--根节点的父节点,页面的最顶级对象
元素:页面中的所有标签,元素----element,标签----元素---对象
节点:页面中的所有内容(标签、属性、文本(文字、换行、空格、回车)),Node
根元素:html
节点操作的相关属性—作用
属性(可以使用标签--元素 .出来,可以使用属性节点 .出来,文本节点 .出来):
	nodeType(节点类型):
		1----标签; 2---属性; 3---文本;
	nodeName(节点名):
		标签节点---大写的标签名,属性节点---小写的属性名,文本节点---#text
	nodeValue(节点的值):
		标签节点---null,属性节点---属性值,文本节点---文本内容

	获取标签节点(=标签对象)的父级节点/元素--->属性
	var obj = document.getElementById("---");
	console.log(obj.parentNode);	//1个
	console.log(obj.parentElement)	//1个
	console.log(obj.parentNode.nodeType);	//1(标签)
	console.log(obj.parentNode.nodeName);	//大写标签名
	console.log(obj.parentNode.nodeValue);	//null
	
	获取标签节点的子级节点/元素--->属性
	var obj = document.getElementById("---");
	console.log(obj.childNodes);	多个
	console.log(obj.children)	!!!		多个
	console.log(obj.childNodes.nodeType);	//1(标签)
	console.log(obj.childNodes.nodeName);	//大写标签名
	console.log(obj.childNodes.nodeValue);	//null

	获取属性节点	//获得标签对象-》获得该对象内的属性节点
	var obj = document.getElementById("---");
	var node = obj.getAttributeNode("id");	//获得id属性节点
	console.log(node.nodeType);	//1(标签)
	console.log(node.nodeName);	//大写标签名
	console.log(node.nodeValue);	//null
获取节点/元素—重要的十二行代码
<body>
<div id="dv">
    <span>这是div中的第一个span标签</span>
    <p>这是div中的第二个元素,第一个p标签</p>
    <ul id="uu">哈哈
        <li>乔峰</li>
        <li>鹿茸</li>
        <li id="three">段誉</li>
        <li>卡卡西</li>
        <li>雏田</li>嘎嘎
    </ul>
</div>
<script>
    var threeObj = document.getElementById("three");
    var dvobj = document.getElementById("dv");
    var ulObj = document.getElementById("uu");

    console.log(ulObj.parentNode); 		 //父节点
    console.log(ulObj.parentElement);  	 //父元素
    console.log(ulObj.childNodes);  	 //子节点
    console.log(ulObj.children);    	 //子元素
    //以上四行,所有浏览器都支持,以下IE8中所有节点为元素,所有元素不支持
    console.log(ulObj.firstChild); 			 //第一个子节点
    console.log(ulObj.firstElementChild);    //第一个子元素
    console.log(ulObj.lastChild);    		 //最后一个子节点
    console.log(ulObj.lastElementChild);     //最后一个子元素
    console.log(threeObj.previousSibling);   //某个元素的前一个兄弟节点
    console.log(threeObj.previousElementSibling);    //某个元素的前一个兄弟元素
    console.log(threeObj.nextSibling);  	 //某一个元素的下一个兄弟节点
    console.log(threeObj.nextElementSibling);   	 //某一个元素的下一个兄弟元素
</script>
</body>

总结:
	1.凡是获取节点的代码在谷歌和火狐中得到的都是--相关的节点
	2.凡是获取元素的代码在谷歌和火狐中得到的都是--相关的元素
	3.从子节点和兄弟节点开始,凡是获取节点的代码在IE8中得到的是元素;
		凡是获取元素的代码在IE8中得到的是undefined---元素的代码IE不支持
节点案例
1.通过节点操控元素的背景颜色
	<body>
	<input type="button" id="btn" value="变色"/>
	<div id="dv" style="width: 200px;border: 1px solid #ccc">
	    <span>AAAAA</span>
	    <p>aaaaa</p>
	    <span>BBBBB</span>
	    <p>bbbbb</p>
	    <span>CCCCC</span>
	    <p>ccccc</p>
	    <span>DDDDD</span>
	    <p>ddddd</p>
	    <span>EEEEE</span>
	    <p>eeeee</p>
	    <span>FFFFF</span>
	</div>
	<script>
	    document.getElementById("btn").onclick = function () {
	        var dvObj = document.getElementById("dv");
	        var nodes = dvObj.childNodes;
	        for (var i = 0; i < nodes.length; i++) {
	            if (nodes[i].nodeType == 1 && nodes[i].nodeName == "P") {
	                nodes[i].style.backgroundColor = "red";
	            }
	        }
	    }
	</script>
	</body>
2.节点操作隔行变色
	注意节点数与元素数的不同 !!!
3.点小图,切换背景图片
	<body>
	    <div id="mask">
	        <img src="images/1.jpg" alt=""/>
	        <img src="images/2.jpg" alt=""/>
	        <img src="images/3.jpg" alt=""/>
	    </div>
	    <script>
	        var imgObj = document.getElementById("mask").children;
	        for(var i=0;i<imgObj.length;i++){
	            imgObj[i].onclick = function(){
	              document.body.style.backgroundImage = "url("+this.src+")";
	            };
	        }
	    </script>
	</body>
4.全选/全不选

封装节点的兼容代码

获取任意一个父级元素的第一个子元素
function getFirstElementChild(element){
	if(element.firstElementChild){
		return element.firstElementChild;
	}else{
		var node =  element.firstChild;	//防止不支持firstElementChild,且firstChild得到的不是标签节点
		while(node&&node.nodeType!=1){	//有意义且不是标签节点
			node = node.nextSibling;	//下一个
		}
		return node;
	}
}

获取任意一个父级元素的最后一个子元素
function getLastElementChild(element){
	if(element.lastElementChild){
		return element.lastElementChild;
	}else{
		var node =  element.lastChild;	//防止不支持firstElementChild,且firstChild得到的不是标签节点
		while(node&&node.nodeType!=1){	//有意义且不是标签节点
			node = node.previousSibling;	//下一个
		}
		return node;
	}
}

获取任意一个节点元素的前一个兄弟元素
获取任意一个节点元素的后一个兄弟元素

元素创建的三种方式

元素创建:为了提高用户的体验
1.document.write("标签的代码及内容");
	页面加载时可以正常创建元素
	缺陷:如果是在页面加载完毕后,此时通过该方式创建元素,那么页面上的所有内容全部被覆盖消失
2.对象.innerHTML = "标签及代码";
	一般放入兄弟节点或子级节点的子级里
3.document.createElement("标签的名字");	
	(1)创建元素
	(2)设置元素内容
	(3)把元素追加到父级元素中
		//点击按钮,在div中创建一个p标签
		document.getElementById("btn").onclick=function(){
			var pObj = document.createElement("p");	//创建p标签
			setInnerText(pObj,"这是一个p标签");	//为p标签添加内容
			document.getElementById("dv").appendChild(pObj);	//将p标签追加到父级元素中
		};

元素相关的操作方法

	1.	.appendChild()
	2.	.insertBefore("插入对象",”位置对象“)
	3.	.replaceChild("替换对象",”目标对象“)
	4.	.removeChild("移除对象")

案例

1.动态创建列表
	<body>
		<input type="button" id="btn" value="创建列表"/>
		<div style="width: 300px;height: 200px;background-color: aqua;" id="dv">
		</div>
		<script>
		    var names = ["杨过","郭靖","黄蓉","宋青书","赵敏"];
		    document.getElementById("btn").onclick = function () {
		      var str = "<ul style="list-style-type:none;cursor:pointer">";
		        for(var i=0;i<names.length;i++){
		            str += "<li>"+names[i]+"</li>";
		        }
		        str += "</ul>";
		        document.getElementById("dv").innerHTML = str;
		        var list = document.getElementById("dv").getElementsByTagName("li");
		        for(var j=0;j<list.length;j++){
		            list[j].onmouseover = function(){
		                this.style.backgroundColor="yellow";
		            };
		            list[j].onmouseout = function(){
		                this.style.backgroundColor = "aqua";
		            };
		        };
		    };
		</script>
	</body>
2.动态创建表格
获得百度新闻代码
百度搜索-”百度新闻代码“

为元素绑定事件

1.对象.addEventListener("事件类型",事件处理函数,false);	//IE8不支持、谷歌火狐支持
2.对象.attachEvent("事件类型",事件处理函数);	//IE8支持,谷歌火狐不支持
一个元素可以注册多个事件

为元素绑定多个事件
	三个参数:事件的类型/名字,没有on、事件处理函数(命名/匿名函数)、布尔类型(false)
	对象.addEventListenter("click", function(){.....},false);

	两个参数:事件类型有on、事件处理函数(命名/匿名函数)
	对象.attachEvent("onclick", function(){.....});

为任意元素绑定任意事件—兼容函数

<body>
<input type="button" value="按钮" id="btn"/>
<script>
    function my$(id){
        return document.getElementById(id);
    }
    //为任意元素,绑定任意的事件----兼容代码
    //参数:元素、事件类型、事件处理函数
    function addEventListener(element,type,func){
        if(element.addEventListener){
            element.addEventListener(type,func,false)
        }else if(element.attachEvent){
            element.attachEvent("on"+type,func);
        }else{
            element["on"+type] = func;
        }
    }
    addEventListener(my$("btn"),"click",function(){console.log("哈")});
    addEventListener(my$("btn"),"click",function(){console.log("哈哈")});
    addEventListener(my$("btn"),"click",function(){console.log("哈哈哈")});
</script>
</body>

猜你喜欢

转载自blog.csdn.net/weixin_42966943/article/details/88195123
今日推荐