5. 事件绑定的三种形式
(1) 通过HTML元素进行绑定
<button onclick="fun()">点击</button>var fun = function(){}
(2) 通过JS获取HTML元素进行绑定
var oBtn = document.querySelector('button');oBtn.onclick = function(){ }
(3) 通过事件监听
语法:
元素.addEventListener(‘去掉on的事件’,回调函数,[是否捕捉]);
- 可选参数是否捕捉,默认是false 冒泡
- addEventListener() 支流高版本浏览器
当冒泡与捕捉同时存在时:先捕捉后冒泡
document.addEventListener('click',function(){ alert('document冒泡'); }) window.addEventListener('click', function(){ alert('window冒泡'); }) document.addEventListener('click',function(){ alert('document捕捉'); },true) window.addEventListener('click', function(){ alert('window捕捉'); },true)//后果:window捕捉-》document捕捉=》document冒泡=》window冒泡
事件监听的益处:
(1)能够为一个元素,屡次绑定雷同的事件(相似于代码的合并)
document.addEventListener("click",function(){ alert(1); }); document.addEventListener("click",function(){ alert(2); });//后果: 1->2
(2) 程序员能够应用事件监听的形式 确定触发的过程是冒泡还是捕捉
document.addEventListener("click",function(){ alert("document"); },true); window.addEventListener("click",function(){ alert("window"); },true);//后果: window->document
事件监听兼容:
IE的事件监听:元素.attachEvent("带on的事件",回调函数)
- 没有第三个参数
- 参数不省略on
- 默认冒泡
设计兼容函数(思考函数的性能,参数,返回值)
<script> function addEvent(obj,type,callBack){ if(obj.attachEvent){ obj.attachEvent("on"+type,callBack); }else{ obj.addEventListener(type,callBack); } } addEvent(document,"click",function(){ alert("1"); });</script>
6. 事件委托
委托:让他人去做
事件委托:某个事件让其余元素来实现
例如:页面上有1000个li,为每一个li增加单击事件。
解决办法:应用委托只须要在li父级上加一次事件就能够。
<script> // 通过事件委托实现高亮 var oUl = document.querySelector('ul'); oUl.onclick = function(evt){ //委托中实在的元素不是this对象 // this.style.backgroundColor = 'pink';//谬误 // 如何取得真正的操作元素 var e = evt||event; var target = e.srcElement||e.target; // console.log(target.tagName);//'LI' if(target.tagName=='LI'){ target.style.backgroundColor='pink'; } }</script>
//委托的实现办法:父级元素.事件 = function(){ //获取事件源 以后的操作元素 var target = e.srcElement||e.target; console.log(target.tagName);//'LI'}
事件委托的益处
1) 通过父元素实现子元素的事件响应,从而大大提高效率
2) 能够为新增加的元素,提前绑定事件
<script> var oUl = document.querySelector('ul'); oUl.onmousemove = function(evt){ var e = evt|| event; var target = e.srcElement||e.target; if(target.tagName == 'LI'){ target.style.backgroundColor='pink'; } } oUl.onmouseout = function(evt){ var e = evt|| event; var target = e.srcElement||e.target; if(target.tagName == 'LI'){ target.style.backgroundColor=''; } } var oInput = document.querySelector('input'); var oBtn = document.querySelector('button'); oBtn.onclick = function(){ // 增加li元素 var oLi = document.createElement('li'); oLi.innerHTML = oInput.value; oUl.appendChild(oLi); oInput.value=''; }</script>
7. 拖拽
<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title></title> <style type="text/css"> #box{ width: 100px; height: 100px; background-color: pink; position: absolute; left: 400px; top: 400px; cursor: move; } </style> </head> <body> <div id="box"> </div> </body></html><script type="text/javascript"> // 某个鼠标按键被按下 onmousedown //某个鼠标按键被松开 onmouseup var oBox = document.querySelector('#box'); oBox.onmousedown = function(evt){ var e= evt||event; var offsetX = e.offsetX; var offsetY = e.offsetY; console.log('offset:' + offsetX,offsetY); document.onmousemove = function(evt){ var e = evt|| event; oBox.style.left= e.pageX - offsetX + 'px'; oBox.style.top = e.pageY - offsetY + 'px'; console.log('page:' + e.pageX,e.pageY); } } document.onmouseup = function(){ document.onmousemove = null; } </script>
拖拽的边界问题??:
<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title></title> <style type="text/css"> #box{ width: 100px; height: 100px; background-color: pink; position: absolute; left: 400px; top: 400px; cursor: move; } </style> </head> <body> <div id="box"> </div> </body></html><script type="text/javascript"> // 某个鼠标按键被按下 onmousedown //某个鼠标按键被松开 onmouseup var oBox = document.querySelector('#box'); oBox.onmousedown = function(evt){ var e= evt||event; var offsetX = e.offsetX; var offsetY = e.offsetY; document.onmousemove = function(evt){ var e = evt|| event; // 判断规范 var left = e.pageX - offsetX; var top = e.pageY - offsetY; console.log(left); if(left<0){ left=0; } // window.innerWidth浏览器的可视宽度 var leftMax = window.innerWidth-oBox.offsetWidth; console.log('leftMax' + leftMax); if(left>leftMax){ left = leftMax; } if(top<0){ top=0; } // window.innerHeight浏览器的可视高度 var topMax = window.innerHeight-oBox.offsetHeight; if(top>topMax){ top = topMax; } oBox.style.left= left + 'px'; oBox.style.top = top + 'px'; } } document.onmouseup = function(){ document.onmousemove = null; } </script>
8. JSON对象
- json: 轻量级存储工具,是一种跨平台的数据交互格局
- 作用: 存储数据
json对象定义:
var obj = {"key1":value1,..."keyN":valueN};
阐明:严格的json对象 键必须用双引号引起来; json的值能够是任意类型的
json 操作 赋值和取值
- 取值:json.键
- 遍历取值 for in
JSON对象->JSON字符串 :必须是严格模式的字符串和对象
- JSON.stringify(json对象)
var json = {"name":"老王","age":"18"};var str = JSON.stringify(json);console.log(str,typeof str);//string
JSON字符串-> JSON对象
- JSON.parse(json字符串)
var str1 = '{"name":"老王","age":"18"}';var json1 = JSON.parse(str1);console.log(json1,typeof json1);