初始jQuery
<script type="text/javascript">
window.onload = function () {
var btn1 = document.getElementById('btn1')
btn1.onclick = function () {
var username = document.getElementById('username').value
alert(username)
}
}
</script>
<script type="text/javascript" src="js/jquery-1.12.3.js"></script>
<script type="text/javascript">
jQuery(function () {
var $btn2 = $('#btn2')
$btn2.click(function () {
var username = $('#username').val()
alert(username)
})
})
</script>
</head>
<body>
用户名: <input type="text" id="username">
<button id="btn1">确定(原生版)</button>
<button id="btn2">确定(jQuery版)</button>
</body>
jQuery的两把利器
1. jQuery核心函数
* 简称: jQuery函数($/jQuery)
* jQuery库向外直接暴露的就是$/jQuery
* 引入jQuery库后, 直接使用$即可
* 当函数用: $(xxx)
* 当对象用: $.xxx()
2. jQuery核心对象
* 简称: jQuery对象
* 得到jQuery对象: 执行jQuery函数返回的就是jQuery对象
* 使用jQuery对象: $obj.xxx()
console.log($, typeof $)
console.log(jQuery===$)
console.log($() instanceof Object)
核心函数
1. 作为一般函数调用: $(param)
1). 参数为函数 : 当DOM加载完成后,执行此回调函数
2). 参数为选择器字符串: 查找所有匹配的标签, 并将它们封装成jQuery对象
3). 参数为DOM对象: 将dom对象封装成jQuery对象
4). 参数为html标签字符串 (用得少): 创建标签对象并封装成jQuery对象
2. 作为对象使用: $.xxx()
1). $.each() : 隐式遍历数组
2). $.trim() : 去除两端的空格
<div>
<button id="btn">测试</button>
<br/>
<input type="text" name="msg1"/><br/>
<input type="text" name="msg2"/><br/>
</div>
<script src="js/jquery-1.10.1.js" type="text/javascript"></script>
<script type="text/javascript">
$(function () {
$('#btn').click(function () {
alert($(this).html())
$('<input type="text" name="msg3"/><br/>').appendTo('div')
})
})
var arr = [2, 4, 7]
$.each(arr, function (index, item) {
console.log(index, item)
})
var str = ' my atguigu '
console.log('---'+$.trim(str)+'---')
</script>
核心对象
即执行jQuery核心函数返回的对象 jQuery对象内部包含的是dom元素对象的伪数组(可能只有一个元素) jQuery对象拥有很多有用的属性和方法, 让程序员能方便的操作dom
* size()/length: 包含的DOM元素个数
* [index]/get(index): 得到对应位置的DOM元素
* each(): 遍历包含的所有DOM元素
* index(): 得到在所在兄弟元素中的下标
var $buttons = $('button')
console.log($buttons.size(), $buttons.length)
console.log($buttons[1].innerHTML, $buttons.get(1).innerHTML)
$buttons.each(function () {
console.log(this.innerHTML)
})
console.log($('#btn3').index())
伪数组
console.log($buttons instanceof Array)
var weiArr = {}
weiArr.length = 0
weiArr[0] = 'atguigu'
weiArr.length = 1
weiArr[1] = 123
weiArr.length = 2
for (var i = 0; i < weiArr.length; i++) {
var obj = weiArr[i]
console.log(i, obj)
}
console.log(weiArr.forEach, $buttons.forEach)
使用jQuery核心函数
选择器
选择器本身只是一个有特定语法规则的字符串, 没有实质用处 它的基本语法规则使用的就是CSS的选择器语法, 并对基进行了扩展 只有调用$(), 并将选择器作为参数传入才能起作用 $(selector)作用 : 根据选择器规则在整个文档中查找所有匹配的标签的数组, 并封装成jQuery对象返回
基础选择器
<div id="div1" class="box">div1(class="box")</div>
<div id="div2" class="box">div2(class="box")</div>
<div id="div3">div3</div>
<span class="box">span(class="box")</span>
<br>
<ul>
<li>AAAAA</li>
<li title="hello">BBBBB(title="hello")</li>
<li class="box">CCCCC(class="box")</li>
<li title="hello">DDDDDD(title="hello")</li>
</ul>
<script type="text/javascript">
</script>
层次选择器
<ul>
<li>AAAAA</li>
<li class="box">CCCCC</li>
<li title="hello"><span>BBBBB</span></li>
<li title="hello"><span class="box">DDDD</span></li>
<span>EEEEE</span>
</ul>
<script type="text/javascript">
$('ul .box~*').css('background', 'yellow')
</script>
过滤选择器
<div id="div1" class="box">class为box的div1</div>
<div id="div2" class="box">class为box的div2</div>
<div id="div3">div3</div>
<span class="box">class为box的span</span>
<br/>
<ul>
<li>AAAAA</li>
<li title="hello">BBBBB</li>
<li class="box">CCCCC</li>
<li title="hello">DDDDDD</li>
<li title="two">BBBBB</li>
<li style="display:none">我本来是隐藏的</li>
</ul>
<script type="text/javascript">
$('li[title="hello"]').css('background', 'red')
</script>
表单选择器
<form>
用户名: <input type="text"/><br>
密 码: <input type="password"/><br>
爱 好:
<input type="checkbox" checked="checked"/>篮球
<input type="checkbox"/>足球
<input type="checkbox" checked="checked"/>羽毛球 <br>
性 别:
<input type="radio" name="sex" value='male'/>男
<input type="radio" name="sex" value='female'/>女<br>
邮 箱: <input type="text" name="email" disabled="disabled"/><br>
所在地:
<select>
<option value="1">北京</option>
<option value="2" selected="selected">天津</option>
<option value="3">河北</option>
</select><br>
<input type="submit" value="提交"/>
</form>
<script type="text/javascript">
console.log($(':checkbox:checked').length)
$(':submit').click(function () {
var city = $('select>option:selected').html()
city = $('select').val()
alert(city)
})
</script>
练习
代码传送门
工具
- $.each(): 遍历数组或对象中的数据
- $.trim(): 去除字符串两边的空格
- $.type(obj): 得到数据的类型
- $.isArray(obj): 判断是否是数组
- $.isFunction(obj): 判断是否是函数
- $.parseJSON(json) : 解析json字符串转换为js对象/数组
var obj = {
name: 'Tom',
setName: function (name) {
this.name = name
}
}
$.each(obj, function (key, value) {
console.log(key, value)
})
console.log($.type($))
console.log($.isArray($('body')), $.isArray([]))
console.log($.isFunction($))
var json = '{"name":"Tom", "age":12}'
console.log($.parseJSON(json))
json = '[{"name":"Tom", "age":12}, {"name":"JACK", "age":13}]'
console.log($.parseJSON(json))
练习
代码传送门 隐式遍历,添加事件(类比委派添加事件)
var $contents = $('#container>div')
var currIndex = 0
$('#tab>li').click(function () {
$contents[currIndex].style.display = 'none'
var index = $(this).index()
$contents[index].style.display = 'block'
currIndex = index
})
使用jQuery对象
属性
1. 操作任意属性
attr()
removeAttr()
prop()
2. 操作class属性
addClass()
removeClass()
3. 操作HTML代码/文本/值
html()
val()
console.log($('div:first').attr('title'))
$('div').attr('name', 'atguigu')
$('div').removeAttr('title')
$('div').attr('class', 'guiguClass')
$('div').addClass('abc')
$('div').removeClass('guiguClass')
console.log($('li:last').html())
$('li:first').html('<h1>mmmmmmmmm</h1>')
console.log($(':text').val())
$(':text').val('atguigu')
var $checkboxs = $(':checkbox')
$('button:first').click(function () {
$checkboxs.prop('checked', true)
})
CSS
设置css样式/读取css值
css():设置css样式/读取css值
console.log($('p:first').css('color'))
$('p').css('color', 'red')
$('p:eq(1)').css({
color: '#ff0011',
background: 'blue',
width: 300,
height: 30
})
获取/设置标签的位置数据
offset、position
需求:
1. 点击 btn1
打印 div1 相对于页面左上角的位置
打印 div2 相对于页面左上角的位置
打印 div1 相对于父元素左上角的位置
打印 div2 相对于父元素左上角的位置
2. 点击 btn2
设置 div2 相对于页面的左上角的位置
$('#btn1').click(function () {
var offset = $('.div1').offset()
console.log(offset.left, offset.top)
offset = $('.div2').offset()
console.log(offset.left, offset.top)
var position = $('.div1').position()
console.log(position.left, position.top)
position = $('.div2').position()
console.log(position.left, position.top)
})
$('#btn2').click(function () {
$('.div2').offset({
left: 50,
top: 100
})
})
scrollTop()
scrollLeft()
1. scrollTop():
读取/设置滚动条的Y坐标
2. $(document.body).scrollTop()+$(document.documentElement).scrollTop()
读取页面滚动条的Y坐标(兼容chrome和IE)
3. $('body,html').scrollTop(60);
滚动到指定位置(兼容chrome和IE)
$('#btn1').click(function () {
console.log($('div').scrollTop())
console.log($(document.documentElement).scrollTop()+$(document.body).scrollTop())
})
$('#btn2').click(function () {
$('div').scrollTop(200)
$('html,body').scrollTop(300)
})
练习(回到顶部)
代码传送门
获取/设置标签的尺寸数据
1. 内容尺寸
height(): height
width(): width
2. 内部尺寸
innerHeight(): height+padding
innerWidth(): width+padding
3. 外部尺寸
outerHeight(false/true): height+padding+border 如果是true, 加上margin
outerWidth(false/true): width+padding+border 如果是true, 加上margin
筛选
过滤
在jQuery对象中的元素对象数组中过滤出一部分元素来
1. first()
2. last()
3. eq(index|-index)
4. filter(selector)
5. not(selector)
6. has(selector)
var $lis = $('ul>li')
$lis.has('span').css('background', 'red')
查找
在已经匹配出的元素集合中根据选择器查找孩子/父母/兄弟标签
1. children(): 子标签中找
2. find() : 后代标签中找
3. parent() : 父标签
4. prevAll() : 前面所有的兄弟标签
5. nextAll() : 后面所有的兄弟标签
6. siblings() : 前后所有的兄弟标签
var $ul = $('ul')
var $li = $('#cc')
$li.siblings('li').css('background', 'red')
文档
1. 添加/替换元素
* append(content)
向当前匹配的所有元素内部的最后插入指定内容
* prepend(content)
向当前匹配的所有元素内部的最前面插入指定内容
* before(content)
将指定内容插入到当前所有匹配元素的前面
* after(content)
将指定内容插入到当前所有匹配元素的后面替换节点
* replaceWith(content)
用指定内容替换所有匹配的标签删除节点
2. 删除元素
* empty()
删除所有匹配元素的子元素
* remove()
删除所有匹配的元素
var $ul1 = $('#ul1')
$('<span>appendTo()添加的span</span>').appendTo($ul1)
$('<span>prependTo()添加的span</span>').prependTo($ul1)
$ul1.children('li[title=hello]').before('<span>before()添加的span</span>')
$ul1.children('li[title=hello]').after('<span>after()添加的span</span>')
$('#ul2>li[title=hello]').replaceWith('<p>replaceAll()替换的p</p>')
$('#ul2>li').remove()
练习(增删记录)
代码传送门
var $xxx = $('<tr></tr>')
.append('<td>'+empName+'</td>')
.append('<td>'+email+'</td>')
.append('<td>'+salary+'</td>')
.append('<td><a href="deleteEmp?id="'+Date.now()+'>Delete</a></td>')
.appendTo('#employeeTable>tbody')
.find('a')
.click(clickDelete)
$('#employeeTable a').click(clickDelete)
function clickDelete () {
var $tr = $(this).parent().parent()
var name = $tr.children(':first').html()
if(confirm('确定删除'+name+'吗?')) {
$tr.remove()
}
return false
}
事件
绑定、解绑、坐标、相关处理
1. 事件绑定(2种):
* eventName(function(){})
绑定对应事件名的监听, 例如:$('#div').click(function(){});
* on(eventName, funcion(){})
通用的绑定事件监听, 例如:$('#div').on('click', function(){})
* 优缺点:
eventName: 编码方便, 但只能加一个监听, 且有的事件监听不支持
on: 编码不方便, 可以添加多个监听, 且更通用
2. 事件解绑:
* off(eventName)
3. 事件的坐标
* event.clientX, event.clientY 相对于视口的左上角
* event.pageX, event.pageY 相对于页面的左上角
* event.offsetX, event.offsetY 相对于事件元素左上角
4. 事件相关处理
* 停止事件冒泡 : event.stopPropagation()
* 阻止事件默认行为 : event.preventDefault()
$('.out').on('click', function () {
console.log('on click out')
})
$('.inner').hover(function () {
console.log('进入3')
}, function () {
console.log('离开3')
})
$('#btn1').click(function () {
$('.inner').off()
})
$('#btn2').click(function () {
$('.inner').off('mouseenter')
})
$('#btn3').click(function (event) {
console.log(event.offsetX, event.offsetY)
console.log(event.clientX, event.clientY)
console.log(event.pageX, event.pageY)
})
$('.inner').click(function (event) {
console.log('click inner')
event.stopPropagation()
})
$('#test4').click(function (event) {
if(Date.now()%2===0) {
event.preventDefault()
}
})
事件委托
1. 事件委托(委派/代理):
* 将多个子元素(li)的事件监听委托给父辈元素(ul)处理
* 监听回调是加在了父辈元素上
* 当操作任何一个子元素(li)时, 事件会冒泡到父辈元素(ul)
* 父辈元素不会直接处理事件, 而是根据event.target得到发生事件的子元素(li), 通过这个子元素调用事件回调函数
2. 事件委托的2方:
* 委托方: 业主 li
* 被委托方: 中介 ul
3. 使用事件委托的好处
* 添加新的子元素, 自动有事件响应处理
* 减少事件监听的数量: n==>1
4. jQuery的事件委托API
* 设置事件委托: $(parentSelector).delegate(childrenSelector, eventName, callback)
* 移除事件委托: $(parentSelector).undelegate(eventName)
$('ul').delegate('li span', 'click', function () {
$(this).parent().css("background","red")
})
$('#btn1').click(function () {
$('<li></li>')
.append('<span>新增的li span ....</span>')
.appendTo('ul')
})
$('#btn2').click(function () {
$('ul').undelegate('click')
})
代码传送门
面试题
区别mouseover与mouseenter?
* mouseover: 在移入子元素时也会触发, 对应mouseout
* mouseenter: 只在移入当前元素时才触发, 对应mouseleave
hover()使用的就是mouseenter()和mouseleave()
区别on('eventName', fun)与eventName(fun)
* on('eventName', fun): 通用, 但编码麻烦
* eventName(fun): 编码简单, 但有的事件没有对应的方法
练习(轮播图)
代码传送门
效果
淡入淡出
淡入淡出: 不断改变元素的透明度(opacity)来实现的
1. fadeIn(): 带动画的显示
2. fadeOut(): 带动画隐藏
3. fadeToggle(): 带动画切换显示/隐藏
var $div1 = $('.div1')
$('#btn1').click(function () {
$div1.fadeOut(1000, function () {
alert('动画完成了!!!')
})
})
$('#btn2').click(function () {
$div1.fadeIn()
})
$('#btn3').click(function () {
$div1.fadeToggle()
})
滑动
滑动动画: 不断改变元素的高度实现
1. slideDown(): 带动画的展开
2. slideUp(): 带动画的收缩
3. slideToggle(): 带动画的切换展开/收缩
var $div1 = $('.div1')
$('#btn1').click(function () {
$div1.slideUp(3000)
})
$('#btn2').click(function () {
$div1.slideDown()
})
$('#btn3').click(function () {
$div1.slideToggle()
})
显示隐藏
显示隐藏,默认没有动画, 动画(opacity/height/width)
1. show(): (不)带动画的显示
2. hide(): (不)带动画的隐藏
3. toggle(): (不)带动画的切换显示/隐藏
var $div1 = $('.div1')
$('#btn1').click(function () {
$div1.show()
})
$('#btn2').click(function () {
$div1.show(1000)
})
$('#btn3').click(function () {
$div1.hide(1000)
})
$('#btn4').click(function () {
$div1.toggle(1000)
})
自定义动画
jQuery动画本质 : 在指定时间内不断改变元素样式值来实现的
1. animate(): 自定义动画效果的动画
2. stop(): 停止动画
var $div1 = $('.div1')
$('#btn1').click(function () {
$div1
.animate({
width: 200
}, 1000)
.animate({
height: 200
}, 1000)
})
$('#btn2').click(function () {
$div1.animate({
left: 100,
top: 20
}, 1000)
})
$('#btn3').click(function () {
$div1.animate({
left: '-=100',
top: '-=20'
}, 3000)
})
$('#btn4').click(function () {
$div1.stop()
})
补充内容
多库共存
问题 : 如果有2个库都有
,
就
存
在
冲
突
解
决
:
j
Q
u
e
r
y
库
可
以
释
放
, 就存在冲突 解决 : jQuery库可以释放
,就存在冲突解决:jQuery库可以释放的使用权, 让另一个库可以正常使用, 此时jQuery库只能使用jQuery了 API : jQuery.noConflict()
(function (w) {
w.$ = function () {
console.log('aaa')
}
})(window)
<script src="js/myLib.js" type="text/javascript"></script>
<script src="js/jquery-1.10.1.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
jQuery.noConflict()
$()
jQuery(function () {
jQuery('body')
})
</script>
window.onload与 $(document).ready()
区别: window.onload与 $(document).ready()
* window.onload
* 包括页面的图片加载完后才会回调(晚)
* 只能有一个监听回调
* $(document).ready()
* 等同于: $(function(){})
* 页面加载完就回调(早)
* 可以有多个监听回调
var $logo = $('#logo')
console.log($logo.width())
$(function () {
console.log('$1()', $logo.width())
})
$(function () {
console.log('$2()', $logo.width())
})
window.onload = function () {
console.log('onload1()')
}
window.onload = function () {
console.log('onload2()', $logo.width())
}
$logo.on('load', function () {
console.log('load', this.width)
})
jQuery插件
基本扩展方式
扩展方式
1. 扩展jQuery的工具方法
$.extend(object)
2. 扩展jQuery对象的方法
$.fn.extend(object)
$.extend({
min: function (a, b) {
return (a < b) ? a : b
},
max: function (a, b) {
return (a > b) ? a : b
},
leftTrim: function (strToBeTrimed) {
return strToBeTrimed.replace(/^\s+/, '')
},
rightTrim: function (strToBeTrimed) {
return strToBeTrimed.replace(/\s+$/, '')
}
})
$.fn.extend({
checkAll: function () {
this.prop('checked', true)
},
unCheckAll: function () {
this.prop('checked', false)
},
reverseCheck: function () {
this.each(function () {
this.checked = !this.checked
})
}
})
var a = 1
var b = 2
var result_min = $.min(a, b)
var result_max = $.max(a, b)
console.log(result_min)
console.log(result_max)
var str = ' 悟空 '
console.log('|' + str + '|')
var resultStrLeft = $.leftTrim(str)
console.log('|' + resultStrLeft + '|')
var resultStrRight = $.rightTrim(str)
console.log('|' + resultStrRight + '|')
$('#checkedAllBtn').click(function () {
$(':checkbox').checkAll()
})
$('#checkedNoBtn').click(function () {
$(':checkbox').unCheckAll()
})
$('#reverseCheckedBtn').click(function () {
$(':checkbox').reverseCheck()
})
validate
<form id="myForm" action="xxx">
<p>用户名(必须的, 最小2位): <input name="name" type="text" required minlength="2"></p>
<p>密码(必须的, 6到8位): <input id="password" name="pwd" type="password" required minlength="6" maxlength="8"></p>
<p>确认密码(与密码相同): <input name="pwd2" type="password" equalTo="#password"></p>
<input class="submit" type="submit" value="提交">
</form>
<script type="text/javascript" src="jquery-1.11.1.js"></script>
<script type="text/javascript" src="jquery.validate.js"></script>
<script type="text/javascript">
$(function () {
$('#myForm').validate({
messages: {
name: {
required: '用户名是必须的',
minlength: '用户名的最小长度是2'
},
pwd: {
required: '密码是必须的',
minlength: '密码的最小长度是6',
maxlength: '密码的最大长度是8'
},
pwd2: {
equalTo: '确认密码必须与密码相同'
}
}
})
})
</script>
|