jquery知识点

Day 01

正课:

1. 什么是jQuery:

2. 如何使用jQuery:

3. 选择器:

 

1. 什么是jQuery: 快速的,简洁的JavaScript

   为什么:

     1. DOM操作的终极简化:

         核心DOM: 万能,API繁琐

         HTML DOM: 简洁,不是万能

         jQuery: 终极简化:

          1. 增删改(内容,属性,样式)查

          2. 事件处理:  简化和兼容性

     

          3. 动画操作:

          4. AJAX操作:

     2. 屏蔽浏览器兼容性问题:

         

  何时:

 

   总结: 终极简化——write less,  do more

 

2. 如何使用:

   1. 版本:

      1.11.x:  兼容IE8

           jquery-1.11.3.js 未压缩版本-可读性好,便于学习

                                                     但文件大,不便于网络传输

          jquery-1.11.3.min.js 压缩版本-文件小,便于网络传输,但是可读性差,不便于学习——开发用

      2.xx.x:  不在兼容IE8

  2. 手册:

  3. 编程步骤: 2:

       1. jquery-1.11.3.js文件保存在当前项目的文件夹下

       2. html页面的body元素底部引入jquery-1.11.3.js文件

            强调: 在自定义脚本之前引入

  4. jQuery对象:

      什么是: 封装找到的DOM对象

                  并提供操作DOM对象的简化版的API

                  的类数组对象

      鄙视题: DOM对象 vs jQuery对象的

         DOM对象: W3C标准规定的,浏览器厂商已经实现的,使用DOM API的标准对象

            : 万能       缺: 繁琐

         jQuery对象: jQuery.js函数库定义的第三对象/API

         DOM对象的APIjQuery对象的API不通用!

 

     今后,只要使用jquery,都要先获得jquery对象:

        如何获得jquery对象: 2

          1. 先获得DOM对象,再用$函数封装到jQuery对象

                var $jQuery=$(DOM对象);

          2. 直接使用$函数查找到的DOM对象,被自动封装到一个jQuery对象中。

               var $jQuery=$("selector");

        强调: 只有放入jQuery对象中的DOM对象,才能使用简化版API

       特殊: 万一jQuery对象不支持某项功能:

           jQuery对象中取出DOM对象,使用原生DOM API

           $jQuery[i] -> $jQuery.get(i) 获得i位置的DOM对象

 

3. 选择器:  jQuery支持几乎所有CSS选择器

   提前:

     绑定: DOM: elem.addEventListener("事件名",fn);

              jq: $("selector").事件名(fn);

     修改样式: DOM: elem.style.css属性名=

                     jq: $("selector").css("css属性名",)

 

   回顾:

   1. 基本选择器:

      #id   .class   元素    *    群组

   2. 层次选择器:

      选择器1 选择器2    

     parent>child  

     前一个兄弟+后一个兄弟

     前一个兄弟~之后所有兄弟

 

   新选择器:

   3. 过滤选择器: 通过特定的过滤规则选出所需的DOM元素

       包括: 基本过滤(), 内容过滤, 可见性过滤, 属性过滤

               子元素过滤, 表单过滤

 

     基本过滤: 也称为位置过滤:

          强调: 位置: DOM元素在jQuery元素中的下标位置

        包含: :first, :last,

                 :not(selector),

                 :even, :odd,

                 :eq(i)

                 :gt(i)   :lt(i)

           何时: 只要选择查询结果中指定位置的元素时

          vs first-child/last-child/nth-child(n)

           何时: 只要选择指定父元素下的第几个子元素时

                

     内容过滤: (了解)

      :contains(text) 比如: span:contains("购物车")

      :empty            比如: span:empty 选择内容为空的span

      :parent            比如: span:parent 选择包含子内容或元素的span   ——是:empty的反义

      :has(selector)  比如: div:has(.active) 选择包含classactive的子元素的父元素div       

     可见性过滤:  (了解)

       :visible  匹配所有可见的元素

       :hidden 所有不可见元素

           4: css: display:none; visibility:hidden; opacity:0

                  html: type="hidden"

         强调: :hidden只能匹配 display:none; type="hidden"

 

    回顾: 属性过滤——其实就是css中的属性选择器

       [属性名] 匹配包含指定属性的元素

       [属性名=] 匹配指定属性的值为指定值得元素

       [属性名!=] 匹配指定属性的值不是指定值得元素

       [属性名^=] 匹配指定属性的值以指定内容开头的元素

       [属性名$=] 匹配指定属性的值以指定内容结尾的元素

       [属性名*=] 匹配指定属性的值包含指定内容的元素

       [属性选择器1][属性选择器2]... 匹配同时满足属性选择器1,2的元素

 

    回顾: 子元素过滤:

       包括: :first-child   :last-child   :nth-child(n)   :only-child

             选择在父元素下作为指定为位置的子元素

             位置相对于父元素而言。

      vs 位置过滤: 选择查询结果集合中指定下标位置的元素

                         和元素在其父元素下的位置无关

 

   表单选择器: 利用表单中元素标签和type属性选择表单中的元素

      何时:今后,只要选择表单中的元素,都要用表单元素选择器:

      为什么: 代替DOM中的form.name

      包括:

         :input  选择所有input  textarea  select  button

             vs input: 仅选择input元素

         :text  选择typetext的元素

         :password  

         :radio

         :checkbox

         :submit

         :reset

         :button

         :file

         :hidden

不仅选择type="hidden",还选择display="none"

         :image 选取所有图形按钮

 

   表单属性过滤选择器:

    :enabled 选择所有可用的元素

    :disabled 选择所有不可用的元素

    :checked 选择被选中的checkbox

    :selected 选择被选中的option

 

   课堂练习:

     修改标准属性: $("selector").attr("标准属性名","")

                             等效: getAttributesetAttribute

           所有这类方法,只要省掉第二个参数,就是读取属性值

     ***问题: attr只能获取或设置元素开始标签中的attribute

                无法获取或设置不在开始标签中的property

          解决: prop方法专门读取内存中对象的属性

             比如: checked属性只能用prop读取

*******************************************************************************

Day 02

 

正课:

1. jQuery中基本操作: 操作元素

 

1. 操作元素:

   属性(attr   prop)      

     attr: 在开始标签中显式定义的属性

        : $("selector").attr("属性名")=>getAttribute("属性名")

        : $("selector").attr("属性名",)

=>setAttribute("属性名",);

        问题: 无法访问不在开始标签中的内存中的prop属性

            比如: checked   selected   disabled

        解决:

     prop: 读取不在开始标签中定义的内存中的元素属性prop

        两用:

        : $("selector").prop("属性名")=>elem.属性名

        : $("selector").prop("属性名",)

 

     移除属性(了解):$(...).removeAttr("属性名")

                                   =>removeAttribute("属性名");

 

     总结: jquery中很多方法都是两用:

          如果不提供新值,就读取;如果提供新值,就修改

 

  内容:

      html原文:

          : $(...).html()                  elem.innerHTML

          : $(...).html('html片段')  elem.innerHTML='html片段'

        简便: 清空元素内容:

           $(...).empty();                   elem.innerHTML="";

      纯文本

          : $(...).text()                   elem.textContent/innerText

          : $(...).text('文本')  

      表单元素的value        

          : $(...).val()

          : $(...).val()

 

  样式:

    1. 直接操作CSS属性:

        $(...).css("css属性名") => getComputedStyle()

        $(...).css("css属性名",) => elem.style.css属性名=

     总结: css()能读所有属性,但只能改内联样式中的属性

        简化: 同时修改多个属性值

        $(...).css({属性名1:1, 属性名2:2, ...})

            强调: 属性名都要去横线变驼峰

    2. 修改class属性:

       完整修改class属性: $(...).attr("class","类名")

       追加class属性: $(...).addClass("类名")

          class="cell" : $(...).addClass("n8")  => class="cell n8"

       移除class属性: $(...).removeClass("类名")

          class="cell n8": $(...).removeClass("n8")=>class="cell"

       清除class: $(...).attr("class","")$(...).removeClass();

       判断是否包含指定class: $(...).hasClass("类名")

          技巧: 因为class有时容易发生变化

                    所以,如果class有可能发生变化时,尽量不要用class查找。

             解决: 可使用自定义属性来保存固定值作为查找条件

 

      练习: : 获得父元素: DOM: elem.parentNode

                                                  elem.parentElement

                                       jq: $(...).parent()

                   获得兄弟元素: DOM: elem.nextElementSibling

                                                  elem.previousElementSibling

                                       jq: $(...).next();  $(...).prev();

        过渡: transition

           3: 1. 定义开始样式: 同时定义transition属性

                  2. 定义结束样式:

                  3. addClass将结束样式追加到class属性中

正课:

1. 修改:

    样式:

2. 遍历:

3. 插入,删除,替换

4. 事件:

 

1. 修改:

    样式: 1. 修改css属性: $(...).css()

             2. 修改class:

               $(...).addClass()  $(...).removeClass() $(...).hasClass()

               $(...).toggleClass("类名"): 在有或没有指定类名之间切换。

 

2. 遍历节点: 节点间关系

    1. 父子关系:

       $(...).parent()

       $(...).children([selector]) 只获得直接子元素

       $(...).find(selector) 获得所有子代元素

        强调: children可不加selector,但find必须加selector

    2. 兄弟关系:

       $(...).next([selector])  下一个兄弟元素

       $(...).prev([selector])  前一个兄弟

          强调: 如果加selector,必须满足:

            1. 必须是相邻,2. 必须满足selector的要求

       $(...).siblings([selector]) 其它兄弟

 

3. 添加,删除,替换:

  添加:

   DOM: 3:

       1. 创建空元素对象,

       2. 设置关键属性,

       3. 添加到父元素下

   jq: 2:  

      1. 创建节点: var $elem=$("完整html元素代码段");

      2. 将节点添加到指定父元素下:

          追加: $(parent).append($elem); 追加到parent下的所有子节点末尾——appendChild

          插入: $(parent).prepend($elem); 作为parent下的第一个子节点插入

                   $(child).after($elem); 插入到child之后

                   $(child).before($elem); 插入到child之前

 

   删除: $(要删除的元素).remove();

       强调: 删除时,不必查找父元素

 

   替换和复制(clone):

   替换:  $(old).replaceWith(新元素)

             $(新元素).replaceAll(old)

   复制: var $clone=$(...).clone()  

      浅克隆: 仅复制普通属性,不复制事件处理函数

                               $(...).clone(true)

      深克隆: 不但复制普通属性,而且还复制事件处理函数

 

总结: jQuery是对DOM操作的终极简化函数库

        jQuery,其实还是在学DOM

   查找——选择器

   修改:

      属性: attr()   prop()

      内容: html()   text()   val()   empty()

      样式: css()  

          addClass()   removeClass()  hasClass() toggleClass()

   添加: 2:

     1. 创建: var $elem=$(html代码段)

     2. 追加: $(parent).append($elem); ...

   删除: remove();

   克隆: clone([true])

以上是jQuery的核心和本质

以下是jQuery的扩展部分: 1. 事件绑定,2.动画, 3.AJAX封装

 

4. 事件处理:

   鄙视题: jQuery有几种绑定事件处理函数的方法,有什么区别:

   1. $(...).bind("事件名",fn)->addEventListener

           特点: 为同一个元素的事件处理函数绑定多个函数对象

       $(...).unbind("事件名",fn)->removeEventListener

           强调: 如果有可能移除事件处理函数,则绑定时,必须用有名的函数绑定,不能用匿名函数。

           重载1:  不带任何参数: 移除元素上所有事件处理函数绑定

           重载2: 只带一个事件名称参数: 移除元素上指定事件名称绑定的所有函数对象

           重载3: 带两个参数: 仅移除事件元素上指定事件名称绑定的执行的一个函数对象。

 

   问题: 只能为页面上现有的元素绑定事件

            动态新添加的元素无法自动绑定事件处理函数

   解决: delegate

  2. 事件代理: 让指定父元素下,所有符合要求的子元素,都能使用事件处理函数。(包括已有的元素和新生成的元素)

      原理: 利用冒泡:

          1. 仅将事件处理函数绑定在父元素上一次

          2. 获得目标元素: e.target

          3. 仅响应符合条件的元素的事件

      : 减少事件监听的个数

           可让后生成的新元素自动响应事件

      何时: 只要希望一个父元素下指定的所有子元素都能响应事件时

      如何使用:

       $(parent).delegate("selector","事件名",fn)

          将事件绑定到parent上(利用冒泡)

             只有符合selector条件的元素才能响应事件

           其中: fn: function(e){e.target//获得目标元素}

       $(parent).undelegate("selector","事件名",fn)

 

  delegate vs bind:

   1. 优化: 创建事件监听对象的个数

      delegate: 仅在父元素创建一个事件监听,所有子元素公用

      bind: 为每个子元素分别创建事件监听

   2. 效果:

      delegate: 新生成的子元素也可自动共享父元素的事件

      bind: 新生成的子元素无法自动获得事件处理函数

     

 3. 一次性事件: $(...).one("事件名",fn)

        只能执行一次事件处理函数,执行后,自动解除绑定

 

 4. $(...).live("事件名",fn), 本质:delegate

       问题: 极端,将所有元素的所有事件集中绑定到document

     $(...).die("事件名",fn), 本质:undelegate

 

 5. 终极简化:

    问题: 仅为一个元素绑定事件处理函数: bind

             利用冒泡: delegate

    解决: 统一成了on

       1. 仅为一个元素绑定事件处理函数:

$("target").on("事件名",fn)

       2. 利用冒泡:

                 $("parent").on("事件名","selector",fn)

    解除绑定: off(...)

 

 6. 简写: $(...).事件名(function(){...})

       问题: 仅少量常用的事件,可简写

              如果遇到无法简写的事件,就要用on

 

 

 

*******************************************************************************

Day 03

 

正课:

1. 事件

2. 动画

3. jQuery UI

 

1. 事件:

   模式触发事件:

    DOM: elem.onxxx();

      问题: 只能触发直接用onxxx绑定的事件处理函数

              addEventListener添加的事件监听,无法模拟触发

    jq: $(...).trigger("事件名")

       其实可简写为: $(...).事件名

 

   页面加载后执行:

     特殊: $(document).ready(function(){...})

     鄙视题: vs DOM: window.onload=function(){...}

        ready的底层事件: DOM中的ondocumentcontentloaded

                                     只要DOM树加载完成,js执行完毕就会触发。

        onload: 必须等到html,css,js,img全部加载完成才触发

     优化: 可将原来在load之后才执行的任务(事件绑定,修改DOM),提前到ready之后执行,可缩短页面整体加载时间。

     如何使用: $(document).ready(function(){...})

                 : $().ready(function(){...})

                 更简: $(function(){...});

     其实: 只要将script放在body的结尾,就可实现DOM加载后立刻执行。

 

   一个事件: hover: 其实就是mouseovermouseout的合体

      所以,hover要绑定两个事件处理函数

   何时使用: 只要同时响应mouseovermouseout时,就可简写为hover

 

2. 动画:  高级函数: 基于底层函数又进行了封装

    两大块: 简化版动画函数   和    万能动画函数

简化版动画函数:

    显示/隐藏: $(...).show();    $(...).hide();   $(...).toggle()

         强调: 无参数的show()/hide()使用的是display属性

                瞬间隐藏和显示

         动画: 参数: speed:

                2: 1. 三档: fast  normal  slow

                       2. 用毫秒数自定义动画时长

         动画的速度变化: 参数: easing:  linear  swing

    伸缩: slideUp()    slideDown()     slideToggle()

    淡入淡出:  fadeIn()    fadeOut()     fadeToggle();

问题: 效果受局限

解决: 万能动画函数: animate()

animate()可对数值类型的CSS样式执行定时器动画

   包括: 宽高,位置,透明度,边框宽度,字体大小,

强调: 不能对非数值类型属性做动画

   包括: (颜色,背景图片,字体,display)

如何:

  $(...).animate(params,speed,easing,fn)

    其中: params: 所有变化的css属性的目标值:

                 比如: {css属性1: 1, css属性2:2,...}

                 强调: css属性名要去横线变驼峰

                          值要加单位

             speed: 动画持续时间/速度

             easing: 速度变化效果

             fn: 动画结束后,自动调用的回调函数

 

动画中的排队和并发:

  排队: 多个动画顺序,先后执行

     $(...).animate({属性1:1,...},ms).animate({属性2:2,...})

     先对属性1执行动画效果,再对属性2执行动画效果

  并发: 多个动画同时执行

     $(...).animate({属性1:1,属性2:2},ms)

     同时修改属性1和属性2

 

 

正课:

1. 类数组操作:

2. jQuery UI:

 

1. 类数组操作:

   .each(function(i){ i->当前元素的下标;  this->当前元素})

   .each vs forEach

   原理是一样的

   forEach是原生jsArray类型的方法

   eachjquery中第三方定义的类数组对象的方法

 

   $("要查找的元素").index("所有元素")

     返回,要查找的元素在所有元素中的下标位置

 

2. jQuery UI: 一组可复用的更简化版API或插件库

    何时: 如果觉得jQuery还不够简化,或需要复用一些插件时

       比如: 日历选择框   验证

    插件: 官方插件      第三方插件: 自定义插件

    什么是jQuery UI: 基于jquery编写的一套UI组件库,专用于PC端浏览器。

              jQuery Mobile: 基于jquery编写的一套UI组件库, 专门用于移动端浏览器的网页

    官网: jqueryui.com

 

    问题: 公司要使用一项新的技术或库,如何快速上手:

       官网->什么是->DEMO->API 手册

 

    下载: jQuery UI: 默认的色调是蓝色

            希望获得自定义主题的UI: 官网->Themes->Gallary

               需要更细致的定制主题: Gallary->edit

正式学习jquery UI: 三部分: Effects  interactions Widgets

Effects: 动画效果

  addClass/removeClass/toggleClass() 默认没动画,现在有

  show/hide/toggle 扩展了动画效果

  color animation: 实现颜色动画

练习:

   强调: 因为jquery ui依赖于jquery,所以必须先引入jquery.js,再引入jquery ui.js

 

jquery ui中的$(...).animate(): 支持颜色动画

jquery ui中的$(...).toggle(Effects,speed)

  toggleeffects参数:

    blind(遮蔽)  bounce(弹跳) clip(缩短) drop(丢弃)

    explode(爆炸) fold(折叠) highlight(高亮) puff(膨胀)

    pulsate(心跳) shake(震动) size slide

 

Interactions:交互

1. 拖拽: $(...).draggable()

   问题: API会悄悄的为元素添加class->侵入性

   对于有侵入性API,不但要引入js,还要引入css

2. 可选中: $(...).selectable();

     问题: 可自动向选中的li添加ui-selected类,但jquery ui并未定义该类的样式

     解决: 必须手动定义同名样式类ui-selected,定义选中项的样式

3. 可排序: $(...).sortable();

 

总结: jquery ui中的很多API具有侵入性:

          通常都要引入jquery ui附带的css文件

            有的还需要自己补充同名的样式类

要求: jquery ui不但要知道表面现象,更要知道Element中的变化原理。

 

Widget: 小部件: (小重点)

1. Accordion(手风琴部件)

   何时: 节约页面空间

   如何使用:

      引入: jquery-ui.css

      HTML: 父元素>标题+内容div

      js:$(父元素).accordion();

2. AutoComplete(自动完成)

   何时: 避免重复输入,减少键入次数

   如何:

     html: input文本框

     js: 一个保存所有备选向的数组

        $(文本框).autocomplete({source:数组})

3. datepicker:(日期选择框)

  如何使用:

     html: input文本框

     js: $(文本框).datepicker({dateFormat:'yyyymmdd'})

   vs h5<input type="date"...

       h5有兼容性问题,且不能修改样式

4. dialog:对话框:

   为什么: BOM中的alert,confirm,prompt样式死板,无法定制

   何时: 今后,只要弹窗,都用dialog部件

   如何:

     html:定义外层元素,包含提示信息

                 其中外层元素要定义title属性

title属性会出现在对话框的左上角

     js: $("外层元素").dialog();

       强调: 不带参数的dialog(), 只负责将容器变成对话框

               不控制显示与否

  如何隐藏,再弹出:

     配置对话框:

        $(...).dialog({

autoOpen:false,//默认隐藏

                 buttons:[

                   {text:"文本",click:function(){this->dialog}},//按钮

                   ...

                 ]

        });

     打开: $(...).dialog("open");

     关闭: $(...).dialog("close");

 

5. 按钮部件: $(button/input/a).button();

 

6. tabs: 标签页:

   如何:

     html: 父级div>标签页ul>li>a href="#id"

                             内容页div#id

       说明: li>ahref中的#id是为了匹配div#id

     js: $(父元素).tabs();

7. tooltip: 工具提示

  为什么: 普通的title属性,浏览器之前有不一致

  何时: 只要希望所有浏览器统一title提示的样式时

  如何: tooltip,必须应用到document

 

*******************************************************************************

 

Day 04

 

正课:

1. 第三方插件:

    日期,验证,瀑布流

2. ***开发自定义jQuery插件

 

1. 第三方插件:

日期: jquery ui datepicker

        h5   input type="date"

        My97

        layDate

layDate:  不依赖于jquery

如何:

   html: <input class="laydate-icon"

   css: 引入laydate/skins/default/laydate.css

   js: laydate({

           elem:"selector",

           format:"YYYYMMDD",

           其他属性

        })

 

表单验证: jquery.validator  依赖于jquery

如何使用:

$(表单).validate({

    rules: {//规则

        name1: "required",//必填,如果只有一个简单规则时

        name2: {//如果一个字段,需要多个规则验证时

            规则1: ,

            规则2: ,

        },//所有规则列表: https://jqueryvalidation.org/documentation/

                 List of built-in Validation methods

    },

    message:{//提示信息

        name1: "name1验证失败的信息",

        name2:{

            规则1: "name2的规则1验证失败的信息",

            规则2: "name2的规则2验证失败的信息",

        }

    }

});

如何添加自定义验证规则:

jQuery.validator.addMethod(规则名,method[,默认提示])

使用自定义规则: field: "规则名"

 

Masonry: 瀑布流

特点: 不规则大小的砖块,拼凑成完整的砖墙

什么是Masonry: 是一个javascript网格布局库.

作用: 在一个垂直区域内,将元素按最优化的空间利用率自动摆放。

如何使用: $(容器父元素).masonry();

 

2. ***自定义jquery插件:

需求: 添加一个专门的函数sum,来计算数组中所有元素的和

问题: 直接定义在全局,易被污染

解决: 定义在一个自定义的对象中: 2:

   1. 定义一个全局对象;   

   2. 在自定义的全局对象中添加自定义方法

       : 不易被污染

html如何使用自定义方法: 2:

   1. 先引入方法所在的js文件

   2. 用库对象.自定义方法()

添加jquery全局函数:

 

 

正课:

1. ***自定义jQuery插件:

    jQuery的全局方法

   添加jQuery的对象方法——自定义插件

 

1. jQuery  全局方法:

  jQuery库对象: window.jQuery=window.$=jQuery

 jQuery库中添加全局方法: 2:

      1. jQuery.命名空间={}

      2. jQuery.命名空间.方法名=function(){...}

 

  原生js的全局方法  vs jQuery的全局方法

  原生js的全局方法: 直接定义在window下,不需要任何对象即可直接访问。

  jQuery的全局方法: 定义在jQuery对象内部,必须用jQuery对象才能调用

 

2. 添加jQuery  对象方法:

   为所有jQuery查找结果对象添加的方法——插件

   vs jQuery全局方法:

      全局方法: $.xxx.方法名()

      对象方法: $(selector).方法名()

   何时: 如果希望对查找结果对象调用方法时

   如何定义: $(...)的原型对象是jQuery.fn

 

鄙视题: $.each(arr,function(i,val){...})

                 arr.forEach(function(val,i,arr){...})

       vs  $(...).each(function(i,elem){...})

   $.each()jQuery全局方法,存储在jQuery全局对象上

       主要用于遍历普通数组

   $(...).each()jQuery对象方法,存储在原型对象jQuery.fn

       主要用于对查询结果中的每个DOM元素执行操作

 

3. 自定义jQuery插件:

    何时: 如果一个效果需要反复使用,就要封装为插件

    : 重复利用, 提高发开效率

1. dropdown:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

      

posted @ 2016-12-22 10:49  寒霜27  阅读(765)  评论(1编辑  收藏  举报