jQuery 基础学习
这篇文章主要讲了 jQuery 事件的注册,绑定,解绑或者其他方法,jQuery 插件 元素位置操作等
这是初学者写下的笔记,如果错误,欢迎前来指正
jQuery 事件
事件注册
- 事件绑定语法:
element.事件(function() {});
- 事件用 on() 绑定事件
element.on(events,[selector],fn);
- 例如我想绑定一个鼠标点击和鼠标经过事件
$("div").on({
mouseenter: function() {
$(this).css("background","skyblue");
},
click: function() {
$(this).css("background","pink");
}
});
- 1.on 可以绑定多个事件
- 如果你事件处理程序恰好相同 (下面这个例子和事件切换 hover 有点像啊)
$("div").on("mouseover mouseout", function() {});
- 2.on 可以实现事件委派的操作:把原来绑定在子元素的事件绑定在父元素上
$("ul li").click();
// li 触发冒泡到父元素上执行方法
$("ul").on("click", "li", function() {
console.log("noobMing");
});
- 这里事件是绑定在 ul 身上的,但是触发事件的是 li (不用在每个 li 上绑定事件,节约空间)
- on 可以替换老版本的 bind(), live(), delegate() 等方法
- 3.on可以给动态创建的元素绑定事件 (.click 是没有办法绑定 之后动态生成的元素的)
$("ol li").click(function() {
alert("我不能绑定动态元素");
});
$("ol").on("click", "li", function() {
alert("我能绑定动态元素");
});
var li = $("<li>我是后来创建的</li>");
$("ol").append(li);
- 只有绑定事件在创建元素之前的情况 .click 才不能绑定事件,如果写在后面的话两个都可以绑定
- 可能后续版本修复了这个问题,但是还是推荐给动态生成的标签使用 on 来绑定事件
事件解绑
$("div").off();
- 没有参数时是把所有的事件解绑
- 想要解除哪个事件就把那个事件作为参数传进去就可以了
// 解除 click 事件
$("div").off("click");
- 解除事件委托:
$("ul").on("click","li",function() {
alert("这个事件被解除了");
});
// 解除这个事件委托
$("ul").off("click","li");
- 有的事件只想触发一次,可以用
one()
绑定事件,这样绑定的事件只会触发一次
$("div").one("click",function() {
alert("我只能触发一次");
});
自动触发事件
- 像轮播图的自动播放一样,隔一段时间轮播图会自动向下播放一张图片 (自动点击向右的按钮),jQuery 帮我们封装好要用的东西
- 自动触发事件有三种格式:
// 触发元素的点击事件
element.click();
// 自动触发模式
element.trigger("事件");
// 第三种触发模式 (这种触发方式不会触发元素的默认行为)
element.triggerHandler("事件");
- 元素默认行为:例如 input 标签的文本框 (text),用普通事件输入文字后会出现一个一闪一闪的小光标,但是如果使用
triggerHandler
事件以后他就不会触发默认事件 (光标)
事件对象
- 在事件被触发的时候,就会有事件对象的产生
// 这里回调函数里的 event 就是事件对象
element.on(events,[selector],function(event) {});
- 事件对象可以阻止默认行为:
event.preventDefault()
或者return false
- 阻止冒泡:
event.stopPropagation()
jQuery 的其他方法
jQuery 对象拷贝
- 把某个对象给另外一个对象使用,可以使用
$.entend
方法
$.extend([deep],target,obj1,[objN]);
- deep:true 为深拷贝,默认 false 为浅拷贝
- target:要拷贝到的目标对象
- object1:被拷贝的对象
- 如果源对象中已经有同名属性,再向里面拷贝的话会将同名属性给覆盖掉。如果不是同名的会一起被保存到目标对象里
- 深拷贝和浅拷贝的区别:浅拷贝是把被拷贝里面的复杂数据类型的地址拷贝给目标对象 (修改源对象会影响拷贝的对象),而深拷贝是新开辟一个空间储存整个数据对象
- 如果是拷贝复杂数据类型,浅拷贝的话会将同名的复杂数据类型覆盖掉,而深拷贝会将两个复杂数据类型合并起来 (前提是不冲突,冲突之后也会被覆盖掉)
- 例如:
let obj = {
msg: {
name: "noobMing"
}
};
let test = {
msg: {
test: "hello jQuary"
}
};
// 浅拷贝会把整个 msg 覆盖掉
$.extend(obj, test);
console.log(obj);
// 返回 msg: {
// test: "hello jQuary"
// }
// 而深拷贝会像拷贝一样把两个对象合并
$.extend(true, obj, test);
console.log(obj);
// 返回:msg: {
// test: "hello jQuary"
// name: "noobMing"
// }
多库共存
- 当其他库也用
$
做标识符可能会引起冲突 - 解决方法:可以用 jQuery 代替
$
符号 - jQuery 还支持规定新的变量名称,例如:
var xx = $.noConflict()
,就可以使用其他符号替换$
jQuery 插件
图片懒加载
- 可以通过插件 (EasyLasyload.js) 来实现懒加载的效果
- 当我们的页面滑动到可视区域再加载图片
全屏滚动插件
- 全屏滚动的效果:没有滚动条,只是通过按钮或者滚轮来切换页面
- 可以用来做个人简历!
- 这个项目在 Github 上 fullPage.js
案例 toDoList
- 本地储存 localStorage 按下回车还是点击复选框,都是把本地储存的数据加载到页面中,保证即使关闭这个页面也不会丢失数据
- 可以在开发者工具中的 Application 中查看保存的数据
- 本地存储里面只能存储字符串的数据格式,所以要把 JSON 格式的对象转换成字符串格式,需要用到
JSON.stringify()
方法 - 取出时使用
JSON.parse()
转换成对象格式 - 储存数据的方法:
localStorage.setItem();
读出数据的方法:`local - 回车的 keycode 是 13
- 向数组中追加元素的方法
push()
- 当我在写输出部分的时候遇到了一个问题,第一次输出会很正常,但是第二次第三次输出就会把之前的都给输出出来,用 chrome 自带的浏览器 debug 根本不行,我观察到他第一次输出一个,第二次输出两个,所以我判断他是每输出一次就会将本地存储都输出一次,才导致的重复输出,所以只要在每次输出之前将 ol 里面清空就可以避免这个问题的发生
- 在写的时候还有一个小问题是我没有解决的,我把同一个函数绑定到两个事件上的时候,这时同一个事件只能触发一次,然而把两个事件写到一块的时候这个问题就消失了,现在也没有办法重现这个问题
jQuery 尺寸位置操作
尺寸操作
- jQuery 可以得到或设置元素的大小
属性 | 解释 |
width() / height() | 获取元素的宽高值,只算width 和 height |
innerWidth() / innerHeight() | 包含 padding 的宽高 |
outerWidth() / outerHeight() | 包含 padding 和 border 的宽高值 |
outerWidth(true) / outerHeight(true) | 包含 padding border margin 的宽高值 |
- 注意,这些都是方法
- 设置元素大小:
// 获取元素大小 (返回数字形)
$("div").width();
// 设置元素大小
$("div").width(300);
位置操作
- 位置操作主要有三组函数
offset()
,position()
,scrollTop() / scrollLeft()
- offset 返回相对于文档的偏移坐标 (返回的是一个对象,里面有 left 和 top 两个属性)
- 也可以设置距离文档的距离:
$("div").offset({top: 200,left: 200});
- position 可以返回相对于带有定位的父级偏移坐标,如果父级没有定位则以文档为准 (返回的也是一个对象)
- position 只能获取,不能设置 (只读)
- scrollTop() / scrollLeft() 获取元素被卷去的头部和左侧
// 获取整个页面移动的距离
$(document).scrollTop();
- 也可以通过设置参数来让页面滚动到指定位置
- 只有元素才能做动画,所以想让整个页面滚动回文档首时需要写
$("body,html").stop().animate({scrollTop:0})