JS常见事件,自定义事件

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
    <style>
  body{
    color: blue;
  }
  .ct,.ct1{
    width: 100px;
    height: 100px;
    border: 1px solid red;
    background-color: yellow;
    margin: 20px;
  }
  .box,.box1{
    width: 50px;
    height: 50px;
    background-color: blue;
  }
  .ct.hover, .ct1.hover{
    border-color: blue;
    background-color: pink;
  }

  .box3{
    list-style: none;
    background: yellow;
    margin: 0;
    padding: 0;
  }
  .box3>li{
    background: pink;
    margin: 5px;
    padding: 10px;
  }
  .box3>li.hover{
    background-color: blue;
  }
  .msg{
    display: none;
  }

  </style>
</head>
<body>

  <button id="btn">点我</button>
  <button id="btn1">点我1</button>
  <div class="ct" style="font-size: 20px">
    <div class="box">hello</div>
  </div>    

  <div class="ct1">
    <div class="box1"></div>
  </div>  
  <input id="input-name" type="text">


  <form id="form" action="/upload">
    <input  id="username" name="username" type="text">
    <p class="msg"></p>
    <input id="btn-submit" type="submit" value="注册">
  </form>

    ![](http://upload-images.jianshu.io/upload_images/6723749-655d95d06b80dba5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


  <script>

  function $(selector){
    return document.querySelector(selector);
  }
//方便书写而已

  $('#btn').addEventListener('click', function(){
    console.log('click')
    console.log(this)
  })                            //在控制台运行,得到:click和button对象
  $('#btn1').addEventListener('dblclick', function(){
    console.log('dblclick')
    console.log(this)
  })
//dblclick就是事件双击,运行同理得到结果。
  $('.ct').addEventListener('mouseover', function(){
    console.log('mouseover')
    console.log(this)
    // this.style.borderColor = 'blue'

    this.classList.add('hover')
  })

//mouseover鼠标放上去的时候,这个事件,类似于放上去就能翻译这种效果的。
执行触发了事件后,这里的样式发生了改变,简单的就直接this.style.borderColor修改,复杂的样式就直接在this.classList.add个class比较好。

  $('.ct').addEventListener('mouseout', function(){
    console.log('mouseout...')
    // this.style.borderColor = 'red'
    this.classList.remove('hover')
  })

//mouseout鼠标移出事件,然后执行方法,,,
//有时候会有类似的bug出现,鼠标放上去,触发事件,执行一些动画方法,
//于是元素动了,等到元素动到鼠标指不到了,事件不触发了,
//动画又没了,又不动了,不动,鼠标又指向了然后又循环起来了,,,

  $('.ct1').addEventListener('mouseenter', function(){
    console.log('mouseenter...')
    //this.style.borderColor = 'blue'
    this.classList.add('hover')
  })
//mouseenter运行貌似跟mouseover一样啊,再重新试验nouseover,mouseout下:
父元素有子元素嵌套着,穿过这些嵌套时,只要区域发生变化,就out,进入新区域就over,也就是有孩子时,穿过孩子也要算out,然后新的over。
而mouseenter和mouseleave就是指这个元素的区域,区域里多少孩子区域不管,所以这个比较实用。

  $('.ct1').addEventListener('mouseleave', function(){
    console.log('mouseleave...')
    //this.style.borderColor = 'blue'
    this.classList.remove('hover')
  })



   $('#input-name').addEventListener('focus', function(){
     console.log('focus...')
     console.log(this.value)
   })
//focus用户激活的状态,获取焦点,选中可以操作,比如input,被选中,可以输入的时候。

   $('#input-name').addEventListener('blur', function(){
     console.log('blur...')
     console.log(this.value)
   })
//blur对应focus,是失去焦点,没被选中,,,这时候可以做一些事情,比如判断是否输入格式正确。

   $('#input-name').addEventListener('keyup', function(e){
     console.log('keyup...')
     console.log(this.value)
     console.log(e)
   //  this.value = this.value.toUpperCase()
   })
//keyup按下键盘,松开时才触发。keydown是按下就触发。

   $('#input-name').addEventListener('change', function(e){
     console.log('change...')
     console.log(this.value)
     console.log(e)
     this.value = this.value.toUpperCase()
   })

//内容发生改变,并焦点移开,触发change。

  $('#form').addEventListener('submit', function(e){
    e.preventDefault();          //阻止默认事件提交
    if(/^\w{6,12}$/.test($('#username').value)){
      $('#form').submit();
    }else{
      $('#form .msg').innerText = '出错了'
      $('#form .msg').style.display = 'block'
      console.log(' no submit...');
    } 
  })
//submit提交事件,可以form.submit这样写,也可addEventListener。
//判断用户名输入是否正确,正确提交,不正确就出现报错的message,不提交。

  window.addEventListener('scroll', function(e){
    console.log('scroll..')
  })
//scroll滚动事件,这里说一下,滚动一格,是好几次的事件触发,滚动好多格,事件触发很多,性能消耗,这时候可以用函数节流,以最后一次滚动为触发事件,否则取消scroll事件,不让侦听到,设置计时器300毫秒,这段时间有滚动就清零计时器,没有就是触发。

  window.addEventListener('resize', function(e){
    console.log('resize..')
  })      
  //resize是窗口变了的事件,窗口变化执行不像滚动变化频率高,也可以做函数节流。


  //页面所有资源加载完成
  window.onload = function(){
    console.log('window loaded')
  }
//onload所有的内部外部的东西都准备好了,图片可以看了,时机很晚。

  //DOM 结构解析完成
  document.addEventListener('DOMContentLoaded', function(){
    console.log('DOMContentLoaded ')
  })

//DOMContentLoaded就是DOM结构渲染完成,不一定看到效果,不一定css渲染完成,很早。这时候,如果在head里有script标签针对body的元素,就没有效果了,怎么办?
//在JS文件内容外,用事件DOMContentLoaded包裹下,放到head里就可以了。

    console.log($('img').width)         //0,这时候执行,图片在网络请求和收取解析图片过程中,img只是一个空标签,所以是0。
    $('img').onload = function(){
        console.log(this.width)   //此时才能得到图片的真实大小,onload图片已经加载好了。
    }
//最后window.loaded也就onload

  </script>

</body>
</html>

还有很多事件不一一细说了,可以自己用到了,再拓展了。

自定义事件

我觉得,不是自定义的事件,比如click之类的,首先声明了这个click是个事件,然后,这个事件是如何触发的,也要声明,有了这两个,基本就简单了:一个套路走下去,先绑定事件,然后确定侦听事件的元素,最后,侦听元素侦听到事件后,要执行什么东东。嗯,我也算是理了下这个事件的小逻辑了哦。这算是奥义哦哦哦。
我想模拟一个浏览器没有的事件哦哦,,,

var EventCenter = {
  on: function(type, handler){
    document.addEventListener(type, handler)
  },               //有一个on的方法,声明(事件,处理方法)。
  fire: function(type, data){
    return document.dispatchEvent(new CustomEvent(type, {
      detail: data
    }))
  }
}
//声明一个对象EventCenter

EventCenter.on('hello', function(e){
  console.log(e.detail)
})        //EventCenter.on听到hello时,执行后面的方法,输出当前事件的内容。

EventCenter.fire('hello', '你好')      //这里把事件hello触发传播出来了

这里的意思我先说一下,自己理解的,可能有些野路子啊,刚开始声明了对象嘛,对象里内容on里用了addEventListener就明白了,它这部分是最终要听到事件也就是那个参数type值,然后要执行后面那个handler代指的方法啊。
对象里的那个fire,就是专门为了声明事件并如何触发事件并传播到on那里而存在滴。其实查了资料,对document.dispatchEvent还是半懂不懂的,记住就是为了声明并触发参数type这个事件就行了,至于第二个参数,感觉不是钉死的,看自己的需求方法了,这里是'你好',正好也是事件的内容的赋值了,正好也是事件触发的输出结果了哦。
document.dispatchEvent 是document触发并传播的哦,刚开始狭隘成fire了,其实fire只是一个代指而已。

document.addEventListener 同理,是document侦听事件并执行的。
element.dispatchEvent() 等同于完成触发并传播事件了。
new CustomEvent(evt,对应数据) 可以声明一个事件。

例子:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
  <style>
    .box{
      width:300px;
      height:100px;
      border:1px solid;
    }
  </style>
</head>
<body>
<div class="box box1">
  <input type="text">
</div>
  <div class="box box2"></div>
  <script>
  var EventCenter = {
  on: function(type, handler){
    document.addEventListener(type, handler)
  },
  fire: function(type, data){
    return document.dispatchEvent(new CustomEvent(type, {
      detail: data
    }))
  }
}
document.querySelector('.box input').oninput =
  function(){
  EventCenter.fire('box1input',this.value)
}
EventCenter.on('box1input',function(e){
  document.querySelector('.box2').innerText=e.detail
})
  </script>
</body>
</html>

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

推荐阅读更多精彩内容