4.1 《锋利的jQuery》jQuery中的事件

  1. $(document).ready()方法和window.onload方法的区别
  2. 事件绑定
  3. 合成事件
  4. 事件冒泡
  5. 事件对象的属性

tip1:停止事件冒泡和阻止默认行为都可以用return false替代。只有当你同时需要preventDefault和stopPropagation,并且你的代码可以接受直到你的回调执行完成才停止执行浏览器的默认行为,那你就可以使用”return false“。

tip2:jquery不支持事件捕获。

tip3:hover()方法准确说是替代jquery中的bind("mouseenter")和bind("mouseleave"),而不是替代bind("mouseover")和bind("mouseout"),所以,当要触发hover方法的第二个函数时需要用trigger("mouseleave");

tip4:jquery1.7版本新增了on(),off(),delegate()和undelegate()事件绑定

1、$(document).ready()方法和window.onload方法的区别

    $(document).ready(function(){
        //代码
    })
//    简写
//    $(function () {
//        //代码
//    });

    window.onload=function(){
        //代码
    }
//    等价于
//    $(window).load(function(){
//        //代码
//    })

①执行时机:前者在DOM完全就绪时就可以被调用,后者是在网页中所有元素(包括元素的所有关联文件)完全加载到浏览器后才执行,即javascript此时才可以访问网页中的任何元素。(注意:前者当与图片有关的HTML已经解析为DOM树了,但有可能图片未加载完毕,图片的高度和宽度此时不一定有效,这时候使用load()方法,相当于js的onload())

②多次使用:后者javascript的onload事件一次只能保存对一个函数的引用。前者可以按顺序依次执行。

2、事件绑定

(1)改变绑定事件类型

(2)简写绑定事件

3、合成事件

(1)hover()

(2)toggle()

  $(function(){
//         事件绑定
//       $("#panel h5.head").bind("click",function(){
//           var $content=$(this).next();  //当发现相同的选择器在代码里出现多次时,用变量把它缓存起来。
//           if($content.is(":visible")){
//               $content.hide();
//           }else{
//               $content.show();
//           }
//       })
//      改变绑定事件
//        $("#panel h5.head").bind("mouseover",function(){
//            $(this).next().show();
//        }).bind("mouseout",function(){
//            $(this).next().hide();
//        });
//       简写绑定事件
//       $("#panel h5.head").mouseover(function(){
//           $(this).next().show();
//       }).mouseout(function(){
//           $(this).next().hide();
//       })
//       合成事件hover()
//       $("#panel h5.head").hover(function(){
//           $(this).next().show();
//       },function(){
//           $(this).next().hide();
//       })
//       toggle()
//       $("#panel h5.head").toggle(function(){   //jquery从1.9版本以上就不支持toggle()方法
//           $(this).next().show()
//       },function(){
//           $(this).next().hide();
//       })
//        toggle()还有另一个作用:切换元素的可见状态
       $("#panel h5.head").click(function(){
           $(this).next().toggle();
       })
   });

4、事件冒泡

 

当<span>、<div>、<body>同时绑定了click事件,在单击<span>元素的同时,<div>和<body>的click事件也同时触发了。

解决办法:

$("span").bind("click",function(event){
           var txt=$("#msg").html()+"<p>内层span元素被单击</p>";
           $("#msg").html(txt);
           event.stopPropagation(); //停止事件冒泡
       });

阻止默认行为:例如,单击超链接后会跳转,单击“提交”type=submit表单会提交:

   $(function(){
        $("#sub").bind("click",function(event){
            var username=$("#username").val();
            if(username==""){
                $("#msg").html("<p>文本框的值不能为空。</p>")
                event.preventDefault(); //阻止表单提交
            }
        })
   });

5、事件对象的属性

event.type

event.preventDefault

event.stopPropagation

event.target

event.relatedTarget

event.pageX和event.pageY

event.which

event.metaKey

..........

6、移除事件

    $(function () {
//        $("#btn").bind("click",function(){
//            $("#test").append("<p>我的绑定行数1</p>");
//        }).bind("click",function(){
//            $("#test").append("<p>我的绑定行数2</p>");
//        }).bind("click",function(){
//            $("#test").append("<p>我的绑定行数3</p>");
//        });
//        $("#delAll").click(function(){
//           $("#btn").unbind("click");  //$("#btn").unbind("");
//        });
//        删除其中一个事件
        $("#btn").bind("click",myFun1=function(){
            $("#test").append("<p>我的绑定行数1</p>");
        }).bind("click",myFun2=function(){
            $("#test").append("<p>我的绑定行数2</p>");
        }).bind("click",myFun3=function(){
            $("#test").append("<p>我的绑定行数3</p>");
        }).one("click",function(){       //one()方法只触发一次,随后立即解除绑定
            $("#test").append("<p>我的绑定行数4</p>");
        });
        $("#delTwo").click(function(){
            $("#btn").unbind("click",myFun2);
        });
    });

7、模拟操作

//******************************************常用模拟
        $("#btn").bind("click", function () {
            $("#test").append("<p>我的绑定行数1</p>");
        });
//******************************************自定义事件
        $("#btn").bind("myClick",function(){
            $("#test").append("<p>我的绑定行数myClick</p>");
        })
//******************************************传递数据
        $("#btn").bind("myClick1",function(event,message1,message2){
            $("#test").append("<p>我的传参:"+message1+message2+"</p>");
        })
//        页面一加载就触发click事件
        $("#btn").trigger("click"); // 等价于
//        $("#btn").click();
//        页面一加载触发自定义myClick事件
        $("#btn").trigger("myClick");
//        触发传参事件
        $("#btn").trigger("myClick1",["我的自定义","事件"]);
    });

初始化效果:

执行默认操作

trigger()方法触发事件后,会执行浏览器默认操作。例如:$("input").trigger("focus");不仅会触发为<input>元素绑定的focus事件,也会使<input>元素本身得到焦点(这是浏览器的默认操作),如果只想触发绑定的focus事件,而不想执行浏览器默认操作,可以使用

$("input").triggerHandler("focus");

8、其他用法(添加事件命名空间)

    $(function () {
//    绑定多个事件类型
//        $("#div").bind("mouseover mouseout",function(){
//            $(this).toggleClass("red");
//        })
//        等价于
//        $("#div").bind("mouseover",function(){
//            $(this).toggleClass("red");
//        }).bind("mouseout",function(){
//            $(this).toggleClass("red");
//        })
//        添加事件命名空间
//        $("#div").bind("click.plugin",function(){
//            $("body").append("<p>click事件</p>");
//        });
//        $("#div").bind("mouseover.plugin",function(){
//            $("body").append("<p>mouseover事件</p>");
//        });
//        $("#div").bind("dblclick",function(){
//            $("body").append("<p>dbclick事件</p>");
//        });
//        $("#btn").click(function(){
//            $("#div").unbind(".plugin");
//        });
//        相同事件名称,不同命名空间执行方法
        $("#div").bind("click",function(){
            $("body").append("<p>click事件</p>");
        });
        $("#div").bind("click.plugin",function(){
            $("body").append("<p>click.plugin事件</p>");
        });
        $("#btn").click(function(){
//            $("#div").trigger("click!");  //匹配所有不包含在命名空间中的click方法
            $("#div").trigger("click");  //两者都被触发
        })
    });
原文地址:https://www.cnblogs.com/zhaojieln/p/4240079.html