前端 _ jQuery 之 小白版 ( 下 )

4 篇文章 0 订阅

目录

1. jQuery 发送 ajax 请求 :

1. $.get( ) - 专门发送 get 请求的方法

2. $.post( ) - 专门发送 post 请求的方法

2. jQuery 发送 jsonp 请求 : 

3. jQuery 内的全局 ajax 生命周期函数 :

4. jQuery 的入口函数 :

5. jQuery 的多库并存 :

6. jQuery 实现深浅拷贝 :

1. 深浅拷贝

7. jQuery 的插件扩展机制 :

jQuery 简图 : ( 下 ) 


1. jQuery 发送 ajax 请求 :

+ jQuery 内的 ajax 封装模式就是按照 回调函数 和 promise 两种形式进行封装的

+ 你使用的时候, 可以按照 回调函数 的形式使用, 也可以按照 promise 的形式使用

 1. ajax( )

+ 专门用来发送 ajax 请求的方法

+ 使用不需要选择到元素

+ 语法: $.ajax({ 对本次请求的配置信息 })

=> url 必填 , 表示 请求地址

=> method : 选填, 表示 请求方式 (默认是 GET)

  ~> method 可以写成 type 也可以写成 method

=> data : 选填, 表示携带给后端的 参数 (默认是 空字符串)

  ~> 在 jquery 内, 不光可以写查询字符串格式

  ~> 也可以直接书写 对象 数据类型

=> async : 选填, 表示是否 异步 (默认是 true , 表示异步)

=> dataType : 选填, 表示是否 解析 后端返回的数据,

默认是 'string' 不解析, 选填 ' json ' 表示解析

=> success : 选填, 表示 成功 的回调函数

=> error : 选填, 表示 失败 的回调函数 ( jquery 认为失败就是失败 )

  ~> 失败可以不光是请求失败

  ~> 如果解析失败也会走失败 error 的回调函数

=> timeout : 选填, 默认是 true( 表示永久 ), 可以选填一个数字, 表示 超时时间 , 单位是 ms

=> cache : 选填, 表示是否 缓存 , 在发送 ajax 请求的时候默认是 true, 表示缓存

  ~> 选填为 false 的时候, 表示不缓存

  ~> 额外给你添加一个参数叫做 _ , 值是 时间戳

=> context : 选填, 表示 ajax 回调函数的 上下文 , 回调函数内的 this 指向

  ~> 默认是 jquery 自己封装的 ajax 对象

  ~> 可以自己调整, 填写任意内容

=> headers : 选填, 默认是没有, 当你需要额外设置 请求头 信息的时候

  ~> 可以在这个 headers 内书写

  ~> 注意: headers 的值是一个 对象数据类型,

把你要设置的请求头直接书写在对象内就可以了

// ( 1 )
$.ajax({
  url: './ajax',    // 必填 , 请求的地址
  method: 'POST',   // 选填 , 请求的方式(默认是'GET')
  data: { name: 'Jack', age: 18 },// 选填, 发送请求时携带的参数
  dataType: 'json', // 选填, 默认是 string ,不解析, 'json'表示解析
  success: function (res) { console.log(res) }  // 选填, 成功的回调函数
})
// ( 2 )按照 promise 的形式书写
$.ajax({
  url: './ajax',    // 必填 , 请求的地址
  method: 'POST',   // 选填 , 请求的方式(默认是'GET')
  data: { name: 'Jack', age: 18 },// 选填, 发送请求时携带的参数
  dataType: 'json' // 选填, 默认是 string ,不解析, 'json'表示解析
}).then(res => console.log(res))  // 选填, 成功的回调函数
// ( 3 )
async function fn() {
  const res = await $.ajax({
    url: './ajax',    // 必填 , 请求的地址
    method: 'POST',   // 选填 , 请求的方式(默认是'GET')
    data: { name: 'Jack', age: 18 },// 选填, 发送请求时携带的参数
    dataType: 'json' // 选填, 默认是 string ,不解析, 'json'表示解析
  })
  console.log(res)
}
fn()
const obj = { name: '我是自己创建的一个 obj 对象' }
$.ajax({
  url: './ajax',
  method: 'GET',
  data: { name: 'Jack', age: 18 },
  dataType: 'json',
  success: function (res) { console.log('成功', this) },
  error: function (xhr, err, info) {
    // xhr: jquery 封装的 ajax 对象
    // err: 错误信息
    // info: 错误信息的描述
    console.log('请求失败了')
    console.log(xhr)
    console.log(err)
    console.log(info)
  },
  // 表示超过 1000ms 服务器还没有给出响应, 那么直接取消请求, 认定请求失败
  timeout: 1000,
  // 会在请求发送的时候, 额外添加一个参数
  // 表示不缓存, 会给你添加一个参数, 叫做时间戳
  cache: false,
  // 表示把 success 回调函数内的 this 指向 obj 这个对象
  context: obj,
  // 表示你所有需要额外设置的请求头信息
  headers: {
    authorization: 'abcdef',
    abc: 100
  }
})

1. $.get( ) - 专门发送 get 请求的方法

+ 语法: $.get(请求地址, 携带的参数, 回调函数, 是否解析)
          => 携带的参数: 可以选填, 可以是查询字符串, 也可以是 对象
        + 按照 promise 和 回调函数 两种方式封装的

// 1. 发送一个 get 请求
$.get('./ajax.php', 'a=100&b=200', res => console.log(res), 'json')

2. $.post( ) - 专门发送 post 请求的方法

+ 语法: $.post(请求地址, 携带的参数, 回调函数, 是否解析)
            => 携带的参数: 可以选填, 可以是查询字符串, 也可以是 对象
        + 按照 promise 和 回调函数 两种方式封装的

// 2. 发送一个 post 请求
$.post('./ajax.php', { username: 'zhangsan', password: '123456' }).then(res => console.log(res))

2. jQuery 发送 jsonp 请求 : 

回顾 + jsonp 原理 :
+ 利用 script 标签能把请求回来的内容当做 js 代码执行
+ 利用 src 不受同源策略的影响
+ 要求:
=> 后端返回的是一个可以执行的合法的 js 代码
=> 后端返回的内容是一个 '函数名(数据)' 这样的字符串
=> 前端在发送请求的时候, 把准备好的函数名给到后端

使用的方法是  $.ajax( )
+ 要求: dataType 必须写成 'jsonp'
  => dataType 你写成 json 或者 string 的时候, 都是发送 ajax 请求
  => dataType 你写成 jsonp 的时候, 就不会发送 ajax 请求了, 
  而是 创建 script 标签 发送 jsonp 请求
+ 注意: 在配置项内有两个专门为 jsonp 请求设置的配置项
  1. 会自动帮你添加一个参数叫做 callback, 表示我准备好的回调函数
    => 名字是 jquery 随机组成的
    => 名字可以修改
    => 使用 jsonpCallback 字段 : 表示函数名
  2. jquery 默认添加的字段名字叫做 callback
    => 表示给后端传递回调函数名的字段
    => 可以修改的
    => 使用 jsonp 字段修改
  3. cache 缓存机制
    => 当你发送 ajax 请求的时候, cache 默认值是 true, 表示缓存, 
    不会添加一个时间戳作为参数
    => 当你发送 jsonp 请求的时候, cache 默认值是 false, 表示不缓存, 
    会添加一个时间戳作为参数

$.ajax({
  url: './jsonp.php',
  // 表示发送一个 jsonp 请求
  dataType: 'jsonp',
  // success: function (res) { console.log(res) },
  jsonpCallback: 'fn',  // jsonp 请求的时候回调函数的名称
  jsonp: 'cb' // 表示在参数中把 回到函数的 字段名改成 cb
})
function fn(res) {
  console.log('我是 fn 函数')
  console.log(res)
}
// 百度搜索引擎
$.ajax({
      url: 'https://www.baidu.com/sugrec',
      data: {
        pre: 1,
        p: 3,
        ie: 'utf-8',
        json: 1,
        prod: 'pc',
        from: 'pc_web',
        sugsid: '34099,33970,34004,33855,33607,26350,22159',
        wd: 'a',
        req: 2,
        csor: 1
      },
      // 表示发送一个 jsonp 请求
      dataType: 'jsonp',
      // 表示我准备好的函数叫做 fn 函数
      jsonpCallback: 'fn',
      // 表示在参数中把 回到函数的 字段名改成 cb
      jsonp: 'cb',
      cache: true,
      success (res) {
        console.log(res)
      }
    })


3. jQuery 内的全局 ajax 生命周期函数 :

+ 也叫作 ajax 的 钩子函数

1. ajaxStart( ) - 请求开始

  + 语法: $(window).ajaxStart(function () {})

  + 时机: 同一个作用域下的第一个 ajax 发送的时候, 会触发执行

2. ajaxSend( ) - 发送之前

  + 语法: $(window).ajaxSend(function () {})

  + 时机: 会在每一个请求发送出去之前 触发执行

3. ajaxSuccess( ) - 成功之后

  + 语法: $(window).ajaxSuccess(function () {})

  + 时机: 会在每一个请求成功了之后 触发执行

4. ajaxError( ) - 失败之后

  + 语法: $(window).ajaxError(function () {})

  + 时机: 会在每一个请求失败了之后 触发执行

5. ajaxComplete( ) - 完成之后

  + 语法: $(window).ajaxComplete(function () {})

  + 时机: 会在每一个请求完成之后 触发执行, 不管成功还是失败, 都是完成

6. ajaxStop( ) - 请求结束

  + 语法: $(window).ajaxStop(function () {})

  + 时机: 同一个作用域下的最后一个 ajax 完成以后, 触发执行

// 1. ajaxStart() - 请求开始
$(window).ajaxStart(function () { console.log('第一个请求发送之前, ajax 开始') })
// 2. ajaxSend() - 发送之前
$(window).ajaxSend(function () { console.log('有一个请求发送出去了') })
// 3. ajaxSuccess() - 成功之后
$(window).ajaxSuccess(function () { console.log('有一个请求成功了^_^') })
// 4. ajaxError() - 失败之后
$(window).ajaxError(function () { console.log('有一个请求失败了') })
// 5. ajaxComplete() - 完成之后
$(window).ajaxComplete(function () { console.log('有一个请求完成') })
// 6. ajaxStop() - 请求结束
$(window).ajaxStop(function () { console.log('最后一个请求完成了') })

 案例 : 利用钩子函数完成一个 loading 效果

button {
  padding: 20px;
  font-size: 20px;
}
div {
  width: 100%;
  height: 100%;
  position: fixed;
  left: 0;
  top: 0;
  background-color: rgba(255, 255, 255, .5);
  display: flex;
  justify-content: center;
  align-items: center;
  display: none;
}
<button>发送请求</button>
<div class="loading">
  <img src="https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fhbimg.b0.upaiyun.com%2F16f7121aedf9990f3ddd8725e99fe4d8369e06692d18-J0TUcl_fw658&refer=http%3A%2F%2Fhbimg.b0.upaiyun.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1630134491&t=e1a2d516e36c3b9be945e4faebf565da" alt="">
</div>
<script src="./jquery/jquery.min.js"></script>
// 1. 什么时候开始显示 loading 效果
// 只要有一个请求发送出去, 就要显示
$(window).ajaxSend(() => $('.loading').css('display', 'flex'))
// 2. 什么时候小时 loading 效果
// 只要有一个请求完成了, 就要消失
$(window).ajaxComplete(() => $('.loading').hide())
// 3. 点击按钮发送请求
//(可自己配置一个 ajax.php 文件, 需要在本地打开)
$('button').click(() => {
  $.get('./ajax.php')
})

可将网络切换到弱的 3G 状态下, 查看效果更佳 : 



4. jQuery 的入口函数 :

+ 语法: $(window).ready(function () { ... })
+ 注意: 会在页面 DOM 结构加载完毕后执行
+ 类似于: window.onload = function () {}
+ 区别:
  => window.onload 是所有 资源 加载完毕后触发
  => jQuery 入口函数是只要 html 结构加载完毕就触发了
+ 简写:
  => jQuery 的入口函数有一个简写形式
  => $(function () { ... })

<img src="https://img2.baidu.com/it/u=3228549874,2173006364&fm=26&fmt=auto&gp=0.jpg" alt="">
<script src="./jquery/jquery.js"></script>
// 1. 入口函数
// 1-1. onload
window.onload = function () { console.log('页面所有资源加载完毕') }
// 1-2. 入口函数
$(window).ready(function () {
  console.log('jQuery 的入口函数')
  console.log('DOM 结构加载完毕了')
})
// 入口函数简写 :
$(function () {
  console.log('入口函数')
  console.log('DOM 结构加载完毕了')
})

 


5. jQuery 的多库并存 :

+ 如果你引入了别的框架插件等第三方文件内容也是使用  $  和  jQuery  这个名字

+ 那么你把 jQuery 引入在最后面

+ 通过 jQuery 的 语法来还原 $ 和 jQuery

+ jQuery 可以交出 $ 和 jQuery 的控制权给别人

 1. 还原 $

+ 语法: $.noConflict( )

  + 这个代码一旦执行,就会让出 $ 这个变量的控制权

  + jQuery 不再占用 $ 这个名字了

  $.noConflict( )  

2. 还原 $ 和 jQuery

+ 语法: $.noConflict(true)

  + 这个代码一旦执行, 就会让出 $ 和 jQuery 的控制权

  + jQuery 不再占用 $ 和 jQuery 这两个名字了

  $.noConflict(true)  

3. 直接定义行的控制权

  + 直接接受 $.noConflict( ) 的 返回值 , 就是新的控制权

  + 你自己定义一个新的名字当做 jQuery 的名字

  const love = $.noConflict(true)  


6. jQuery 实现深浅拷贝 :

1. 深浅拷贝

+ 在复制一个数据类型的时候(特指复杂数据类型, 数组或者对象)

+ 在 JS 内, 对于 "复制" 有三个级别 :

  1. 赋值

  2. 浅拷贝

  3. 深拷贝

1. 赋值 :

  + 简单的地址复制

  + 使用 赋值符号( = ) 进行的操作

  + 对于基本数据类型, 赋值之后两个变量之间没有任何关系

  + 对于复杂数据类型, 赋值之后两个变量操作同一个数据存储空间

// 1. 赋值
let n1 = 5
// 把 n1 的值赋值给了 n2
let n2 = n1
console.log(n1, n2)    // 5  5
n2 = 10
console.log(n1, n2)    // 5  10

const o1 = { name: 'Jack' }
// 进行赋值操作, 把 o1 的值赋值给了 o2
// 因为 o1 这个变量内存储的是指向一个 对象数据类型 的空间地址
// 赋值的过程中, 就是把 o1 存储的地址赋值给了 o2
// 所以给到 o2 的依旧是一个 地址
// 从此以后 o1 和 o2 操作一个对象存储空间
const o2 = o1
console.log(o1, o2)
// 使用任意一个变量名修改对象空间内的成员
o2.name = 'Rose'
console.log(o1, o2)


2. 浅拷贝 :

=> 创建一个和原先数据结构一模一样的数据结构

+ 假如原先是个数组数据类型, 那么就新创建一个数组

+ 假如原先是个对象数据类型, 那么就新创建一个对象

=> 通过 for in 循环去遍历原先数据结构

+ 把里面的每一个数据分别在新的数据结构中复制一份

+ 对于一维数据结构有效

+ 如果是多维数据结构,没有意义 , 那么从第二维度开始, 依旧是操作同一个存储空间

// 2. 浅拷贝
const o1 = { name: 'Jack', age: 18, info: { height: 180 } }
// 2-1. 创建一个和原先数据结构一模一样的结构
const o2 = {}
// 2-2. 循环遍历原始数据结构
for (const key in o1) {
  // 2-3. 分别在新的数据结构中进行赋值
  // 在进行 for in 遍历的时候
  // 在这里, 当 key === info 的时候
  // o1[key] 存储的也是一个地址
  // o2[key] 就是把 o1[key] 存储的地址复制了一份过去
  // 从此以后, o1 和 o2 虽然是两个数据空间
  // 但是 o1.info 和 o2.info 操作的是一个数据空间
  // o2.info = o1.info
  // 因为 info 内存储的是一个 地址
  // 赋值以后, o2.info 和 o1.info 存储的是同一个地址
  o2[key] = o1[key]
}
// 此时 o1 和 o2 不是一个对象存储空间
// 只是长得一模一样的两个对象存储空间
// 用任意一个区操作的时候, 另外一个不会改变
console.log(o1, o2)

// 修改
o2.name = 'Rose'
o2.age = 20
console.log(o1, o2)

// 修改第二维度 info 内的数据
o2.info.height = 200
console.log(o1, o2)


知识点扩展 :

// 准确的判断所有数据类型
// 语法: Object.prototype.toString.call(你要判断的数据类型)
// 返回值: 该数据类型的 类型字符串 '[object 类型]'
console.log(Object.prototype.toString.call({}))       //     Object
console.log(Object.prototype.toString.call([]))       //     Array
console.log(Object.prototype.toString.call(123))      //     Number
console.log(Object.prototype.toString.call('123'))    //     String
console.log(Object.prototype.toString.call(true))     //     Boolean
console.log(Object.prototype.toString.call(null))     //     Null
console.log(Object.prototype.toString.call(undefined))//     Undefined
console.log(Object.prototype.toString.call(/^$/))     //     RegExp
console.log(Object.prototype.toString.call(new Date()))//    Date
console.log(Object.prototype.toString.call(function () {}))//Function

 

// 如果一个数据是数组数据类型
// 那么当你访问他的 constructor 的时候, 自己没有, 就要去自己的 __proto__ 上查找
// 数组的 __proto__ 就是 Array.prototype
// Array.prototype 上面的 constructor 就是 Array

// 如果一个数据是对象数据类型
// 那么当你访问他的 constructor 的时候, 自己没有, 就要去自己的 __proto__ 上查找
// 对象的 __proto__ 就是 Object.prototype
// Object.prototype 上面的 constructor 就是 Object


3. 深拷贝 :

=> 不停地重复浅拷贝的工作

=> 复制出一份完全一模一样的数据结构

=> 不管多少维度的数据结构, 都能完整独立的复制过来

=> 实现方式:

+ 使用 递归 的方式进行逐层数据结构的 遍历数据并赋值

+ 当我循环遍历的时候, 如果碰到的还是复杂数据类型

+ 那么就递归进行遍历

// 3. 深拷贝
const o1 = {
  name: 'Jack',
  age: 18,
  info: {
    weight: 180,
    height: 180,
    desc: {
      msg: '这个人很懒, 什么都没有留下!'
    }
  },
  hobby: ['吃饭', '睡觉', ['篮球', '足球']]
}
const o2 = {}
// 3-1. 书写函数来完成(递归函数)
// 使用递归的方式进行深拷贝
function deepCopy(o2, o1) {
  // 做: 把 o1 内的所有数据全部拷贝到 o2 内部
  // console.log(o1, o2)
  //3-2. 直接循环遍历 o1 数据
  for (let key in o1) {
    // console.log(key);
    // 判断, 如果是 对象数据类型 或者 数组数据类型, 不进行赋值
    // 否则, 才进行赋值
    // 如果 o1[key] 是一个对象数据类型
    // o2[key] 也要创建为一个对象数据类型
    // 如果 o1[key] 是一个数组数据类型
    // o2[key] 也要创建为一个数组数据类型
    // 如果 o1[key] 是一个基本数据类型
    // o2[key] 直接赋值
    if (Object.prototype.toString.call(o1[key]) === '[object Object]') {
      // 是对象
      // console.log('o1[key] 是一个对象数据类型 : ', key)
      o2[key] = {}
      // 在这个位置, o1[key] 是一个对象数据类型
      // o2[key] 也是一个数据类型
      // o1[key] 里面的每一个数据复制一份到 o2[key]
      deepCopy(o2[key], o1[key])
    } else if (o1[key].constructor === Array) {
      // 是数组
      // console.log('o1[key] 是一个数组数据类型 : ', key)
      o2[key] = []
      // 把 o1[key] 内部的所有数据放在 o2[key] 内
      deepCopy(o2[key], o1[key])
    } else {
      // console.log('o1[key] 是一个基本数据类型 : ', key)
      // 直接复制
      o2[key] = o1[key]
    }
  }
}
// 将来使用的时候
deepCopy(o2, o1)
console.log(o1, o2)
// 修改数据
o2.info.desc.msg = 'hello world'

4. 深拷贝 - 方案2

  + 只能是在 对象 和 数组 数据结构中使用

  + 不能有函数

  + 利用 json 格式字符串

  4-1. 把源数据转换成 json 格式字符串

  4-2. 把 json 格式字符串转换回 js 数据类型

// 4. 深拷贝 - 方案2
const o1 = { name: 'Jack', age: 18, info: { weight: 180, height: 180, desc: { msg: '你好 世界' } }, hobby: [ '吃饭', '睡觉' ] }
console.log(o1)
// 把 o1 转换成 json 格式字符串
// 现在的 jsonStr 就是基本数据类型
const jsonStr = JSON.stringify(o1)
console.log(jsonStr)
// 把 s 转换成一个 JS 的对象格式
const o2 = JSON.parse(jsonStr)
console.log(o2)
// 修改
o2.info.desc.msg = 'hello world'
console.log(o1, o2)

jQuery 内有实现深浅拷贝的方法 :
+ $.extend( )

const o1 = {
  name: 'Jack',
  age: 18,
  info: {
    weight: 180,
    height: 180,
    desc: {
      msg: '这个人很懒, 什么都没有留下!',
      title: '你好 世界'
    }
  },
  hobby: [ '吃饭', '睡觉', [ '篮球', '羽毛球', '足球' ] ]
}

+ 浅拷贝 :
  => 语法: $.extend(对象1, 对象2, 对象3, ...)
  => 作用: 把从 对象2 开始的所有对象内的数据进行浅拷贝到 对象1 内
  => 实现的是浅拷贝

// 1. 实现浅拷贝
// 把 o1 内的所有数据进行浅拷贝到 o2 身上
let o2 = {}
$.extend(o2, o1)
console.log(o1, o2)
// 修改一下数据
o2.name = 'Rose'
// 第二维度修改
o2.info.height = 200
console.log(o1, o2)

+ 深拷贝:
  => 语法: $.extend(true, 对象1, 对象2, 对象3, ...)
  => 作用: 把从 对象2 开始的所有对象内的数据进行深拷贝到 对象1 内
  => 实现的是深拷贝

// 2. 实现深拷贝
let o2 = {}
$.extend(true, o2, o1)
// console.log(o1, o2)
// 修改
o2.name = 'Tom'
o2.info.height = 250
o2.info.desc.msg = '这个人更懒'
console.log(o1, o2)


7. jQuery 的插件扩展机制 :

+ jQuery 提供的一些扩展内容

+ 当你认为 jQuery 内的方法不够用的时候

+ jQuery 的方法分成两类

  1. 扩展给 jQuery 自己本身的方法 :

  + 语法: $.extend({

    方法名: 函数 ,

    ...

  })

  + 扩展以后是给 jQuery 本身使用的

+ 使用: $.方法名( )

=> 不需要依赖 DOM 来执行的方法

// 1. 给 jQuery 本身扩展方法
$.extend({
  a: function () { console.log('我是一个 a 方法') },  // 我是一个 a 方法
  setCookie: function (key, value, expires) {
    if (!expires) {
      document.cookie = key + '=' + value
      return
    }
    const time = new Date()
    time.setTime(time.getTime() - 1000 * 60 * 60 * 8 + 1000 * expires)
    document.cookie = key + '=' + value + ';expires=' + time
  },
  getCookie: function (key) {
    // ...
  }
})
$.a()
// 可以使用 给 jQuery 扩展的方法
$.setCookie('a', 100, 30)


  2. 扩展给原型上的方法 :

  + 语法: $.fn.extend({

    方法名: 函数 ,

    ...

  })

  + 扩展以后是给所有元素集合使用的

+ 使用: $().方法名( )

+ 第二种书写方式:

  $.extend($.fn, { 方法名: 函数, ... })

=> 需要依赖 DOM 来执行的方法

<input type="checkbox">
<input type="checkbox">
<input type="checkbox">
// 2. 扩展给 jQuery 的原型上的方法
$.fn.extend({
  // 我向 jquery 的原型上扩展了一个叫做 a 的方法
  a: function () {
    console.log('你好 世界')
  },
  checked: function (type = true) {
    // type 是 true 就设置为 true, type 是 false 就设置为 false
    // console.log('我能让元素集合内的所有内容选中')
    // 问题: 这里的 this 是谁 ?
    // 这个 checked 函数调用方式, xxx.checked()
    // 这个 checked 函数内的 this 是 点前面的内容
    // 这里的 this 就是 jQuery 获取到的元素集合 => input 的元素集合
    // 只要我遍历 this, 让内部的每一个都选中
    // 在方法内循环, 就是为了 隐式迭代
    this.each((index, item) => {
      item.checked = type
    })
    // 只要这个函数内返回一个 jQuery 的元素集合
    // 就可以达到链式编程的效果了
    return this
    // 在方法内返回 this, 就是为了使用链式编程
  }
})
$('input').checked(false)

 $('input').checked( ).css('width',60) 

报错 : Cannot read property 'css' of undefined

 

// 使用的时候
// 问题: 为什么我们书写的方法没有办法实现链式编程 ?
// 因为必须是元素集合, 才可以调用 css 这个方法
// .css( ) 这个方法需要依赖 jQuery 的元素集合使用
// 元素集合.css( )
// .css() 的前面是 $( ).checked( )
// 说明这一坨不是 jQuery 的元素集合
// 问题3: $( ).checked( ) 是什么东西 ?
// 依旧是 undefined
// $('input').checked( )

 扩展知识=>便与你理解一下 : 

function fun() {
  const n = 10 + 20
}
// res 是
const res = fun()
console.log(res)  // undefined
const obj = {
  fn: function () {
    const n = 1 + 2
  }
}
// res 是什么 ?
// undefined
const res = obj.fn()
console.log(res)  // undefined
// 定义了一个函数
function fun() { return 123 }
// fun 函数名, 存储的是该函数的地址
// 你使用 fun 的时候, 就是在使用这个函数的地址, 其实就是函数体本身
console.log(fun)        // ƒ fun() { return 123 }
// 把 fun 存储的函数地址赋值给 r1 变量
// 从此以后 r1 就是 fun 函数
const r1 = fun
console.log(r1)         // ƒ fun() { return 123 }
console.log(r1 === fun) // true

// fun() 是把函数调用
// r2 就是把函数调用完毕, 函数内给出的返回值
const r2 = fun()
console.log(r2)   // 123
// 函数名() === 函数体内的 return


jQuery 简图 : ( 下 ) 

总结一下 : $( ) 

  1. $('选择器') => 获取页面元素

  2. $(DOM节点) => 把 DOM 节点转换成 jquery 的元素集合

  3. $('html 结构字符串') => 创建节点

  4. $(函数)

    => jQuery 的入口函数, 会在 DOM 结构加载完毕后执行


前端 _ jQuery 之 小白版 ( 上 ) : https://blog.csdn.net/weixin_58099903/article/details/119208398

整理不易 , 望大家点点赞多多支持一下 (#^_^#) 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值