jQuery知识点总结(五)
事件冒泡和默认行为
- 什么是事件冒泡?
当给子级一个事件的时候,子级的事件会传递给父级,父级也会执行这个事件
- 如何阻止事件冒泡
在子级的事件函数内加上return false;
如果子级有event参数传入可以在子级的事件函数内加上event.stopPropagation( );
- 什么是默认行为
默认行为就是没有添加但是本身就拥有的行为,比如a标签、submit按钮点击会跳转页面
- 如何阻止默认行为
在事件函数内加上return false;
如果有event参数传入可以在事件函数内加上event.preventDefault( );
事件自动触发
trigge( )和triggerHandler( )都会自动触发事件。
trigger
- 不会阻止默认行为以及事件冒泡
注意!如果已经在事件函数内阻止了事件冒泡或者默认行为,trigger同样也会阻止
triggerHandler
- 会阻止默认行为以及事件冒泡
重点!!"< a >" 标签使用trigger或者是triggerHandler都不会触发默认事件
触发默认事件的解决办法:给"< a >“标签里面添加一个”< span >"标签,$(“span”).trigger(“click”)。
自定义事件
- 自定义事件要用对象.on(“事件”,函数)来定义
- 用trigger或者triggerHandler来调用
<script>
$(function()
{
//给按钮添加一个自定义事件
$("button").on("MyClick",function()
{
alert("我是自定义事件")
})
//调用自定义事件
$("button").trigger("MyClick");
})
</script>
<body>
<button>点击</button>
</body>
事件命名空间
-
添加事件的命名空间 click.自定义的命名空间
-
触发条件
- 事件是用on绑定的
- 事件通过trigger触发
以下程序给子级绑定了click,click.1事件,也给父级绑定了click,click.1事件,此时点击son会触发所有点击事件,点击father会触发father的点击事件
<script>
$(function()
{
$(".son").on("click.1",function()
{
alert("son click.1");
})
$(".son").on("click",function()
{
alert("son click");
})
$(".father").on("click",function()
{
alert("fath click");
})
$(".father").on("click.1",function()
{
alert("father click.1");
})
</script>
<body>
<div class="father">
<div class="son"></div>
</div>
</body>
- $(".son").trigger(“click”);
此时也会触发所有点击事件(先触发click.1事件,因为这个事件先添加的)
- $(".father").trigger(“click.1”);
只会触发father的click.1的点击事件,不会触发father的click事件
- $(".son").trigger(“click.1”);
触发son的点击事件以及father同名(click.1)的点击事件,不会触发father的click事件
事件委托
当我们在页面加载完毕之后添加DOM元素,该DOM元素不会执行入口函数中的函数,此时我们需要事件委托,将监听事件交给加载好的DOM元素。
以下程序点击按钮会新增一个li,点击li会在控制台打印li的内容
<script>
$(function()
{
//点击按钮新增li
$("button").on("click",function()
{
$("ul").append("<li>我是新增的li</li>");
})
//jQuery中如果找到的元素不止一个,那么jQuery会遍历所有找到的元素并给他们添加事件
$("ul>li").on("click",function()
{
console.log($(this).html());
})
//事件委托
$("ul").delegate("li","click",function()
{
console.log($(this).html()); //this指的就是点击的li,不是ul(li将事件传递给ul的)
})
})
</script>
<body>
<ul>
<li>我是第1个li</li>
<li>我是第2个li</li>
<li>我是第3个li</li>
</ul>
<button>新增li</button>
</body>
注意! 当我们新增li之后,点击新增的li控制台不会打印新增的li
原因: jQuery入口函数是在所有DOM元素加载完成之后执行的,这里新增的li是在DOM元素
加载完毕之后(入口函数执行之后)新增的,所以新增的li没有click事件
解决: 将监听click事件的任务交给父元素,当点击新增的li时,click事件会传递给父元素
父元素响应click事件,最终新增的li会执行click事件
!!!!现在用on来替代delegate
$(“ul”).delegate(“li”,“click”,function(){})
$(“ul”).on(“click”,“li”,function(){})
事件委托练习
点击登录弹出登录框,点击关闭关闭登录框
<style>
.loginback{
width: 100%;
height: 100%;
position: fixed;
top: 0;
left: 0;
background: rgb(0,0,0,0.5);
}
body{
width: 99%;
height: 100%;
}
.login{
width: 500px;
height: 300px;
border: 5px solid black;
position: relative;
margin: 100px auto;
}
span{
width: 50px;
height: 50px;
position: absolute;
right: 0;
top: 0;
background-color: blue;
}
</style>
<script src="../jquery-1.12.4.min.js"></script>
<script>
$(function()
{
//点击弹出登录框
$("a").on("click",function()
{
var $login=$(
'<div class="loginback">'+
' <div class="login">'+
' <span>关闭</span>'+
' </div>'+
'</div>')
$("body").append($login);
//点击关闭关闭登录框(span的click委托给body监听)
$("body").delegate(".login>span","click",function()
{
$login.remove();
})
return false;
})
})
</script>
<body>
<a href="http://www.baidu.com">登录</a>
<div></div>
</body>