HTML 学习笔记 JQuery(事件)
加载DOM
以浏览器加载文档为例,在页面加载完毕后,浏览器会通过JavaScript为DOM元素添加事件。在常规的JavaScript中,通常使用window.onload方法,在JQuery中通常使用$(document).ready()方法。$(document).ready()方法是事件模块中的一个重要的函数。可以极大的提高web应用程序的响应速度。JQuery就使用$(document).ready()就是用来替代window.onload的。通过使用该方法,可以在DOM载入就绪时就对齐进行操纵并调用执行它所绑定的函数。再使用过程中,需要注意$(document).ready()方法和window.onload之间的细微区别。
执行时机
$(document).ready()方法和window.onload方法有相似的功能,但是其执行时机方面是有区别的。window.onload方法是在网页中所有的元素(包括元素的所有关联文件)完全加载到浏览器后才执行。即JavaScript此时才访问网页中的任何元素。而通过$(document).ready()方法注册的事件处理程序,在DOM完全就绪时就可以被调用。此时,网页的所有元素对JQuery而言都是可以访问的。但是这并不意味着这些元素关联的文件都已经下载完毕。
由于这个特性,比如我们要对加载的图片进行操作的时候,DOM树加载完毕时,图片可能还没被下载。这个时候,如果你想获取图片的高度等信息 不一定有效。这是可以用到另一个方法load()。load()方法会在元素的onload事件中绑定一个处理函数。如果处理函数绑定到window对象,则会在所有对象加载完毕后触发。如果处理函数绑定在元素上,则会在元素内容加载完毕后触发。
$(window).load(function() {
//编写代码
});
window.onload = function() {
//编写代码
};
上面的代码是等价的。
多次使用
假设网页中有两个函数,在JavaScript中的代码如下
function one() { }
function two() { }
window.onload = one;
window.onload = two;
在JavaScript中这样的代码 只会执行函数two里面的代码,函数one不被执行的原因是Javascript的onload事件一次只能保存对一个函数的引用,他会自动用后面的函数覆盖前面的函数,因此不能再现有的行为上添加新的行为。
为了达到两个函数顺序触发的效果 只能在创建一个新的Javascript方法来实现。
window.onload = function() {
one();
two();
};
这样写有些需求还是满足不了,例如多个JavaScript文件,每个文件都要用到window.onload方法,这种情况下用上面的代码会非常麻烦。而JQuery的$(document).ready()方法能够很好的处理这些情况,每次调用$(document).ready()方法都会在现有的行为上添加新的行为,这些行为会根据注册的顺序依次执行。例如 如下JQuery代码
function one() {
alert("one");
}
function two() {
alert("two");
}
$(document).ready(function() {
one();
});
$(document).ready(function() {
two();
});
简写方式
$(document).ready(function() {
two();
});
$(function() {
two();
})
$().ready(function(){
two();
});
这几种写法是等价的。
事件绑定
在文档加载完成后,如果打算为元素绑定事件来完成某项操作,可以使用bind()方法来对匹配元素进行特定事件的绑定,bind()方法的调用格式为
bind(type [,data],fn);
bind()方法有三个参数 说明如下
第一个参数是事件的类型,类型包括:blur focus load resize scroll unload click dbclick mouseddown mousemove mouseout等等。
第二个参数是可选参数 作为event.data属性值传递给事件对象的额外数据对象
第三个参数则是用来绑定的处理函数。
基本效果
下面通过一个示例来了解bind()方法的用法
假设网页中又一个FAQ 单击标题 链接内容显示
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style>
.head {
background-color: darkgray;
}
.content {
display: none;
}
</style>
<script src="../js/jquery-2.1.1.min.js"></script>
</head>
<body>
<div id="panel">
<h5 class="head">什么是JQuery?</h5>
<div class="content">
JQuery是继prototype之后又一个优秀的JavaScript库。
</div>
</div> <script>
$(function() {
$("#panel h5.head").bind("click",function() {
var $content = $(this).next("div.content");
if ($content.is(":visible")) {
$content.hide();
}else {
$content.show();
}
});
});
</script>
</body>
</html>
bind()方法和$(document).ready()方法一样 也可以多次调用
改变事件的绑定类型
$(function() {
$("#panel h5.head").bind("mouseover",function() {
var $content = $(this).next("div.content");
if ($content.is(":visible")) {
$content.hide();
}else {
$content.show();
}
});
})
简写绑定事件
<script>
$(function() {
$("#panel h5.head").click(function() {
var $content = $(this).next("div.content");
if ($content.is(":visible")) {
$(this).next("div.content").hide();
}else {
$(this).next("div.content").show();
}
});
});
$(function() {
$("#panel h5.head").mouseover(function() {
var $content = $(this).next("div.content");
if ($content.is(":visible")) {
$content.hide();
}else {
$content.show();
}
});
})
</script>
合成事件
JQuery中有两个合成事件---hover()和toggle()方法,类似于前面讲过的ready()方法,hover()方法和toggle()方法都属于JQuery的自动移方法。
hover()方法
语法
hover(enter,leave)
hover()方法用于模拟光标悬停事件。当光标移动到元素上时,会触发指定的第一个函数(enter),当光标移出这个元素时,会触发指定的第二个函数(lever)
例如将上面的例子 可以这样写
$(function() {
var $content = $("#panel div.content");
$("#panel h5.head").hover(function() {
$content.show();
},function() {
$content.hide();
});
});
注意:CSS中有伪类选择器 例如":hover" 当用户光标停在元素上的时候,可以改变元素的外观,大多数浏览器中 伪类选择器可以用于任何元素,然而在IE6中 不支持这种选择器 ,可以使用JQuery的hover()方法代替。
2. toggle()方法
语法
toggle(fn1,fn2,.....fnN)
toggle()方法用于模拟鼠标的连续点击事件。第一次单击元素 触发指定的第一个函数(fn1) 当再次点击同一个元素的时候,则触发第二个函数(fn2),如果有更多的函数,则依次触发。直到最后一个。
$(function() {
$("#panel h5.head").click(function(){
$(this).next("div.content").toggle();
});
});
由于事件的冒泡或者捕捉如果有很多个元素绑定事件的话,点击其中的一个很可能会响应多个,造成不必要的麻烦。这个时候我们会阻止事件的冒泡行为,或者阻止事件的默认行为。要做到这些必须先了解事件对象event
事件对象
由IE-DOM 和标准DOM实现事件对象的方法各不相同,导致在不同的浏览器中获取事件的对象比较麻烦,针对这个问题,JQuery进行了必要的扩展和封装,从而使得任何浏览器都能很轻松的获取事件对象以及事件对象的一些属性
在程序中使用事件对象非常简单,只需要为函数添加一个参数,代码如下
$("element").click(function(event)
这样当点击了"element"元素时,事件对象就被创建了,这个事件对象只有事件处理函数才能访问到。事件处理函数执行完毕后,事件的对象就被销毁。
停止事件冒泡
停止事件冒泡可以阻止事件中其他对象的事件处理函数被执行 使用方法stopPropagation()方法来停止事件冒泡
$("#panel h5.head").click(function(event){
event.stopPropagation();
$(this).next("div.content").toggle();
});
阻止事件的默认行为
网页中的元素有自己的默认行为 比如点击链接跳转 有时需要阻止元素的默认事件
在Jquery中使用preventDefault()方法来阻止事件的默认行为.
简写形式
event.stopPropagation();
return false;
event.preventDefault();
return false;
事件对象的属性
event.type()方法
该方法的作用是可以获取到事件的类型
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script src="../js/jquery-2.1.1.min.js"></script> </head>
<body>
<p id="eventP">事件对象demo</p> <script>
$("#eventP").click(function(event) {
alert(event.type);
});
</script> </body>
</html>
提示结果"click"
event.preventDefault()方法
阻止事件的默认行为 例如 点击标签a 不发生跳转
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script src="../js/jquery-2.1.1.min.js"></script> </head>
<body>
<p id="eventP">事件对象demo</p>
<a id="evnetA" href="http://www.baidu.com">百度一下</a>
<script>
$("#eventP").click(function(event) {
alert(event.type);
});
$("#evnetA").click(function(event){
event.preventDefault();
//或者 这两句代码一句就行
return false;
})
</script> </body>
</html>
3. event.stopPropagation()阻止事件的冒泡行为
4.event.target()方法
event.target()方法的作用就是获取到触发事件的元素。
例如
$("#eventP").click(function(event) { alert(event.type); alert(event.target.getAttribute("id"));//eventP });
event.relatedTarget()方法
在标准的DOM中,mouseover 和 mouseout所发生的元素可以通过event.target()方法来访问,相关元素是通过event.relatedTarget()方法来访问的。event.relatedTarget()方法在mouseover中相当于IE浏览器的event.fromElement()方法,在mouseout中相当于IE浏览器的event.toElement方法。
event.pageX 和 event.pageY方法
该方法的作用是获取到光标相对于页面的x坐标和y坐标。如果没有使用JQuery时,那么IE浏览器中是用event.x()和event.y()方法 而在Firefox中是用event.pageX()和event.pageY()。如果页面上有滚动条 则还要加上滚动条的高度或者宽度,在IE浏览器中默认减去2px的边框。
event.which()方法
该方法的作用是在鼠标单击事件中获取到鼠标的左 中 右键:在键盘事件中获取键盘的按键
$("#eventP").click(function(event) {
// alert(event.type);
// alert(event.target.getAttribute("id"));//eventP
alert(event.which)//1 鼠标左键 2 鼠标中键 3鼠标右键
});
event.metakey()方法
针对不同的浏览器对键盘中的<ctrl>按键的解释不同,JQuery也进行了封装,并规定event.matekey()方法获取键盘事件中的<ctrl>键。
event.originalEvent()方法
该方法的作用是指向原石的事件对象。
可以为同一个元素绑定多个事件,也可以为多个元素绑定同一个事件。假设网页上有一个<button>元素,使用以下代码为该元素绑定相同的事件
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script src="../js/jquery-2.1.1.min.js"></script> </head>
<body>
<button id="test">点我哦</button>
<script>
$("#test").click(function() {
$(this).append("<p>我的绑定函数</p>")
}).click(function() {
$(this).append("<p>我的绑定函数2</p>")
}).click(function() {
$(this).append("<p>我的绑定函数3</p>")
});
</script>
</body>
</html>
点击按钮后
移除按钮上以前注册的函数
首先在网页上添加一个移除事件的按钮
$("#delteAll").click(function() {
$("#test").unbind("click");
});
添加这些按钮id为deteleAll 写上如上代码 id为test的按钮 不再会有click事件。
下面来看一看unbind()方法的语法结构
unbind([type][,data]);
第一个参数为事件类型 第二个参数为要移除的函数 具体说明如下
(1)如果没有参数 移除所有的绑定的事件
(2)如果提供了事件类型作为参数 则只删除该类型的绑定事件
(3)如果 把在绑定时传递的处理函数作为第二个参数,则只有这个特定的事件处理函数被删除。
移除button元素的七种一个事件。
首先要为这些匿名处理函数指定一个变量
例如 下面的JQuery代码
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script src="../js/jquery-2.1.1.min.js"></script> </head>
<body>
<button id="test">点我哦</button>
<button id="delteAll">移除按钮事件</button>
<script>
$("#test").click(myFunction1 = function() {
$(this).append("<p>我的绑定函数</p>")
}).click(myFunction2 = function() {
$(this).append("<p>我的绑定函数2</p>")
}).click(myFunction3 = function() {
$(this).append("<p>我的绑定函数3</p>")
});
//删除某一个事件
$("#delteAll").click(function() {
$("#test").unbind("click",myFunction1);
});
</script>
</body>
</html>
先点击删除事件 再点击测试按钮 效果如下 绑定函数1被移除
另外对于只需要触发一次,随后就需要立即解除绑定的情况,JQuery提供了一种简写方法:one()方法。
one()方法的结构与bind()方法类似,使用方法也与bind()方法相同,语法如下
one(type [data],fn)
示例代码如下:
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script src="../js/jquery-2.1.1.min.js"></script>
</head>
<body>
<button id="oneBtn">执行一次就取消绑定的按钮</button>
<script>
$("#oneBtn").one("click",function() {
$(this).append("<p>执行一次就被销毁</p>");
});
</script>
</body>
</html>
使用one()方法绑定的事件处理函数,只在用户点击第一次时有作用,之后点击毫无作用。
模拟操作
以上的例子都是用户通过点击按钮 才能触发click事件,但是有时,需要通过模拟用户操作,来达到单机的效果。例如:在用户进入页面后,就触发click事件,而不需要用户主动去单机。(就是进入页面后主动调用一次)
在JQuery中可以通过trigger()方法来完成模拟操作。例如可以使用下面的代码来触发id为btn的按钮的click事件。
$("#btn").click(function() {
alert("不用点击 通过trigger()函数 模拟点击");
});
$("#btn").trigger("click");
这样当页面加载完毕以后,就会立即弹出来一个窗口。
也可以使用期简化写法click(),来达到同样的效果
//$("#btn").trigger("click");
$("#btn").click();//与上面的代码一样的效果。
触发自定义事件
trigger()方法不仅能触发浏览器支持的具有相同名称的事件,也可以触发自定义名称的事件。
例如为函数绑定一个"myClick"事件 JQuery代码如下:
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script src="../js/jquery-2.1.1.min.js"></script>
</head>
<body>
<button id="oneBtn">执行一次就取消绑定的按钮</button>
<button id="btn">模拟事件</button>
<button id="MyClick">模拟自定义事件</button>
<script>
$("#oneBtn").one("click",function() {
$(this).append("<p>执行一次就被销毁</p>");
});
$("#btn").click(function() {
alert("不用点击 通过trigger()函数 模拟点击");
});
// $("#btn").trigger("click");
$("#btn").click();
$("#MyClick").bind("myClick",function() {
alert("模拟用户触发自定义事件");
});
$("#MyClick").trigger("myClick");
</script>
</body>
</html>
传递数据
trigger(type [,data])方法有两个参数,第一个参数就是要触发的事件类型,第二个参数就是要传递给事件处理函数的附加数据。以数组的形势传递。通常可以传递一个参数给毁掉函数来区别这次事件是代码触发还是用户触发的。
例子:
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script src="../js/jquery-2.1.1.min.js"></script>
</head>
<body>
<button id="trigger">传递数据</button>
<script>
$("#trigger").bind("myClick",function(event,message1,message2) {
alert(message1 +message2);
});
$("#trigger").trigger("myClick",["我的自定义事件","我们是传递的参数"]);
</script>
</body>
</html>
执行默认的操作
trigger()方法触发事件后 会执行浏览器默认的操作
$("input").trigger("focus");
以上代码不仅会触发为<input>元素绑定的focus事件,也会使<input>元素本很得到焦点(这是浏览器的默认操作)
如果只想触发绑定的focus事件,而不想执行浏览器默认操作。可以使用JQuery中另一个类似的方法。 triggerHandler()方法。
$("input").trigger("focus");//执行两次 一次模拟 一次浏览器默认
//只会触发<input>元素上绑定的特定事件,同时取消浏览器对此事件的默认操作
$("input").triggerHandler("focus");//只执行用户模拟的一次
其他用法
绑定多个事件类型
例如可以为一个元素绑定多个事件类型 为id是 moreEventType 添加多个类型的事件。
$("#moreEventType").bind("click mouseout",function(){
$(this).toggleClass("over");
});
添加命名空间 便于管理
例如可以把为元素绑定的多个事件类型用命名空间规范起来,JQuery代码如下
$(function() {
$("div").bind("click.plugin",function() {
$("body").append("<p>click点击事件</p>")
});
$("div").bind("mouseover.plugin",function() {
$("body").append("<p>mouseover事件</p>");
});
$("div").dblclick(function() {
$("body").append("<p>dbClick事件</p>");
});
$("#trigger").click(function() {
$("div").unbind(".plugin");
});
});
在所有绑定的事件类型的后面添加命名空间,这样在删除事件时只需要指定命名空间就好,而不在命名空间内的dbclick事件仍然存在。
删除多个事件也可以使用链式代码
$("div").unbind("click").unbind("mousemove");
相同事件名称,不同命名空间执行方法
例如可以为元素绑定相同的事件类型,然后以命名空间的不同按需调用,代码如下
$(function() {
$("div").bind("click",function() {
$("body").append("<p>click事件</p>");
});
$("div").bind("click.plugin",function() {
$("body").append("<p>click.plugin事件</p>");
});
$("#trigger").click(function() {
$("div").trigger("click!");//注意感叹号;
});
});
当点击div元素是两者都触发,当点击按钮时只触发click事件。!表示只匹配不包含在命名空间里的方法。去掉!两者都会执行。
HTML 学习笔记 JQuery(事件)的更多相关文章
- 4月12日学习笔记——jQuery事件
下面是在 jQuery 中最常使用的 bind()方法举例:$("#testDiv4").bind("click", showMsg); 我们为 id 是 te ...
- 学习笔记---Javascript事件Event、IE浏览器下的拖拽效果
学习笔记---Javascript事件Event.IE浏览器下的拖拽效果 1. 关于event常用属性有returnValue(是否允许事件处理继续进行, false为停止继续操作).srcE ...
- 学习笔记--jQuery基础
学习笔记也算总结知识点,有些示例可能没有具体到元素,直接给出的语法.大家有基本理解在看可能会好些. jQuery使用前提,需要安装jQuery库 jQuery 库是一个 JavaScript 文件,您 ...
- Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle<T>
Caliburn.Micro学习笔记目录 今天 说一下Caliburn.Micro的IEventAggregator和IHandle<T>分成两篇去讲这一篇写一个简单的例子 看一它的的实现 ...
- iOS学习笔记--触摸事件
最近空闲时间在学习iOS相关知识,几周没有更新文章了,今天总结下这些天的学习内容,也整理下iOS的学习笔记,以便以后查阅翻看- iOS中的事件可以分为3大类型: 触摸事件 加速计事件 远程控制事件 响 ...
- [JS学习笔记]Javascript事件阶段:捕获、目标、冒泡
当你在浏览器上点击一个按钮时,点击的事件不仅仅发生在按钮上,同时点击的还有这个按钮的容器元素,甚至也点击了整个页面. 事件流 事件流描述了从页面接收事件的顺序,但在浏览器发展到第四代时,浏览器开发团队 ...
- vue学习笔记(四)事件处理器
前言 在上一章vue学习笔记(三)class和style绑定的内容中,我们学习了如何在vue中绑定class和style,介绍了常用的绑定方法,class的数组绑定和对象绑定以及style的数组绑定和 ...
- JavaScript高级程序设计学习笔记之事件
1.事件流 事件流描述的是从页面中接收事件的顺序. 事件冒泡 IE的事件流叫做事件冒泡(event bubbling),即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播 ...
- jQuery学习笔记(事件)
1. 加载DOM jQuery用$(document).ready()方法来代替传统JavaScrpt的window.onload方法.但它们执行时机有所不同,window.onload在网页所有元素 ...
随机推荐
- 基于VUE开发项目
前言 最近由于公司需要,需要写一个相对来说比较大型的后台管理系统.为了保证管理系统操作体验较为舒适并且项目后期益于维护,最后决定基于VUE全家桶来开发一个高度组件化的单页SPA应用. 技术选型 vue ...
- 2016北京集训测试赛(十四)Problem B: 股神小D
Solution 正解是一个\(\log\)的link-cut tree. 将一条边拆成两个事件, 按照事件排序, link-cut tree维护联通块大小即可. link-cut tree维护子树大 ...
- 调参tips
对于一个模型,都可以从以下几个方面进行调参: 1. 对weight和bias进行初始化(效果很好,一般都可以提升1-2%) Point 1 (CNN): for conv in self.convs1 ...
- Jackson是线程安全的吗
网上说是线程安全的,内部代码用了ThreadLocal.Synchronized这些线程安全类和关键字,可以放心的用. 避免每次使用都new一个,全局配置一个ObjectManager的对象将大大减少 ...
- Docker 存储引擎
可插拔存储引擎架构 这种可插拔式的存储架构.可以让你很灵活的去选择适合自己环境的存储引擎. 每个存储引擎都是以Linux 文件系统为基础的.此外,每个存储引擎都以自己的方式自由的管理image ...
- smartsvn学习(三) Error validating server certificate for
Error validating server certificate for 'xxxxxxxxxxxx:443': - The certificate is not issued by a tr ...
- BF3 里面的z cull reverse reload
Bf3 siggraph2011的 分享 http://advances.realtimerendering.com/s2011/White,%20BarreBrisebois-%20Renderin ...
- DB2和MySQL常用SQL整理
1.Truncate删除表中所有数据 truncate table USER immediate; 说明:Truncate是一个能够快速清空资料表内所有资料的SQL语法.并且能针对具有自动递增值的字段 ...
- lampp、xampp安装文档
第一步:去官网 看这个介绍http://www.apachefriends.org/zh_cn/xampp-linux.html#1677 第二步:下载安装包 2.1 要区分Linux是32位还是64 ...
- Django和Flask的区别以及运行流程
Django: Python Web框架里比较有名当属Django,Django功能全面,它提供一站式解决方案,集成了MVT(Model-View-Template)和ORM,以及后台管理.但是缺点也 ...