经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JSJS库框架 » JavaScript » 查看文章
javascript(九)事件冒泡 onmouseenter onmouseenter 默认事件 和 键盘事件
来源:cnblogs  作者:海沿夕风  时间:2018/9/27 16:42:56  对本文有异议

1 事件冒泡

子元素触发的事件,会往上(父元素)传递;

例子:

  1. <div id="box">
  2. <p></p>
  3. </div>
  4. <script>
  5. var oP = document.querySelector('#box p');
  6. var oBox = document.querySelector('#box');
  7.         
  8. oBox.onclick = function () {
  9. alert('123');
  10. }
  11. </script>
    当我点击div中的p标签时,也会触发onclick,这是为什么?
    因为事件会一直往上传递,p -> div(触发)->body ->document

冒泡事件是默认事件,但有些情况,冒泡事件是一种麻烦的事情。如:

  1. <div id="box">
  2. <p class="detail">
  3. 我是detail!
  4. </p>
  5. </div>
    //我的目的本来是,点击div弹出p标签,点击document时隐藏p标签。
  6. var oBox =document.querySelector('#box');
  7. var oP = oBox.children[0];
  8. //我点击oBox时弹出p标签
  9. oBox.onclick = function () {
  10. oP.style.display = 'block';
  11. };
  12. //但随着冒泡的传递,到了document时,也会触发document标签的点击事件,然后p标签刚出现的瞬间又隐藏了
  13. document.onclick = function () {
  14. oP.style.display = 'none';
  15. oP.style.display = 'none';
  16. };

这时候需要把默认事件去掉

cancelBubble = false 或者 stopPropagation();

  1. //上述的oBox的点击事件改成
  2. oBox.onclick = function (e) {
  3. oP.style.display = 'block';
  4. e = e||window.event;
  5. e.cancelBubble = true;
  6. 或者 e.stopPropagation();
  7. };
    另外:
  1. e.cancelBubble = true;是兼容所有浏览器的
    e.stopPropagation() 不兼容IE8以下,所以一般都推荐第一种
  1.  

 

2 onmouseenter/onmouseleave 和onmouseover/onmouseout区别

  1. <div id="box1">1
  2. <div id="box2">2
  3. <div id="box3">3</div>
  4. </div>
  5. </div>
  6. <script>
  7. var oB1 = document.querySelector('#box1');
  8. oB1.onmouseenter=function () {
  9. console.log('enter');
  10. }
  11. oB1.onmouseleave=function () {
  12. console.log('leave');
  13. }
  14. /*oB1.onmouseover=function () {
  15. console.log('over');
  16. }
  17. oB1.onmouseout=function () {
  18. console.log('out');
  19. }*/
  20. </script>

 onmouseenter/onmouseleave:在移入到子元素时会触发;

当鼠标从外部移入3触发onmouseenter ,再移入2触发(3的onmouseleave)和(2的onmouseenter),在移入1触发(2的onmouseleave)和(1的onmouseenter);

onmouseover/onmouseout:不会受子元素影响

当鼠标同上移入3触发onmouseover,但继续移入到2和1中时,并不会触发onmouseover事件,当鼠标移出3到外部时才触发onmouseleave。

 

3 阻止默认事件 (两种方法)

1> event.preventDefault();

2>return false;

return false:相当于 event.preventDefault() + event.cancelBubble = false + event.stopPrapagation() 的集合;

 

4 键盘事件

事件:onkeydown 、 onkeypress 、onkeyup

键值:event.keyCode

  1. document.onkeydown = function (e) {
  2. e = e||window.event;
  3. console.log( e.keyCode );
  4. if (e.keyCode === 116){
  5. e.preventDefault();
  6. }
  7. }

onkeydown:
按下时触发,假设不抬起,会持续(多次)触发
onkeypress:
和onkeydown类似,但是只响应能键入值的键(比如ctrl 是不能键入值的,所以不能响应)

onkeyup:
抬起键时触发,一次抬起触发一次

又:

onkeydown在键入值之前触发
onkeyup在键入值之后触发

  1. <input type="text" id="txt" />
  2. <script>
  3. var oTxt = document.querySelector('#txt');
  4. /*
  5. oTxt.onkeydown = function (e) {
  6. console.log( this.value );
  7. }*/
  8. oTxt.onkeyup = function (e) {
  9. console.log( this.value );
  10. }
  11. </script>

在input框中:

oTxt.onkeydown: 依次输入1,2,3,4        console中依次出现:1,12,123。 也就是说知道按下一个键时,才会触发上一个事件

oTxt.onkeyup: 依次输入1,2,3,4             console中依次出现:1,12,123, 1234。是同步进行的。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号