<button onclick="fun()">点击</button> var fun = function(){ }
var oBtn = document.querySelector('button'); oBtn.onclick = function(){ }
元素.addEventListener(‘去掉on的事件’,回调函数,[是否捕获]);javascript
当冒泡与捕获同时存在时:先捕获后冒泡css
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)能够为一个元素,屡次绑定相同的事件(相似于代码的合并)html
document.addEventListener("click",function(){ alert(1); }); document.addEventListener("click",function(){ alert(2); }); //结果: 1->2
(2) 程序员可使用事件监听的方式 肯定触发的过程是冒泡仍是捕获java
document.addEventListener("click",function(){ alert("document"); },true); window.addEventListener("click",function(){ alert("window"); },true); //结果: window->document
IE的事件监听:元素.attachEvent("带on的事件",回调函数)程序员
设计兼容函数(考虑函数的功能,参数,返回值)json
<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>
委托:让别人去作浏览器
事件委托:某个事件让其余元素来完成app
例如:页面上有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>
拖拽思路: onmousedown onmousemove onmouseup
(1).首先为须要拖拽的对象添加一个onmousedown事件
记录:鼠标点击某个对象时的内部偏移量
e.offsetX e.offsetY
(2).鼠标在文档上移动
要想让操做的元素动起来,该元素必须有定位
移动的过程,实际上改变,元素的left和top
(3).中止移动,须要触发onmouseup鼠标抬起时,取消移动
document.onmousemove = null;
<!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; // 判断标准 //e.pageX是鼠标的位置,因此鼠标位置再向左移动offsetX的距离, //来判断oBox左边是否到达边界 var left = e.pageX - offsetX; var top = e.pageY - offsetY; //console.log(left); //(1) 左边界 if(left<0){ left=0; } //(3) 最大的宽 // window.innerWidth浏览器的可视宽度 var leftMax = window.innerWidth-oBox.offsetWidth; console.log('leftMax' + leftMax); if(left>leftMax){ left = leftMax; } //(2)上边界 if(top<0){ top=0; } //(4)最大的高 // 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>
json对象定义:
var obj = {"key1":value1,..."keyN":valueN};
说明:严格的json对象 键必须用双引号引发来; json的值能够是任意类型的
json 操做 赋值和取值
JSON对象->JSON字符串 :必须是严格模式的字符串和对象
var json = {"name":"老王","age":"18"}; var str = JSON.stringify(json); console.log(str,typeof str);//string
JSON字符串-> JSON对象
var str1 = '{"name":"老王","age":"18"}'; var json1 = JSON.parse(str1); console.log(json1,typeof json1);