事件(下)

事件(下)

事件对象

在事件对象中记录了很多事件的信息。。。

事件类型

e.type// 事件的类型

例:

<buttonid="btn">

   按钮

</button>

<script>

btn.onclick=function(e){

vare=e||window.event;

console.log(e.type);// MouseClick

   }

btn.onmouseover=function(e){

vare=e||window.event;

console.log(e.type);// MouseOver

   }

</script>

鼠标按键信息

e.button// 鼠标按键的信息

0表示左键,1表示鼠标滚轮,2表示右键

<body>

<buttonid="btn">按钮</button>

</body>

<scripttype="text/javascript">

btn.onmousedown=function(e){

varev=e||window.event;

varcode=ev.button;

if(code==0){

console.log("您点击的是左键");

}elseif(code==1){

console.log("您点击的滚轮");

}elseif(code==2){

console.log("您点击的是右键");

}else{

console.log("不知道你点击的是什么");

   }

}

</script>

按键键码

e.keyCode// 键盘的键码

常见的按键码:

13: 回车键(enter)

32: 空格键(space)

数字和字母的键码是数字或字母对应的阿斯克码

<body>

<buttonid="btn">按钮</button>

</body>

<scripttype="text/javascript">

document.onkeypress=function(e){

varev=e||window.event;

console.log(ev.keyCode);

}

</script>

<font color="blue">作业:模拟打字游戏。</font>

组合按键的判断:

altKey :alt 键按下得到 true,否则得到 false

shiftKey :shift 键按下得到 true,否则得到 false

ctrlKey :ctrl 键按下得到 true,否则得到 false

document.onkeyup=function(e) {

e=e||window.event

keyCode=e.keyCode||e.which


if(e.shiftKey&&keyCode===97) {

console.log('你同时按下了 shift 和 a')

  }

}

使用说明:火狐firefox2.0和低版本IE中keyCode不兼容,可以使用e.which来获取

<font color="red">现在的低版本ie和火狐都能兼容keyCode</font>

鼠标坐标点

从元素内部开始计算的坐标:offsetXoffsetY

<body>

<style>

#box{

width:200px;

height:200px;

border:1pxsolid#000;

}

</style>

<divid="box"></div>

</body>

<scripttype="text/javascript">

box.onclick=function(e){

varev=e||window.event;

console.log(ev.offsetX,ev.offsetY);

}

</script>

访问结果:

元素内部的点击坐标

相对于浏览器的坐标,使用:clientXclientY

<body>

<style>

#box{

width:200px;

height:200px;

border:1pxsolid#000;

margin:100px;

   }

</style>

<divid="box"></div>

</body>

<scripttype="text/javascript">

box.onclick=function(e){

varev=e||window.event;

console.log(ev.clientX,ev.clientY);

}

</script>

访问结果:

相对于浏览器的坐标

使用说明:不管页面滚动到哪里,都是根据窗口来计算坐标。(不会随着滚动条的滚动而发生改变)

相对于页面的坐标,会随着滚动条的滚动而加大,使用:pageXpageY

<body>

<style>

#box{

width:20px;

border:1pxsolid#000;

margin:100px;

   }

</style>

<div id="box">

       没有什么能够阻挡

       你对自由的向往

       天马行空的生涯

       你的心了无牵挂

       穿过幽暗的岁月

       也曾感到彷徨

       当你低头的瞬间

       才发觉脚下的路

       心中那自由的世界

       如此的清澈高远

       盛开着永不凋零

       蓝莲花

</div>

</body>

<scripttype="text/javascript">

box.onclick=function(e){

varev=e||window.event;

console.log(ev.pageY);

}

</script>

访问结果:

横向坐标也是一样的。

拖拽效果

鼠标移动事件:mousemove

<body>

<style>

#box{

width:100px;

height:100px;

background:pink;

position:absolute;

left:0;

top:0;

}

</style>

<divid="box"></div>

</body>

<scripttype="text/javascript">

varx,y;

box.onmousedown=function(){

this.onmousemove=function(e){

varev=e||window.event;

x=ev.clientX-50;

y=ev.clientY-50;

if(x<0){

x=0;

       }

if(y<0){

y=0;

       }

// 屏幕宽度和屏幕高度

varmaxWidth=document.documentElement.clientWidth;

varmaxHeight=document.documentElement.clientHeight;

// 能移动的最大宽度 = 屏幕宽度 - 盒子宽度

varmoveMaxWidth=maxWidth-100;

varmoveMaxHeight=maxHeight-100;

if(x>moveMaxWidth){

x=moveMaxWidth;

       }

if(y>moveMaxHeight){

y=moveMaxHeight;

       }

this.style.left=x+"px";

this.style.top=y+"px";

   }

}

box.onmouseup=function(){

this.onmousemove=null;

}

</script>

<font color="red">注意:获取鼠标坐标位置的时候,不能使用offset来获取,因为offset获取到的值是鼠标在当前元素上的位置,也就是说一开始获取的是大盒子的位置,但是一旦设置了小盒子的位置,鼠标会出现在小盒子上,获取到的位置就成了鼠标在小盒子上的位置了</font>

默认行为

具有默认行为的常见的两个标签

链接<ahref="/index.php">点我</a>往属性href指定的地址跳转

提交按钮<inputtype=”submit”>往form表单属性action指定的地址跳转

阻止默认行为的方法:

1.给链接地址设置为javascript:;javascript:void(0)

2.在事件中最后return false

3.通过对象阻止,代码如下:

functionstopDefault(event) {

vare=event||window.event;

if(e.preventDefault){

e.preventDefault();// w3c标准浏览器

}else{

e.returnValue=false;// IE浏览器

   }

}

鼠标右键也有默认行为。

事件委托

事件委托也叫事件代理(看站谁的角度),使用事件委托技术能避免对每个子节点添加事件监听,相反把事件监听委托给父元素即可,这样可提高绑定事件的性能。

传统的给每个元素绑定事件:

<ul>

    <li>首页</li>

    <li>公司介绍</li>

    <li>产品中心</li>

</ul>

<script>

varoLis=document.getElementsByTagName("li");// 获取到所有li

for(variinoLis){

    oLis[i].onclick=function(){

        alert(this.innerText);

    }

}

</script>

代码的缺点:

li标签比较多的时候,性能特别差,毕竟使用for循环相当于绑定了多次

当动态给li添加元素的时候,新元素没有事件绑定

ul>

    <li>首页</li>

    <li>公司介绍</li>

    <li>产品中心</li>

</ul>

<buttonid="btn">添加新元素</button>

<script>

btn.onclick=function(){

    varoNewLi=document.createElement("li");

    oNewLi.innerText="新闻中心";

    varoUl=document.getElementsByTagName("ul")[0];

    oUl.appendChild(oNewLi)

}

varoLis=document.getElementsByTagName("li");// 获取到所有li

for(variinoLis){

    oLis[i].onclick=function(){

        alert(this.innerText);

    }

}

</script>

分析:当点击按钮给ul添加新元素以后,新元素不具备点击事件,点击没有效果

解决方案:使用事件委托,将所有子元素的点击事件委托给父元素

<ul>

    <li>首页</li>

    <li>公司介绍</li>

    <li>产品中心</li>

</ul>

<buttonid="btn">添加新元素</button>

<script>

varoUl=document.getElementsByTagName("ul")[0];

btn.onclick=function(){

    varoNewLi=document.createElement("li");

    oNewLi.innerText="新闻中心";

    oUl.appendChild(oNewLi)

}

oUl.onclick=function(e){

    varev=e||window.event;

    // 获取到单击的目标元素dom对象

    vartarget=ev.target||ev.srcElement;

    // 判断是否是li标签

    if(target.nodeName=="li"){

        // 完成业务逻辑

        alert(target.innerText);

    }

}

</script>

使用事件委托的好处:

提高性能(事件委托中并没有使用循环给每个节点设置事件,只给一个父元素ul绑定事件)

后续动态添加的节点也有事件的处理

注意:事件委托底层就是通过事件冒泡来完成的,先触发父元素的事件,在通过事件对象的target属性找到具体的目标元素,进而在处理目标元素要执行的业务逻辑。

事件对象总结

在行内绑定的事件,在行内传入event,其他事件驱动函数在定义的时候传入自定义参数。在函数中通过获取参数或者window.event来得到事件对象。

名称                                意义                        使用方式                          兼容问题

stopPropagation方法     阻止冒泡                 e.propagation()                 e.cancelBubble=true

preventDefault方法       阻止默认行为           e.preventDefault()            e.returnValue=false

clientX                           鼠标点击坐标           e.clientX                           无

offsetX                           鼠标点击坐标           e.offsetX                          无

pageX                            鼠标点击坐标           e.pageX                           无

target                             精准的事件源           e.target                             e.srcElement

keyCode                        键盘码                      e.keyCode                        e.which

type                               事件类型                   e.type                                无

button                            鼠标按键信息            e.button                             无

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,194评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,058评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,780评论 0 346
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,388评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,430评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,764评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,907评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,679评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,122评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,459评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,605评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,270评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,867评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,734评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,961评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,297评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,472评论 2 348

推荐阅读更多精彩内容