JS事件

js事件编程

  • 事件处理程序
  • 常用事件
  • 绑定事件方式
  • 事件冒泡
  • 默认行为
  • 事件对象示例

1. 常用事件

onLoad :页面加载完毕后 一般用于body元素
onUnload :页面关闭后 一般用于body元素
onBlur :失去焦点
onFocus :获得焦点
onClick :点击
onMouseOver :当鼠标经过时
onMouseOut :当鼠标离开时
onMouseDown :当鼠标按下时
onMouseUp :当鼠标抬起时
onMouseMove :当鼠标移动时
onChange :当内容改变时
onSelect :当内容被选中时
onkeypress :当键盘点击时
onkeydown :当键盘按下时
onkeyup :当键盘抬起时
触发顺序:onkeydown、onkeypress、onkeyup
Onkeypress事件无法捕获功能键 代码见:demo08.html
onSubmit :当表单提交时
onReset :当表单重置时

2.绑定事件方式

1)行内绑定
语法:
<元素事件=”事件处理程序”>

<script>
    function display(){
        alert('hello');
        alert('hello');
        alert('hello');
        //.................
    }
</script>
<input type='button' value='点击' onclick="display()">

2)动态绑定
结构+样式+行为分离的页面
语法:
对象.事件=事件处理程序

<html>
    <head>
        <script>
            function display(text){
                document.getElementById('content').innerHTML+=text;
            }
        </script>
    </head>
    <body onload="alert('»¶Ó­£¡')" onunload="alert('ÔÙ¼û')">
    <input type='text' onkeypress="display('press')" onkeydown="display('down')" onkeyup="display('up')">
    <div id='content'>
    </div>
    </body>
</html>

3)事件监听
我们能不能为一个dom对象的同一个事件指定多个事件处理程序
通过下面的代码,我们发现 一个对象的同一个事件指定多个事件处理程序,那么,后面指定的程序会覆盖前面的。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <title> New Document </title>
  <meta name="Generator" content="EditPlus">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
 </head>
 <body>
    <script>
        function fn1(){
            alert('first');
        }
        function fn2(){
            alert('second');
        }
        window.onload=function(){
            document.getElementById('div1').onclick=fn1;
            document.getElementById('div1').onclick=fn2;
        };
    </script>
    <div id='div1'>test</div>
 </body>
</html>

如果我们想为一个对象的某个事件指定多个事件处理,可以考虑使用事件监听。
事件监听语法:
IE:
attachEvent(type,callback)

type:事件名 如:onclick、onsubmit、onchange等
callback:事件处理程序

基于W3C模型:
addEventListener(type,callback,capture)
Type:事件名 ,没有“on”前缀 如:click、submit、change
Callback:事件处理程序
Capture:事件模型 (可选参数) (冒泡模型、捕捉模型) true:捕捉模型
false:冒泡模型 (默认值)

代码示例:

IE:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <title> New Document </title>
  <meta name="Generator" content="EditPlus">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
 </head>
 <body>
    <script>
        function fn1(){
            alert('first');
        }
        function fn2(){
            alert('second');
        }
        window.onload=function(){
            document.getElementById('div1').attachEvent('onclick',fn1);
            document.getElementById('div1').attachEvent('onclick',fn2);
        };
    </script>
    <div id='div1'>test</div>
 </body>
</html>
W3c:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <title> New Document </title>
  <meta name="Generator" content="EditPlus">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
 </head>
 <body>
    <script>
        function fn1(){
            alert('first');
        }
        function fn2(){
            alert('second');
        }
        window.onload=function(){
            document.getElementById('div1').addEventListener('click',fn1);
            document.getElementById('div1').addEventListener('click',fn2);
        };
    </script>
    <div id='div1'>test</div>
 </body>
</html>
```
 

 

总结:
IE和W3C事件监听的不同:
监听方法不同:IEattachEvent 、W3C  addEventListener
监听参数不同:IE 没有模型参数、W3C 有模型参数
触发顺序:IE 8及以下的浏览器触发时是先绑定、后触发
W3C浏览器是先绑定、先触发
事件名称不同:IE 事件需要”on”前缀,W3C不需要’on’前缀

解决事件监听的兼容性问题:
```
function addEvent(obj,type,callback){
        if(window.attachEvent){
            obj.attachEvent('on'+type,callback);
        }else{
            obj.addEventListener(type,callback);
        }
}
```

### 3.事件模型
> 事件模型分为两种:
**1)冒泡模型:事件冒泡是指事件响应时会上水冒一样上升至最顶级元素**
**2)捕捉模型:按照添加顺序**

冒泡模型代码示例:
```
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <title> New Document </title>
  <meta name="Generator" content="EditPlus">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
  <style>
    #div1{width:400px;height:400px;background:red}
    #div2{width:300px;height:300px;background:green}
    #div3{width:200px;height:200px;background:blue}
  </style>
 </head>
 <body>
    <script language='javascript' src='public.js'></script>
    <script>
        window.onload=function(){
            document.getElementById('div1').onclick=function(){
                alert('div1');
            };
            document.getElementById('div2').onclick=function(event){
                alert('div2');
                stopBubble(event);
            };
            document.getElementById('div3').onclick=function(){
                alert('div3');
            };
        };
    </script>
    <div id='div1'>
        <div id='div2'>
            <div id='div3'>
            </div>
        </div>
    </div>
 </body>
</html>
```



> 大多数情况下,程序需要对事件冒泡进行取消
如何取消事件冒泡:
IE:
window.event.cancelBubble=true;
W3C:
function(event){
  event.stopPropagation();
}

> **解决兼容性问题:**
function stopBubble(ent){
        if(window.event){
            window.event.cancelBubble=true;
        }else{
            ent.stopPropagation();
        }
}

### 4、默认行为
>有些html元素,有自己的行为,如,提交按钮、超链接
有些时候,我们需要对默认行为进行取消,如表单按钮点击时,用户资料添写不完整,我们这时需要将按钮的默认行为取消。
```
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <title> New Document </title>
  <meta name="Generator" content="EditPlus">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
 </head>
 <body>
 <script language='javascript' src='public.js'></script>
 <script>
        window.onload=function(){
                $('submit').onclick=function(event){
                if($('username').value==''){
                    prevent(event);
                }
            }
        };
 </script>
  <form method='post' action='demo16.php'>
    <input type='text' id='username'><br>
    <input type='submit' value='Ìá½»' id='submit'>
  </form>
 </body>
</html>
```
> **解决兼容性问题:**
function prevent(ent){
        if(window.event){
            window.event.returnValue=false;
        }else{
            ent.preventDefault();
        }
}

### 5.事件对象
> **1)什么是事件对象**
事件对象就是事件发生时系统自动产生的对象,这个对象包含了这个事件发生时所有的信息
如:鼠标移动,那么,鼠标所在的横、纵坐标就保存到了这个事件对象中

> **2)如何获得事件对象**
IE9及以上版本、W3C:
function(event){}
IE8及以下:
window.event

> **3)键盘事件小例子:**
```
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <title> New Document </title>
  <meta name="Generator" content="EditPlus">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
 </head>
 <body>
 <script src='public.js'></script>
 <script>
    window.onload=function(){
        $('test').onkeyup=function(event){
            var code;
            if(window.event){
                code=window.event.keyCode;
            }else{
                code=event.keyCode;
            }
            switch(code){
                case 37:
                    //alert('left');
                    $('content').style.left=(parseInt($('content').style.left)-10)+'px';
                    break;
                case 38:
                    //alert('up');
                    $('content').style.top=(parseInt($('content').style.top)-10)+'px';
                    break;
                case 39:
                    //alert('right');
                    $('content').style.left=(parseInt($('content').style.left)+10)+'px';
                    break;
                case 40:
                    //alert('down');
                    $('content').style.top=(parseInt($('content').style.top)+10)+'px';
                    break;
            }
        };
    };
 </script>
  <input type='text' id='test'>
  <div id='content' style='width:100px;height:100px;background:red;position:absolute;left:10px;top:10px'>test</div>
 </body>
</html>
```
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容