大纲
一、jQuery简介
二、jQuery 和Dom关系及jQuery版本
1、jQuery版本
2、jQuery和Dom转换
三、jQuery 选择器
1.1、基本
1.2、层级
2、基本筛选器
3、属性选择器
4.1、表单
4.2、表单对象属性
四:jQuery 示例
1、示例:全选、反选、取消
2.1、筛选器示例:左侧菜单点击展开内容
2.2、筛选器
3.1、jQuery 文本、样式以、属性、文档处理操作
3.2、示例:模态对话框
4、示例:tab切换菜单
5、示例:点赞以及jQuery css操作
6、示例:拖动面板以及位置操作
7.1、jQuery绑定事件及示例
7.2、JQuery事件之阻止事件发生 及示例:表单验证
五、jQuery 扩展
一、jQuery简介
jQuery是一个快速、简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架)。jQuery设计的宗旨是“write Less,Do More”,即倡导写更少的代码,做更多的事情。它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互。
jQuery的核心特性可以总结为:
具有独特的链式语法和短小清晰的多功能接口;
具有高效灵活的css选择器,并且可对CSS选择器进行扩展;
拥有便捷的插件扩展机制和丰富的插件。
jQuery兼容各种主流浏览器,如IE 6.0+、FF 1.5+、Safari 2.0+、Opera 9.0+等。
模块 <=> 类库
DOM/BOM/JavaScript的类库,所以jQuery也分为两部分:
- 查找元素
- 操作元素
二、jQuery 和Dom关系及jQuery版本
1、jQuery版本
当前jQuery版本:这里使用的1.x系列最新版本
1.x系列 兼容性最好,1系列当前最新1.12 2.x系列 3.x系列 最新的版本,IE低版本不再支持
下载的时候有两个版本:一个标准版、一个min压缩版。测试时使用标准版,线上建议使用压缩版。
下载后,引入jQuery类库:
<head> <link rel="stylesheet" href="1.css"> <!--引入css文件--> <style> /* 写css样式 */ </style> <script src="jquery-1.12.4.js"></script> <!--引入jQuery类库,JavaScript一般放到body尾部--> <script> // script 代码。调用使用 jQuery.xxx // jQuery.xxx <==> $.xxx $等同于jQuery关键字 </script> </head>
2、jQuery和Dom转换
> $('#i1') // jQuery获取 [<input type="text" id="i1">] > document.getElementById('i1') // dom获取 <input type="text" id="i1">
> $('#i1')[0] // jQuery对象转换为dom对象 <input type="text" id="i1"> > $(document.getElementById('i1')) // dom对象转换为jQuery对象 [<input type="text" id="i1">] // 转换: // jquery对象[0] => Dom对象 // Dom对象 => $(Dom对象)
三、jQuery 选择器
1.1、基本
> id 选择器
$('#idName')
> class 选择器
$('.className')
> 标签选择器
$('tagName')
> 组合选择器
$('a,.c1,#i10')
1.2、层级
- $('#i10 a') 子子孙孙(i10里所有a标签)
- $(‘#i10>a’) 儿子(只取子标签里的a标签)
- prev + next 下一个标签
- prev ~ siblings 兄弟标签
2、基本筛选器
:first // 获取匹配的第一个元素 :last :not(selector) //去除所有与给定选择器匹配的元素 // 在jQuery 1.3中,已经支持复杂选择器了(例如:not(div a) 和 :not(div,a)) :even // 匹配所有索引值为偶数的元素,从 0 开始计数 :odd // 匹配所有索引值为奇数的元素,从 0 开始计数 :eq(index) :gt(index) :lt(index) // 等于 大于 小于 :header // 匹配如 h1, h2, h3之类的标题元素
3、属性选择器
之前的内容,没有对自定义属性进行查找的,如:<a fgf='22'></a>
jQuery 支持对自定义属性的获取查找.
$('[fgf]') // 具有fgf属性的所有标签 $('[fgf="22"]') // fgf属性等于22的标签 [attribute!=value] [attribute^=value] [attribute$=value] [attribute*=value] [attrSel1][attrSel2][attrSelN]
4.1、表单
<input type='text'/> <input type='text'/> <input type='file'/> <input type='password'/>
$("input[type='text']") // 不使用表单选择器,也能实现 $(':text') // 使用表单选择器
4.2、表单对象属性
:enabled // 可编辑,默认就是 :disabled // 不可编辑 :checked // 被选中(单选框、复选框) :selected // 被选中(下拉框)
四:jQuery 示例
1、示例:全选、反选、取消
相关知识点:
- 选择器 - .prop // 属性方法 $('#tb:checkbox').prop('checked'); 获取值 $('#tb:checkbox').prop('checked', true); 设置值 - .each // 工具:数组和对象操作 jQuery方法内置循环: $('#tb:checkbox').xxxx - $('#tb:checkbox').each(function(k){ // k当前索引 // this,DOM,当前循环的元素 $(this) }) - 三元运算 var v = 条件 ? 真值 : 假值
<body> <input type="button" value="全选" onclick="checkAll();" /> <input type="button" value="反选" onclick="reverseAll();" /> <input type="button" value="取消" onclick="cancelAll();"/> <table border="1"> <thead> <tr> <th>选项</th><th>IP</th><th>PORT</th> </tr> </thead> <tbody id="tb"> <tr> <td><input type="checkbox" /></td> <td>1.1.1.1</td> <td>80</td> </tr> <tr> <td><input type="checkbox" /></td> <td>1.1.1.1</td> <td>80</td> </tr> <tr> <td><input type="checkbox" /></td> <td>1.1.1.1</td> <td>80</td> </tr> </tbody> </table> <script src="jquery-1.12.4.js"></script> <script> function checkAll() { $('#tb :checkbox').prop('checked',true); } // .prop 专门对checked操作 function cancelAll() { $('#tb :checkbox').prop('checked',false); } function reverseAll() { $(':checkbox').each(function(k){ // .each 循环选中的每一个元素 /* Dom实现 if(this.checked){ this.checked = false; }else{ this.checked = true; } */ // this,代指当前循环的每一个元素;三元运算var v = 条件? 真值:假值 var v = $(this).prop('checked')?false:true; // console.log(k,this); $(this).prop('checked',v); }) } </script> </body>
2.1、筛选器示例:左侧菜单点击展开内容
筛选器:
$(this).next() // 下一个 $(this).prev() // 上一个 $(this).parent() // 父 $(this).children() // 孩子 $('#i1').siblings() // 兄弟(不包含自己) $('#i1').find('#i1') // 子子孙孙中查找
添加移除样式:
$('#i1').addClass(..) // 添加样式 $('#i1').removeClass(..)// 移除样式
示例:
<head> <style> .header{ background-color: royalblue; } .content{ min-height: 70px; } .hide{ display: none; } </style> </head> <body> <div style="height:400px;width: 200px;border: 1px solid #dddddd"> <div class="item"> <div class="header">标题一</div> <div id="i1" class="content hide">内容</div> </div> <div class="item"> <div class="header">标题二</div> <div class="content hide">内容</div> </div> <div class="item"> <div class="header">标题三</div> <div class="content hide">内容</div> </div> </div> <script src="jquery-1.12.4.js"></script> <script> $('.header').click(function(){ // 当前点击的标签 $(this); .next 获取某个标签的下一个标签 // $(this).next().removeClass('hide'); 移除hide属性 // $(this).parent().siblings().find('.content').addClass('hide') $(this).next().removeClass('hide').parent().siblings().find('.content').addClass('hide') // 链式编程 }) </script> </body>
2.2、筛选器
$('#i1').next() // 下一个
$('#i1').prev() //往上找
$('#i1').nextAll() // 下面所有
$('#i1').prevAll()
$('#i1').nextUntil('#ii1') // 下面直到哪里
$('#i1').prevUntil('#ii1')
$('#i1').parent() // 父标签 $('#i1').parents() // 取得一个包含着所有匹配元素的祖先元素的元素集合 $('#i1').parentsUntil() //查找当前元素的所有的父辈元素,直到遇到匹配的那个元素为止。 $('#i1').children() $('#i1').siblings() $('#i1').find() $('li').eq(1) <——> $('li:eq(1)') first() last() hasClass(class)
3.1、jQuery 文本、样式以、属性、文档处理操作
- 文本操作:
$(..).text() // 获取文本内容 $(..).text("<a>1</a>") // 设置文本内容 $(..).html() // 获取 $(..).html("<a>1</a>") // 设置 $(..).val() // 获取 $(..).val(..) // 设置
- 样式操作:
addClass removeClass toggleClass 比如实现网页开关灯功能
开关灯示例:
<head> <style> .hide{ display: none; } </style> </head> <body> <input type='checkbox' id='i2' /> <input id="i1" type="button" value="开关" /> <div class="c1 hide">asdfasdf</div> <script src="jquery-1.12.4.js"></script> <script> $('#i1').click(function(){ // if($('.c1').hasClass('hide')){ // $('.c1').removeClass('hide'); // }else{ // $('.c1').addClass('hide'); // } $('.c1').toggleClass('hide'); // 一句搞定 }) </script> </body>
- 属性操作:
// 专门用于做自定义属性 $(..).attr('n') // 获取 $(..).attr('n','v') // 设置 $(..).removeAttr('n') // 删除 <input type='checkbox' id='i1' /> // 专门用于chekbox,radio jQuery1、2版本checkbox使用attr的话有bug,所以用prop $(..).prop('checked') $(..).prop('checked', true)
- 文档处理:
append // 往后加 prepend // 往前加 after // 紧挨着后面 before // 紧挨着前面 remove // 删除 empty // 只清空内容 clone // 克隆一份数据
3.2、示例:模态对话框
<head> <meta charset="UTF-8"> <title>Title</title> <style> .hide{ display: none; } .modal{ position: fixed; top: 50%; left: 50%; width: 500px; height: 400px; margin-left: -250px; margin-top: -250px; background-color: #eeeeee; z-index: 10; } .shadow{ position: fixed; top: 0; left: 0; right: 0; bottom: 0; opacity: 0.6; background-color: black; z-index: 9; } </style> </head> <body> <a onclick="addElement();">添加</a> <table border="1" id="tb"> <tr> <td target="hostname">1.1.1.11</td> <td target="port">80</td> <td target="ip">80</td> <td> <a class="edit">编辑</a> | <a class="del">删除</a> </td> </tr> <tr> <td target="hostname">1.1.1.12</td> <td target="port">80</td> <td target="ip">80</td> <td> <a class="edit">编辑</a> | <a class="del">删除</a> </td> </tr> <tr> <td target="hostname">1.1.1.13</td> <td target="port">80</td> <td target="ip">80</td> <td> <a class="edit">编辑</a> | <a class="del">删除</a> </td> </tr> </table> <div class="modal hide"> <div> <input name="hostname" type="text" /> <input name="port" type="text" /> <input name="ip" type="text" /> </div> <div> <input type="button" value="取消" onclick="cancelModal();" /> <input type="button" value="确定" onclick="confirmModal();" /> </div> </div> <div class="shadow hide"></div> <script src="jquery-1.12.4.js"></script> <script> $('.del').click(function () { $(this).parent().parent().remove(); }); function confirmModal() { var tr = document.createElement('tr'); var td1 = document.createElement('td'); td1.innerHTML = "11.11.11.11"; var td2 = document.createElement('td'); td2.innerHTML = "8001"; $(tr).append(td1); $(tr).append(td2); $('#tb').append(tr); $(".modal,.shadow").addClass('hide'); } function addElement() { $(".modal,.shadow").removeClass('hide'); } function cancelModal() { $(".modal,.shadow").addClass('hide'); $('.modal input[type="text"]').val(""); } $('.edit').click(function(){ $(".modal,.shadow").removeClass('hide'); // this var tds = $(this).parent().prevAll(); tds.each(function () { // 获取td的target属性值 var n = $(this).attr('target'); // 获取td中的内容 var text = $(this).text(); var a1 = '.modal input[name="'; var a2 = '"]'; var temp = a1 + n + a2; $(temp).val(text); }); // var port = $(tds[0]).text(); // var host = $(tds[1]).text(); // // $('.modal input[name="hostname"]').val(host); // $('.modal input[name="port"]').val(port); // 循环获取tds中内容 // 获取 <td>内容</td> 获取中间的内容 // 赋值给input标签中的value }); </script> </body>
注意:上面这个示例的添加新值 为写死的,没有按照正确的业务逻辑去实现。
4、示例:tab切换菜单
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .hide{ display: none; } .menu{ height: 38px; background-color: #eeeeee; line-height: 38px; } .active{ background-color: brown; } .menu .menu-item{ float: left; border-right: 1px solid red; padding: 0 5px; cursor: pointer; } .content{ min-height: 100px; border: 1px solid #eeeeee; } </style> </head> <body> <div style="width: 700px;margin:0 auto"> <div class="menu"> <div class="menu-item active" a="1">菜单一</div> <div class="menu-item" a="2">菜单二</div> <div class="menu-item" a="3">菜单三</div> </div> <div class="content"> <div b="1">内容一</div> <div class="hide" b="2">内容二</div> <div class="hide" b="3">内容三</div> </div> </div> <script src="jquery-1.12.4.js"></script> <script> $('.menu-item').click(function(){ $(this).addClass('active').siblings().removeClass('active'); var target = $(this).attr('a'); $('.content').children("[b='"+ target+"']").removeClass('hide').siblings().addClass('hide'); }); </script> </body> </html>
上面是通过自定义属性实现的,下面不用自定义属性,用索引也能实现。
index 获取索引位置
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .hide{ display: none; } .menu{ height: 38px; background-color: #eeeeee; line-height: 38px; } .active{ background-color: brown; } .menu .menu-item{ float: left; border-right: 1px solid red; padding: 0 5px; cursor: pointer; } .content{ min-height: 100px; border: 1px solid #eeeeee; } </style> </head> <body> <div style="width: 700px;margin:0 auto"> <div class="menu"> <div class="menu-item active" >菜单一</div> <div class="menu-item" >菜单二</div> <div class="menu-item" >菜单三</div> </div> <div class="content"> <div >内容一</div> <div class="hide" >内容二</div> <div class="hide">内容三</div> </div> </div> <script src="jquery-1.12.4.js"></script> <script> $('.menu-item').click(function(){ $(this).addClass('active').siblings().removeClass('active'); $('.content').children().eq($(this).index()).removeClass('hide').siblings().addClass('hide'); }); </script> </body> </html>
5、示例:点赞以及jQuery css操作
Query css处理操作
$('t1').css('样式名称','样式值')
$('t1').css({'样式名称1':'样式值2','样式名称2':'样式值2'}) 点赞: - $('t1').append() - $('t1').remove() - setInterval - 透明度 1 --> 0 - position - 字体大小,位置
点赞示例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .container{ padding: 50px; border: 1px solid #dddddd; } .item{ position: relative; width: 30px; } </style> </head> <body> <div class="container"> <div class="item"> <span>赞</span> </div> </div> <div class="container"> <div class="item"> <span>赞</span> </div> </div> <script src="jquery-1.12.4.js"></script> <script> $('.item').click(function () { AddFavor(this); }); function AddFavor(self) { // DOM对象 var fontSize = 15; var top = 0; var right = 0; var opacity = 1; var tag = document.createElement('span'); $(tag).text('+1'); $(tag).css('color','green'); $(tag).css('position','absolute'); $(tag).css('fontSize',fontSize + "px"); $(tag).css('right',right + "px"); $(tag).css('top',top + 'px'); $(tag).css('opacity',opacity); $(self).append(tag); var obj = setInterval(function () { fontSize = fontSize + 10; top = top - 10; right = right - 10; opacity = opacity - 0.1; $(tag).css('fontSize',fontSize + "px"); $(tag).css('right',right + "px"); $(tag).css('top',top + 'px'); $(tag).css('opacity',opacity); if(opacity < 0){ clearInterval(obj); $(tag).remove(); } }, 40); } </script> </body> </html>
6、示例:拖动面板以及位置操作
- 位置操作:
$(window).scrollTop() // 获取windows滑轮位置 // 注意是谁的滑轮 $(window).scrollTop(0) // 设置windows滑轮位置 scrollLeft([val]) // 左右滚动滑轮设置 $('#i1').offset() // 获取标签位置 offset().left // 指定标签在html中的坐标位置 offset().top // 指定标签在html中的坐标位置
<!-- position() 指定标签相对父标签(找到relative)标签的坐标--> <div style='relative'> <div> <div id='i1' style='position:absolute;height:80px;border:1px'></div> </div> </div> <script> // 纯高度,边框,外边距,内边距 $('i1').height() // 获取标签的高度 纯高度 $('i1').innerHeight() // 获取自身高度+padding; $('i1').outerHeight() // 参数:false-->获取自身高度+padding+border; $('i1').outerHeight(true) // 获取自身高度+padding+border+margin; </script>
- 拖动面板示例:
注意这里直接使用#title方式不是太好。
<body> <div style="border: 1px solid #ddd;width: 600px;position: absolute;"> <div id="title" style="background-color: black;height: 40px;"></div> <div style="height: 300px;"></div> </div> <script type="text/javascript" src="jquery-1.12.4.js"></script> <script> $(function(){ $('#title').mouseover(function(){ $(this).css('cursor','move'); // 当鼠标放倒对象上时,光标设置为'move'样式 }); $("#title").mousedown(function(e){ //console.log($(this).offset()); var _event = e || window.event; var ord_x = _event.clientX; var ord_y = _event.clientY; var parent_left = $(this).parent().offset().left; var parent_top = $(this).parent().offset().top; $('#title').on('mousemove', function(e){ var _new_event = e || window.event; var new_x = _new_event.clientX; var new_y = _new_event.clientY; var x = parent_left + (new_x - ord_x); var y = parent_top + (new_y - ord_y); $(this).parent().css('left',x+'px'); $(this).parent().css('top',y+'px'); }) }); $("#title").mouseup(function(){ $("#title").off('mousemove'); }); }) </script> </body>
7.1、jQuery绑定事件及示例
- 绑定事件知识点:
// DOM: 三种绑定方式(直接绑定;先获取Dom对象再绑定;同时绑定多个事件addEventListener) // jQuery:四种 // 第一种: 获取jQuery对象,再绑定 $('.c1').click() $('.c1').....
// 第二种: 获取jQuery对象,再绑定,还可以解绑,用bind,ubind $('.c1').bind('click',function(){ // 绑定 }) $('.c1').unbind('click',function(){ // 解绑 })
// 第三种:*******有特殊功能,看示例(一开始并没有绑定事件,当点击的时候才给绑定事件) 用delegate, undelegate $('.c').delegate('a', 'click', function(){ // 绑定、委托 }) $('.c').undelegate('a', 'click', function(){ // 解绑 })
// 第四种:上面调用的实际上都是这种 用on, off $('.c1').on('click', function(){ }) $('.c1').off('click', function(){ })
- 示例:添加内容,并自动绑定事件
<body> <input id="t1" type="text" /> <input id="a1" type="button" value="添加" /> <ul id="u1"> <li>1</li> <li>2</li> </ul> <script src="jquery-1.12.4.js"></script> <script> $('#a1').click(function () { var v = $('#t1').val(); var temp = "<li>" + v + "</li>"; $('#u1').append(temp); }); // 第三种绑定方式 $('ul').delegate('li','click',function () { var v = $(this).text(); alert(v); }) // 第一种绑定方式 // $('ul li').click(function () { // var v = $(this).text(); // alert(v); // }) // 第二种绑定方式 // $('ul li').bind('click',function () { // var v = $(this).text(); // alert(v); // }) // 第四种绑定方式 // $('ul li').on('click', function () { // var v = $(this).text(); // alert(v); // }) </script> </body>
7.2、JQuery事件之阻止事件发生 及示例:表单验证
a标签是不是默认有个onclick事件,如果再给绑定一个onclick事件会怎么样?
默认:先执行绑定事件,在执行a标签的默认事件。
阻止事件发生 return false # 当页面框架加载完成之后,自动执行 $(function(){ $(...) })
示例:
<body> <!--Dom方式:onclick里需要加return--> <a onclick="return ClickOn()" href="http://www.oldboyedu.com">走你1</a> <!--jQuery方式:--> <a id="i1" href="http://www.oldboyedu.com">走你2</a> <script src="jquery-1.12.4.js"></script> <script> // Dom方式: function ClickOn() { alert(123); return true; // true:执行后面操作,dom绑定里需要加return } // jQuery方式: $('#i1').click(function () { alert(456); return false; // false:不执行后面操作 }) </script> </body>
- 示例:表单验证
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .error{ color: red; } </style> </head> <body> <!--功能:输入值:运行提交;未输入:不允许提交--> <form id="f1" action="s5.html" method="POST"> <div><input name="n1" tex = "用户名" type="text" /></div> <div><input name="n2" tex = "密码" type="password" /></div> <div><input name="n3" tex = "邮箱" type="text" /></div> <div><input name="n4" tex = "端口" type="text" /></div> <div><input name="n5" tex = "IP" type="text" /></div> <input type="submit" value="提交" /> <!--<img src="...">--> </form> <script src="jquery-1.12.4.js"></script> <script> // // 当页面框架加载完毕后,自动执行,比如加载图片,框加载后,图片还没加载,函数就执行了 // $(function(){ // // }); $(function(){ // 当页面所有元素完全加载完毕后,执行 $(':submit').click(function () { $('.error').remove(); // 先清空错误样式 var flag = true; // 创建局部变量 $('#f1').find('input[type="text"],input[type="password"]').each(function () { var v = $(this).val(); var n = $(this).attr('tex'); if(v.length <= 0){ flag = false; var tag = document.createElement('span'); tag.className = "error"; tag.innerHTML = n + "必填"; $(this).after(tag); // return false; // 加上false后,第一个不合法,后面不通过 } }); return flag; }); }); // $(':submit').click(function () { // var v = $(this).prev().val(); // if(v.length > 0){ // return true; // }else{ // alert('请输入内容'); // return false // } // }) </script> </body> </html>
五、jQuery 扩展
如果想自定义jQuery功能,可以如下定义:
- $.extend $.方法
- $.fn.extend $(..).方法
<body> <script src="jquery-1.12.4.js"></script> <script> var v = $.wangsen(); alert(v); // $('#i1').css() // $.ajax() // 第二种写法:.fn.extend $.fn.extend({ "name1": function () { return 'fgf00'; } }); var v2 = $('#i1').hanyang(); alert(v); // 第一种写法:.extend $.extend({ 'name2': function () { return 'fgf01'; } }); var v1 = $.wangsen(); alert(v); </script> </body>
如果引入第三方jQuery扩展,全局变量、扩展名,可能重复,因此使用还是都定义自执行函数.
(function (arg) { var status = 1; arg.extend({ 'name': function () { return 'fgf'; } }); })(jQuery);