HTML+CSS+CSS3基础知识(二)

基础知识一

  1. 节点类型判断:通过nodeType属性来判断,使用数值常量适用于所有浏览器
    例如: divnode.nodeType == 1 或者 divnode.nodeType == Node.ELEMENT_NODE
    还可以通过 divnode.nodeName 和 divnode.nodeValue 来获得节点名字和值
    在这里插入图片描述
    在这里插入图片描述
    一个小例子!仅供参考
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>isElement Judge</title>
</head>
<body>
	<div id="container">
		这是一个元素节点 
	</div>
	<!-- 这是一个注释节点 -->
	<script>

	    // 不严谨,比如自己创建一个nodeType为1的对象,则有漏洞
		// var isElement = function(obj){
		// 	return !!obj && obj.nodeType==1;
		// }
		var a={
			nodeType:1
		}
		var testDiv = document.createElement('div');
		var isElement = function(obj){
			if(obj && obj.nodeType==1){ // 不能过滤 a
				if(window.Node && (obj instanceof Node)){  //如果是IE9,则判定其是否是Node的实例
					return true;
				}
				try{
				testDiv.appendChild(obj);  //过滤a
				testDiv.removeChild(obj);

				}catch(e){
					return false;
				}
				return true;         // 如果没有错误
			}
			return false;
		}
		console.log(isElement(document.getElementById("container")));
		console.log(isElement(a));
		console.log(isElement(document.getElementById("container").nextSibling));
	</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title></title>
	<script>
		window.onload = function(){
			var div = document.getElementById("container");
			div.style.color = "red";
		}
	</script>
</head>
<body>
	<!-- 这是一个注释comment -->
	<div id="container">这是一个元素节点</div>
	<script>
		// 1. 元素节点
		var divnode = document.getElementById("container");
		console.log(divnode.nodeName + "/" + divnode.nodeValue);
		// 2. 属性节点
		var attrnode = divnode.attributes[0];
		console.log(attrnode.nodeName + "/" + attrnode.nodeValue);
		// 3. 文本节点
		var textnode = divnode.childNodes[0];
		console.log(textnode.nodeName + "/" + textnode.nodeValue);
		// 4. 注释节点  第一个子元素是空白元素是文本节点
		var commentnode = document.body.childNodes[1];
		console.log(commentnode.nodeName + "/" + commentnode.nodeValue);
		// 5. 文档类型节点
		console.log(document.doctype.nodeName + "/" + document.doctype.nodeValue);
		// 6. 文档片段节点
		var frag = document.createDocumentFragment();
		console.log(frag.nodeName + "/" + frag.nodeValue);
	</script>
</body>
</html>
  1. 元素节点类型的判断方法:
    isElement 是否是元素节点
    isHTML 是否是HTML的元素节点
    isXML 是否是XML的元素节点
    contains 是否是包含关系

  2. domready:html标签需要通过浏览器渲染引擎的解析才会变成dom节点,在刷新url地址的时候就有dom构建的过程。当所有html都转化为节点后,dom树才构建完毕,简称为dom ready。
    页面元素不多,对显示速度没有要求的时候可以用window.onload = function(){}

    -当外部资源过多时(如一百张图片),window.onload中的js需要等待至所有的元素都加载完毕才可以运行,即这个过程中不可操作,浏览器如死了一般。
    -jQ中的回调函数与window.onload原理大致相似。

$(document).ready(function(){}); 等于 window.onload()

推荐详细解释

  1. 事件处理程序
    • HTML事件处理程序:直接在html上添加事件,不利于修改,尽量不要用
    • DOM0级事件处理程序:先把元素取出来,然后为其属性添加一个事件的方法,清空事件则将其设置为null
    • DOM2级事件处理程序:addEventListener()和removeEventListener()有三个参数:要处理的事件名(不需要加on)、作为事件处理程序的函数和布尔值。布尔值true:在捕获阶段调用事件处理程序;false:在冒泡阶段调用事件处理程序(常用,兼容各种浏览器)。
    • IE事件处理程序:attachEvent() 和 detachEvent() 两个参数:事件处理程序名称(需要加on)和处理程序的函数,IE8 以及更早的浏览器版本只支持事件冒泡!
    • 跨浏览器事件处理程序
      一个小例子!
<!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">
  <title>跨浏览器事件处理程序</title>
  <script src="js/event.js"></script>
  <script src="js/script.js"></script>
</head>
<body>
  <code>
    // 事件处理程序 <br />
    var eventUtil = {<br />
    addHandle:function(element, type, handle){<br />
    if(element.addEventListener){<br />
    element.addEventListener(type, handle, false);<br />
    }<br />
    else if(element.attachEvent){<br />
    element.attachEvent("on" + type, handle);<br />
    }<br />
    else{<br />
    element["on" + type] = handle;<br />
    }<br />
    },<br />
    <br />
    removeHandle:function(element, type, handle){<br />
    if(element.removeEventListener){<br />
    element.removeEventListener(type, handle, false);<br />
    }<br />
    else if(element.detachEvent){<br />
    element.detachEvent("on" + type, handle);<br />
    }<br />
    else{<br />
    element["on" + type] = null;<br />
    }<br />
    },<br />
    <br />
    getEvent:function(event){<br />
    return event? event:window.event;<br />
    },<br />
    getType:function(event){<br />
    return event.type;<br />
    },<br />
    getTarget:function(event){<br />
    return event.target || event.srcElement;<br />
    },<br />
    stopPropagation:function(event){<br />
    if(event.stopPropagation){<br />
    event.stopPropagation();<br />
    }<br />
    else{<br />
    event.cancelBubble = true;<br />
    }<br />
    },<br />
    preventDefault:function(event){<br />
    if(event.preventDefault){<br />
    event.preventDefault();<br />
    }<br />
    else{<br />
    event.returnValue = false;<br />
    }<br />
    }<br />
    }<br />

  </code>
  <div>
    <code>
      input
    </code>
  </div>
  <div id="box">
    <input type="button" id="btn1" value="按钮1">
    <input type="button" id="btn2" value="按钮2">
    <input type="button" id="btn3" value="按钮3">
    <a href="./20keyevent.html"> Go </a>
  </div>
</body>
</html>
// 事件处理程序 event.js
var eventUtil = {
  addHandle:function(element, type, handle){
    if(element.addEventListener){
      element.addEventListener(type, handle, false);
    }
    else if(element.attachEvent){
      element.attachEvent("on" + type, handle);
    }
    else{
      element["on" + type] = handle;
    }
  },

  removeHandle:function(element, type, handle){
    if(element.removeEventListener){
      element.removeEventListener(type, handle, false);
    }
    else if(element.detachEvent){
      element.detachEvent("on" + type, handle);
    }
    else{
      element["on" + type] = null;
    }
  },

  getEvent:function(event){
    return event? event:window.event;
  },
  getType:function(event){
    return event.type;
  },
  getTarget:function(event){
    return event.target || event.srcElement;
  },
  stopPropagation:function(event){
    if(event.stopPropagation){
      event.stopPropagation();
    }
    else{
      event.cancelBubble = true;
    }
  },
  preventDefault:function(event){
    if(event.preventDefault){
      event.preventDefault();
    }
    else{
      event.returnValue = false;
    }
  }
}

//script.js
window.onload = function(){
  var box = document.getElementById("box"),
      btn = box.getElementsByTagName("input"),
      go = box.getElementsByTagName("a")[0];

  function showMes(object){
    alert(object.value);
  }

  for(var i=0; i<btn.length; i++){
    this.eventUtil.addHandle(btn[i], "click", function(e){
      e = eventUtil.getEvent(e);
      showMes(this);
      alert(eventUtil.getTarget(e).nodeName);
    });
  }

  this.eventUtil.addHandle(go, "click", function(e){
    e = eventUtil.getEvent(e);
    eventUtil.preventDefault(e);
  });
}
  1. 事件对象(event):在触发 DOM 上的事件时都会产生一个对象
  • DOM 中的事件对象
type 属性:用于获取事件类型
target 属性:用于获取事件目标
stopPropagation() 方法,阻止事件冒泡
preventDefault() 方法,阻止事件的默认行为;比如让链接不再跳转
  • IE中的事件对象
type 属性:用于获取事件类型
srcElement 属性:用于获取事件目标
cancelBubble 属性,阻止事件冒泡,设置为true为阻止冒泡
returnValue 属性:阻止事件的默认行为,设置为false为阻止;
  1. 键盘事件:event.keycode 获取键码
    在这里插入图片描述
    啦啦啦,例子来啦,结合知识点4和5
<!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">
  <title>Document下拉菜单选择</title>
  <style type="text/css"> 
    *{margin:0; padding:0;}
    #select{width:200px; margin: 10px auto;}
    #select cite{display:block; width: 200px; height: 30px; line-height: 30px; border: 1px solid #666666; text-align: center; cursor: pointer;}
    #select ul{ width:200px; border: 1px solid #666666; list-style: none; display: none;}
    #select ul li {width:200px; height: 30px; line-height: 30px; text-align: center;}
  </style>
  <script>
    var index=-1;
    window.onload=function(){
      var cite = document.getElementById("select").getElementsByTagName("cite")[0],
          ul = document.getElementById("select").getElementsByTagName("ul")[0],
          li_list = ul.getElementsByTagName("li");
      cite.onclick = function(event){
        event = event || window.event;
        if(event.stopPropagation){
          event.stopPropagation();
        }else{
          event.cancelBubble;
        }
        ul.style.display = "block";
        document.onkeyup = function(event){
          event = event || window.event;
          if(event.keyCode==40)
          {
            index++;
            if(index==0)
            {
              li_list[index].style.background = "gray";
            }
            else if(index == li_list.length)
            {
              li_list[index-1].style.background = "none";
              index=0;
              li_list[index].style.background = "gray";
            }
            else{
              li_list[index-1].style.background = "none";
              li_list[index].style.background = "gray";
            }
          }
          if(event.keyCode==38)
          {
            index--;
            if(index==-1)
            {
              li_list[index+1].style.background = "none";
              index=li_list.length-1;
              li_list[index].style.background = "gray";
            }
            else{
              li_list[index+1].style.background = "none";
              li_list[index].style.background = "gray";
            }
          }
          if(event.keyCode==13)
          {
            cite.innerHTML = li_list[index].innerHTML;
            ul.style.display = "none";
          }
        }
      }
      for(var i=0; i<li_list.length; i++)
      {
        li_list[i].onmouseover = function(){
          this.style.background = "gray";
        }
        li_list[i].onmouseout = function(){
          this.style.background = "none";
        }
        li_list[i].onclick = function(){
          cite.innerHTML = this.innerHTML;
          ul.style.display = "none";
        }
      }
      document.onclick = function(){
        ul.style.display = "none";
      }
    }
  </script>
</head>
<body>
  <div id="select">
    <cite>请选择浏览器</cite>
    <ul>
      <li>Chrome</li>
      <li>360浏览器</li>
      <li>百度</li>
      <li>搜狗</li>
      <li>火狐</li>
    </ul>
  </div>
</body>
</html>

如有错误,欢迎指正~看到这里辛苦啦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值