【JavaScript】第二十三天 (jQuery)

jquery

1.1jQuey介绍

1.1.1javascript库

javaScript库:即 library ,是一个封装好的特定集合(方法和函数)。从封装一大堆函数的角度理解库,就是在这个库中,封装了很多预先定义好的函数在里面,比如动画animate、hide、show,比如获取元素等。

简单理解:就是一个JS文件,里面对我们原生js代码进行了封装,存放到里面。我们可以快速高效的使用这些封装好的功能了。
比如jQuery,就是为了快速方便的操作DOM,里面基本都是函数(方法)。

      常见的JavaScript 库:jQuery、Prototype、YUI、Dojo、Ext JS、移动端的zepto等,这些库都是对原生 JavaScript 的封装,内部都是用 JavaScript 实现的,我们主要学习的是 jQuery。

1.1.2jQuery的概念

jQuery总体概况如下:

● jQuery 是一个快速、简洁的 JavaScript 库,其设计的宗旨是“write Less,Do More”,即倡导写更少的代码,做更多的事情。

● j 就是 JavaScript; Query 查询; 意思就是查询js,把js中的DOM操作做了封装,我们可以快速的查询使用里面的功能。

● jQuery 封装了 JavaScript 常用的功能代码,优化了 DOM 操作、事件处理、动画设计和 Ajax 交互。

● 学习jQuery本质: 就是学习调用这些函数(方法)。

● jQuery 出现的目的是加快前端人员的开发速度,我们可以非常方便的调用和使用它,从而提高开发效率

1.1.3jQuery的优点

● 轻量级。核心文件才几十kb,不会影响页面加载速度。

● 跨浏览器兼容,基本兼容了现在主流的浏览器。

● 链式编程、隐式迭代。

● 对事件、样式、动画支持,大大简化了DOM操作。

● 支持插件扩展开发。有着丰富的第三方的插件,例如:树形菜单、日期控件、轮播图等。

● 免费、开源。

1.2jQuery基本使用

1.2.1jQuery下载

jQuery的官网地址: https://jquery.com/,官网即可下载最新版本。

各个版本得下载: https://code.jquery.com/

版本介绍:
1x :兼容 IE 678 等低版本浏览器, 官网不再更新
2x :不兼容 IE 678 等低版本浏览器, 官网不再更新
3x :不兼容 IE 678 等低版本浏览器, 是官方主要更新维护的版本

1.2.2 体验jQuery

步骤:
● 引入jQuery文件。

● 在文档最末尾插入 script 标签,书写体验代码。

● $(‘div’).hide() 可以隐藏盒子。

1.2.3 jQuery的入口函数

jQuery种常见的两种入口函数:

// 第一种: 简单易用。
$(function () {   
    ...  // 此处是页面 DOM 加载完成的入口
}) ; 

// 第二种: 繁琐,但是也可以实现
$(document).ready(function(){
   ...  //  此处是页面DOM加载完成的入口
});

总结:

● 等着 DOM 结构渲染完毕即可执行内部代码,不必等到所有外部资源加载完成,jQuery 帮我们完成了封装。

● 相当于原生 js 中的 DOMContentLoaded。

● 不同于原生 js 中的 load 事件是等页面文档、外部的 js 文件、css文件、图片加载完毕才执行内部代码。

● 更推荐使用第一种方式。

1.2.4 jQuery中的顶级对象$

● $是 jQuery 的别称,在代码中可以使用 jQuery 代替,但一般为了方便,通常都直接使用 $。

● 是jQuery的顶级对象,相当于原生JavaScript中的 window。把元素利用$包装成jQuery对象,就可以调用jQuery 的方法。

1.2.5 jQuery 对象和 DOM 对象

使用 jQuery 方法和原生JS获取的元素是不一样的,总结如下 :

  1. 用原生 JS 获取来的对象就是 DOM 对象
  2. jQuery 方法获取的元素就是 jQuery 对象。
  3. jQuery 对象本质是: 利用$对DOM 对象包装后产生的对象(伪数组形式存储)。

注意:
只有 jQuery 对象才能使用 jQuery 方法,DOM 对象则使用原生的 JavaScirpt 方法。

1.2.6 jQuery 对象和 DOM 对象转换

DOM 对象与 jQuery 对象之间是可以相互转换的。因为原生js 比 jQuery 更大,原生的一些属性和方法 jQuery没有给我们封装. 要想使用这些属性和方法需要把jQuery对象转换为DOM对象才能使用。

// 1.DOM对象转换成jQuery对象,方法只有一种
var box = document.getElementById('box');  // 获取DOM对象
var jQueryObject = $(box);  // 把DOM对象转换为 jQuery 对象

// 2.jQuery 对象转换为 DOM 对象有两种方法:
// 2.1 jQuery对象[索引值]
var domObject1 = $('div')[0]

// 2.2 jQuery对象.get(索引值)
var domObject2 = $('div').get(0)

总结:实际开发比较常用的是把DOM对象转换为 jQuery对象,这样能够调用功能更加强大的jQuery中的方法。

1.3 jQuery选择器

原生 JS 获取元素方式很多,很杂,而且兼容情况不一致,因此 jQuery 给我们做了封装,使获取元素统一标准。

1.3.1 基础选择器

$"(选择器)" //里面选择器直接写 CSS 选择器即可,但是要加引号

1.3.2 层级选择器

层级选择器最常用的两个分别为:后代选择器和子代选择器。

基础选择器和层级选择器案例代码

<body>
    <div>我是div</div>
    <div class="nav">我是nav div</div>
    <p>我是p</p>
    <ul>
        <li>我是ul 的</li>
        <li>我是ul 的</li>        
        <li>我是ul 的</li>
    </ul>
    <script>
        $(function() {
            console.log($(".nav"));
            console.log($("ul li"));
        })
    </script>
</body>

1.3.3 隐式迭代

● 遍历内部 DOM 元素(伪数组形式存储)的过程就叫做隐式迭代。

● 简单理解:给匹配到的所有元素进行循环遍历,执行相应的方法,而不用我们再进行循环,简化我们的操作,方便我们调用。

$('div').css("width","100px") 所有的div

1.3.4 筛选选择器

$('li').eq(n):找到第n个
$('li').first():找到所有元素中的第一个
$('li').last():找到所有元素中的最后一个
$('li:eq(3)').next():找到某一个元素的下一个兄弟元素
$('li:eq(3)').prev():找到某一个元素的上一个兄弟元素
$('li:eq(3)').nextAll():找到某一个元素的后面的所有兄弟元素
$('li:eq(3)').prevAll():找到某一个元素的前面的所有兄弟元素
$('li:eq(3)').parent(): 找到某一个元素的父元素
$('li:eq(3)').parents():找到某一个元素的所有结构父级,一直到 html
找到一组元素中的某一个:
// 在 li 的所有父级里面找到所有 body 标签 $('li').parents().find('body') 
// 找到 div 标签下所有后代元素中所有类名为 box 的元素 $('div').find('.box')

筛选选择器,顾名思义就是在所有的选项中选择满足条件的进行筛选选择。常见如下:

案例代码

<body>
    <ul>
        <li>多个里面筛选几个</li>
        <li>多个里面筛选几个</li>
        <li>多个里面筛选几个</li>
        <li>多个里面筛选几个</li>
        <li>多个里面筛选几个</li>
        <li>多个里面筛选几个</li>
    </ul>
    <ol>
        <li>多个里面筛选几个</li>
        <li>多个里面筛选几个</li>
        <li>多个里面筛选几个</li>
        <li>多个里面筛选几个</li>
        <li>多个里面筛选几个</li>
        <li>多个里面筛选几个</li>
    </ol>
    <script>
        $(function() {
            $("ul li:first").css("color", "red");
            $("ul li:eq(2)").css("color", "blue");
            $("ol li:odd").css("color", "skyblue");
            $("ol li:even").css("color", "pink");
            
        })
    </script>
</body>

另:jQuery中还有一些筛选方法,类似DOM中的通过一个节点找另一个节点,父、子、兄以外有所加强。

1.3.5 排他思想

想要多选一的效果,排他思想:当前元素设置样式,其余的兄弟元素清除样式。

$(this).css(“color”,”red”);
$(this).siblings(). css(“color”,””);

1.3.6 链式编程

链式编程是为了节省代码量,看起来更优雅

$(this).css('color', 'red').sibling().css('color', ''); 

1.4 jQuery样式操作

jQuery中常用的样式操作有两种:css() 和设置类样式方法

1.4.1 操作css样式方法

jQuery 可以使用css方法来修改简单元素样式;也可以操作类,修改多个样式

常用以下三种形式:

// 1.参数只写属性名,则是返回属性值
var strColor = $(this).css('color');

// 2.  参数是属性名,属性值,逗号分隔,是设置一组样式,属性必须加引号,值如果是数字可以不用跟单位和引号
$(this).css('color', 'red');

// 3.  参数可以是对象形式,方便设置多组样式。属性名和属性值用冒号隔开, 属性可以不用加引号
$(this).css({ "color":"white","font-size":"20px"});

注意:css() 多用于样式少时操作,多了则不太方便。

1.4.2 操作css类的方法

作用等同于以前的 classList,可以操作类样式,注意操作类里面的参数不要加点。

常用的三种设置类样式的方法:

// 1.添加类
$("div").addClass("current");

// 2.删除类
$("div").removeClass("current");

// 3.切换类
$("div").toggleClass("current");

// 4. 包含类
$("div").hasClass("current");

注意

● 设置类样式方法比较适合样式多时操作,可以弥补css()的不足。

● 原生 JS 中 className 会覆盖元素原先里面的类名,jQuery 里面类操作只是对指定类进行操作,不影响原先的类名。

1.4.3案例-tab栏切换

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .active{
            background-color: yellow;
            color: #fff;
            font-size: 30px;
        }
        #box{
            width: 400px;
            height: 80px;
            background-color: pink;
        }
    </style>
</head>
<body>
    <div>
        <button>娱乐</button>
        <button>美食</button>
        <button>体育</button>
    </div>
    <div id="box">

    </div>
</body>
</html>
<script src="./jquery.js"></script>
<!-- 
         jsDOM操作:                                            jq操作
          获取元素                                          选择器获取元素
          设置样式                                             设置样式
          oDiv.style.属性                                   $div.css('属性','属性值')
          oDiv.className                                    $div.css({'属性':'属性值','属性':'属性值'。。。})
          oDiv.classList.add()                              $div.addClass('类名')、 $div.removeClass('类名')、 $div.toggleClass('类名')

          设置内容  /获取内容                                           设置内容/获取内容
 
          oDiv.innerHTML = ''/oDiv.innerHTML                  $div.html('哈哈')/$('div').html()
          oDiv.innerText = ''/oDiv.innerText                   $div.text('哈哈')/$('div').text()
          oDiv.value = ''                                     $div.val('哈哈')/$('div').val()
          设置属性

  -->

<script>
    let arr = ["娱乐内容","美食内容","体育内容"]
    $('button').on('click',function(){
        $(this).addClass('active').siblings('button').removeClass('active');
        $('#box').html(arr[$(this).index()]);
    })
</script>

1.4.4 jQuery中类操作和className的区别

● 原生的js中className会覆盖元素原先里面的类名
● addClass相当于追加类名 不影响以前的类名

1.5 jQuery属性操作

jQuery 常用属性操作有三种:prop() / attr() / data();

1.5.1 元素固有属性值 prop

所谓元素固有属性就是元素本身自代的属性,比如< a > 元素里面的 href, 比如< input > 元素里面的 type。

语法

  1. 获取属性方法 prop(“属性”)
  2. 设置属性方法prop(“属性”,“属性值”)

注意:porp() 除了普通属性操作,更适合操作表单属性:disabled / checked / selected 等

1.5.2 元素自定义属性值 attr

用户自己给元素添加的属性,我们称为自定义属性。比如给 div 添加 index = “1”。

语法

1. 获取属性语法attr("属性") // 类似原生的getAttribute
2. 设置属性语法attr("属性", "属性值") // 类似原生的setAttribute
注意:attr() 除了普通属性操作,更适合操作自定义属性。(该方法也可以获取 H5 自定义属性)

1.5.3 移出元素的某一个属性

移除元素的自定义属性:$('div').removeAttr('index')

1.6 jQuery文本属性值

jQuery的文本属性值常见操作有三种:html() / text() / val();
分别对应JS中的 innerHTML、innerText 和 value 属性

1.6.1 jQuery文本属性值

jQuery的文本属性值常见操作有三种:html() / text() / val() ;
分别对应JS中的 innerHTML 、innerText 和 value 属性

1.6.2 jQuery内容文本值

常见操作有三种:html() / text() / val() ;
分别对应JS中的 innerHTML 、innerText 和 value 属性,
主要针对元素的内容还有表单的值操作。
语法:

  1. 普通元素内容html()(相当于原生innerHTML)
    html() // 获取元素的内容
    html(“内容”) // 设置元素的内容
  2. 普通元素文本内容text()(相当于原生innerText)
    text() // 获取元素的文本内容
    text(“内容”) // 设置元素的文本内容
  3. 表单的值val()(相当于原生value)
    val() // 获取表单的值
    val(“内容”) // 设置表单的值

1.7 元素操作

1.7.1 创建一个元素

var div = $('
'
)

1.7.2 内部插入元素

// 向 div 元素中插入一个 p 元素,放在最后
$('div').append($('

'
)) // 把 p 元素插入到 div 中去,放在最后 $('

hello

'
).appendTo($('div')) // 向 div 元素中插入一个 p 元素,放在最前 $('div').prepend($('

'
)) // 把 p 元素插入到 div 中去,放在最前 $('

hello

'
).prependTo($('div'))

1.7.3 外部插入元素

// 在 div 的后面插入一个元素 p
$('div').after($('

'
)) // 在 div 的前面插入一个元素 p $('div').before($('

'
)) // 把 p 元素插入到 div 元素的后面 $('div').insertAfter($('

'
)) // 把 p 元素插入到 div 元素的前面 $('div').insertBefore($('

'
))

1.7.4 替换元素

// 把 div 元素替换成 p 元素
$('div').replaceWith($('

'
)) // 用 p 元素替换掉 div 元素 $('

'
).replaceAll($('div'))

1.7.5 删除元素

// 删除元素下的所有子节点
$('div').empty()

// 把自己从页面中移除
$('div').remove()

1.7.6 克隆元素

// 克隆一个 li 元素
// 接受两个参数
//   参数1: 自己身上的事件要不要复制,默认是 false
//   参数2: 所有子节点身上的事件要不要复制,默认是 true
$('li').clone()

1.7.7 元素遍历

var arr = ["red","yellow","pink"]
$('div').each((index,item)=>{
   $(item).css("background",arr[index])
})

1.8 元素事件绑定

因为普通注册事件方法的不足,jQuery又开发了多个处理方法,重点讲解如下:
● on(): 用于事件绑定,目前最好用的事件绑定方法
● off(): 事件解绑
● trigger() / triggerHandler(): 事件触发
● one():事件触发一次

1.8.1 绑定事件的方法

// 给 button 按钮绑定一个点击事件
$('button').on('click', function () {
    console.log('我被点击了')
})

1.8.2 移除事件

// 给 button 按钮绑定一个 点击事件,执行 handler 函数
$('button').on('click', handler)

// 移除事件使用 off
$('button').off('click', handler)

1.8.3 只能执行一次的事件

// 这个事件绑定再 button 按钮身上
// 当执行过一次以后就不会再执行了
$('button').one('click', function(){})

1.8.4 直接触发事件

// 当代码执行到这里的时候,会自动触发一下 button 的 click 事件
$('button').trigger('click')
$('button').triggerHandler('click')

区别:triggerHandler只会触发JQ对象集合中第一个元素的事件处理函数,也不会产生事件冒泡。
    而trigger触发JQ对象集合中所有元素的事件处理函数,而且会产生事件冒泡

1.9 元素尺寸

1.9.1 操作元素的宽和高

// 获取 div 元素内容位置的高,不包含 padding 和 border
$('div').height()
// 设置 div 内容位置的高为 200px
$('div').height(200)

// 获取 div 元素内容位置的宽,不包含 padding 和 border
$('div').width()
// 设置 div 内容位置的宽为 200px
$('div').width(200)

1.9.2 获取元素的内置宽和高

// 获取 div 元素内容位置的高,包含 padding 不包含 border
$('div').innerHeight()

// 获取 div 元素内容位置的宽,包含 padding 不包含 border
$('div').innerWidth()

1.9.3 获取元素的外置宽和高

// 获取 div 元素内容位置的高,包含 padding 和 border
$('div').outerHeight()
// 获取 div 元素内容位置的高,包含 padding 和 border 和 margin
$('div').outerHeight(true)

// 获取 div 元素内容位置的宽,包含 padding 和 border
$('div').outerWidth()
// 获取 div 元素内容位置的高,包含 padding 和 border 和 margin
$('div').outerWidth(true)

1.10 元素位置

1.10.1 元素相对页面的位置

// 获取 div 相对页面的位置
$('div').offset() // 得到的是以一个对象 { left: 值, top: 值 }

// 给 div 设置相对页面的位置
$('div').offset({ left: 100, top: 100 })
// 获取定位到一个距离页面左上角 100 100 的位置

案例:物体运动

 let lf = $('div').offset().left;
 lf = lf + 10;
$('div').offset({ 'left':lf })

1.10.2 元素相对于父元素的偏移量

// 只能获取 div 相对于父元素的偏移量(定位的值)
$('div').position()

1.10.3 获取页面卷去的高度和宽度

window.onscroll = function () {
    // 获取浏览器卷去的高度
    console.log($(window).scrollTop())
}

window.onscroll = function () {
    // 获取浏览器卷去的宽度
    console.log($(window).scrollLeft())
}

1.11 动画

1.11.1 显示和隐藏


显示:
方式一:
    $('div').show() // 如果元素本身是 display none 的状态可以显示出来
方式二:
    $('div').show('毫秒', '速度', '回调函数')
    $('div').show(1000, 'linear', function () { 
        console.log('我显示完毕') 
    })

隐藏:

方式一:
    $('div').hide('毫秒', '速度', '回调函数') 
方式二:
    $('div').hide(1000, 'linear', function () { 
       console.log('我隐藏完毕') 
    })


切换:
方式一:
    $('div').toggle()
方式二:
    $('div').toggle(1000, 'linear', function () { console.log('动画执行完毕') })

1.11.2 淡入淡出

fadeIn([s],[e],[fn])
fadeOut([s,[e],[fn]])

1.11.3 下滑上滑

slideDown([s],[e],[fn])
slideUp([s,[e],[fn]])
slideToggle([s],[e],[fn])

1.11.4 自定义动画

$('.show').click(function () { 
       $('div').animate(
            { width: 500, height: 300 }, 
            1000, 
            'linear', 
            function () { 
              console.log('动画运动完毕') 
             }) 
        })

1.11.5 stop

立刻停止动画 $('div').stop() ---> 就停止再当前状态

1.12 发送 ajax 请求

1.12.1 发送 get 请求

$.get("test.cgi", { name: "John", time: "2pm" },
          function(data){
          alert("Data Loaded: " + data);
});

1.12.2 发送 post 请求

$.post("test.php", { name: "John", time: "2pm" },
   function(data){
   alert("Data Loaded: " + data);
});

1.12.3 综合发送 ajax 请求

 $.ajax({
   url: "page.php",
   processData: false,
   data: {},
   success: function(data){
   alert("Data Loaded: " + data);
} 
 });

1.13 jQuery 的多库共存

我们一直在使用 jQuery ,都没有什么问题 。但是如果有一天,我们需要引入一个别的插件或者库的时候
人家也向外暴露的是 $ 获取 jQuery ,那么,我们的 jQuery 就不能用了 。那么这个时候, jQuery 为我们提供了一个多库并存的方法

1.13.1 交还jQuery命名的控制权

 下面这个方法可以交还 jQuery 命名的控制权 
 jQuery.noConflict() 
 上面代码执行完毕以后 $ 这个变量就不能用了 。但是 jQuery 可以使用 
 console.log($) // undefined 
 console.log(jQuery) // 可以使用

1.13.2 完全交出控制权

下面 这个方法可以交并且传递一个 true 的时候,会完全交出控制权 
jQuery.noConflict(true)

面代码执行完毕以后 $ 这个变量就不能用了 ,jQuery 这个变量也不能用了 
  console.log($) // undefined 
  console.log(jQuery) // undefined

1.13.3 更换控制权

可以用一个变量来接受返回值,这个变量就是新的控制权 
     var aa = jQuery.noConflict(true) 
接下来就可以把 aa 当作 jQuery 向外暴露的接口使用了 
    aa('div').click(function () { console.log('我被点击了') })

你可能感兴趣的:(javascript,jquery,前端)