【H2O2|全栈】JS进阶知识(二)jQuery(2)

18,941次阅读
没有评论

共计 5401 个字符,预计需要花费 14 分钟才能阅读完成。

目录

前言

开篇语

准备工作

$ 属性操作

常见方法

案例

$ 尺寸

$ 距离

$ 事件

原生 JS 注册事件

$ 注册事件

简单注册事件

多事件注册

$ 事件解绑

$ 节点

创建节点

方法

案例 

清空节点

添加节点

结束语


前言

开篇语

本系列博客主要分享 JavaScript 的进阶语法知识,本期为第二期,主要分享的内容为:jQuery 属性、尺寸、距离、事件、节点操作等重点知识点。

从进阶部分开始,我们将脱离原生的 JS,使用一些包装的第三方库来完成我们的需求。这些 JS 库需要在文档的开头引入,暂时的引入格式为 script 标签加 src 地址。

与基础部分的语法相比,进阶部分的语法会有较大的差别,注意最好不要混用原生方法与第三方库内容,以免出现不必要的麻烦。

准备工作

软件:【参考版本】Visual Studio Code

插件(扩展包):Open in browser, Live Preview, Live Server, Tencent Cloud AI Code Assistant, htmltagwrap

提示:在不熟练的阶段建议关闭 AI 助手

第三方 JS 库:jquery.min.js

提示:请站内搜索下载、引入方式

浏览器版本:Chrome

系统版本: Win10/11/ 其他非 Windows 版本

$ 属性操作

常见方法

有时,我们需要对 DOM 元素的属性进行获取、修改或移除,$ 为我们提供了下面的一系列方法来对元素 的属性进行相关的操作——

方法 作用
attr(‘xxx’) 获取 DOM 元素的指定属性(不包含值为 boolean 值的属性
prop(‘yyy’) 获取 DOM 元素的值为 boolean 值的属性
attr(‘xxx’, ‘value’) 为 DOM 元素的指定属性设置属性值(不包含值为 boolean 值的属性)
prop(‘yyy’, ‘value’) 为 DOM 元素的值为 boolean 值的属性设置值
removeAttr(‘xxx’) 为 DOM 元素移除指定属性(所有属性

案例

现在,我们有这样一个表格,需求是实现选择框的 全选与反选 功能——

【H2O2| 全栈】JS 进阶知识(二)jQuery(2)

参考的 HTML 代码为——

    
游戏名称 所属平台
CS2 Steam
Apex Steam
地平线五 Steam
PUBG Steam

 参考的 CSS 样式如下——

        * {
            padding: 0;
            margin: 0;
            text-align: center;
        }

        .wrap {
            width: 300px;
            margin: 100px auto 0;
        }

        table {
            border-collapse: collapse;
            border-spacing: 0;
            border: 1px solid #c0c0c0;
        }

        th,
        td {
            border: 1px solid #d0d0d0;
            color: #404060;
            padding: 10px;
        }

        th {
            background-color: #09c;
            font: bold 16px "微软雅黑";
            color: #fff;
        }

        td {font: 14px "微软雅黑";}

        .td-ipt {
            display: flex;
            justify-content: space-between;
        }

        label {cursor: pointer;}

        tbody tr {background-color: #f0f0f0;}

        tbody tr:hover {
            cursor: pointer;
            background-color: #fafafa;
        }

        input {cursor: pointer;}

来到最关键的 JS 代码,使用 jQuery 实现,实现的流程如下:

  1. 获取全选按钮的 checked 值,并赋值给各个“入库”按钮
  2. 获取所有 checked 为 true 的“入库”按钮,只有其数量等于所有“入库”按钮的总数量,全选按钮才被选中,否则就是不选中状态

对于第一步,实现代码比较简单,只需要用到 prop 即可——

    $('#j_cbAll').on({'click': function () {$('#j_tb input').prop('checked', $(this).prop('checked'))
        }
    })

对于第二步,我们可以使用:checked 筛选所有设置了 checked 状态的按钮,得到的是一个数组,那么,我们就可以使用 length 属性获取按钮的数量。

同理,我们也可以获取所有“入库”按钮的数量。

最后,我们可以判断上面的这两个数量是否相同,如果不同将得到 false 值,相同则得到 true 值,只需要让全选按钮的状态等于该值即可。

实现的代码如下——

    $('#j_tb input').on({'click': function () {var checkedLen = $('#j_tb input').length
            var len = $('#j_tb input').length
            $('#j_cbAll').prop('checked', checkedLen == len)
        }
    })

$ 尺寸

获取 $ 对象元素的尺寸的方法有下面这些——

方法 尺寸范围
width() 只包含 CSS 中的 width
height() 只包含 CSS 中的 height

outerWidth()

内容+内边距+边框,不含外边距

outerHeight() 内容+内边距+边框,不含外边距

outerWidth(true)

内容+内边距+边框+外边距

outerHeight(true)

内容+内边距+边框+外边距

注意,border-box 和 content-box 的 width()和 outerWidth()存在不同。高同理。

$ 距离

获取 $ 对象的距离有关的常见方法有下面两种——

方法 作用
offset() 返回到 document 的距离,即窗口边缘的距离 (top,left)
position()

返回到有定位的、最近的父元素的距离

(top,left)

此外,还有一组和滚动条移动效果有关的方法——

方法 作用

scrollTop()

不设置参数,获取垂直方向滚动的距离;

设置数值参数,设置垂直方向滚动的距离

scrollLeft()

不设置参数,获取水平方向滚动的距离;

设置数值参数,设置水平方向滚动的距离

$ 事件

原生 JS 注册事件

我们知道,事件的三要素是事件源、事件类型和事件执行程序。

对于原生 JS 而言,一个常规的鼠标单击事件可以是下面这样的——

var btn = document.querySelector(‘button’)

btn.onclick = function () {

        console.log(1)

}

或者,我们也可以使用添加事件侦听器来完成事件绑定——

var btn = document.querySelector(‘button’)

btn.addEventListener(‘click’, function () {

        console.log(1)

})

其中,第一种方式为 简单注册事件 ,它只能单独创建事件,比较单一、独立。它的缺点也是很明显的—— 不能同时注册事件

第二种方式相对来说就灵活多了,可以 绑定多个事件 ,支持 同时动态绑定事件 ,也可以很方便地进行 事件解绑操作 。此外,该方式还可以获取我们的 事件对象

$ 注册事件

jQuery 也有自己对应的简单注册事件和多事件注册方式。它们的特点以及优缺点和原生 JS 是相对应的,不再重复叙述。

简单注册事件

jQuery 提供的简单事件注册的方式如下:

$(‘ 元素 ’). 事件类型(function () {// 事件处理程序})

比如,注册上面的鼠标单击事件,就可以这么做——

$(‘button’).click(function () {

        console.log(1)

}) 

多事件注册

多事件注册有下面两种方法——

方法 示例格式
bind()

1. 事件类型 - 执行程序  $().bind(“click mouseover”,function(){})

2. 对象  $().bind({click:function(){},mouseover:function(){}})

on()

1. 事件类型 - 执行子代 - 执行程序  $().on(‘click’, ‘div,span’, function () {})

2. 对象 - 执行子代  

$().on({click: function () {},mouseover: function () {}}, ‘div,span’)

在 on()方法中,也可以使用事件对象,比如当前节点,也可以使用 e.target 等事件对象的属性。

$ 事件解绑

对于简单注册事件,我们可以利用 return false 的方式解绑。

对于 on 注册事件,我们可以利用 off(‘事件类型‘) 的方式解绑。

$ 节点

创建节点

方法

创建节点通常直接使用下面两种方式解析字符串——

方法 特点
html()

参数为字符串,可以解析参数的 html 标签,转化为节点

不填参数为获取

text()

参数为字符串,无法解析 html 标签

不填参数为获取

特别的,对于获取节点的值,当节点为 input 时,可以使用 val() 获取 value 值。

比如,我们需要在 ul 中创建一个 li 元素,可以这么做——

$(ul).html(‘

  • 内容
  • ‘)

    案例 

    我们可以利用 html()的特点,动态创建节点。

    示例的表格生成前后的效果如下——

    【H2O2| 全栈】JS 进阶知识(二)jQuery(2)

    【H2O2| 全栈】JS 进阶知识(二)jQuery(2)

    按照惯例,首先给出参考的 HTML 代码和 CSS 样式。

    参考 HTML 代码如下——

        
        
    游戏名称 游戏类型 登录平台

    参考 CSS 样式如下——

            * {
                padding: 0;
                margin: 0;
            }
    
            table {
                width: 300px;
                border-collapse: collapse;
                border-spacing: 0;
                border: 1px solid #c0c0c0;
            }
    
            th,
            td {
                border: 1px solid #d0d0d0;
                color: #404060;
                padding: 10px;
            }
    
            th {
                background-color: #09c;
                font: bold 16px "微软雅黑";
                color: #fff;
            }
    
            td {font: 14px "微软雅黑";}
    
            tbody tr {background-color: #f0f0f0;}
    
            tbody tr:hover {
                cursor: pointer;
                background-color: #fafafa;
            }
            input {cursor: pointer;}

    提供的 JS 数据列表如下——

            var data = [
                {
                    name: 'CS2',
                    type: 'FPS',
                    plat: 'Steam'
                }, {
                    name: 'CF',
                    type: 'FPS',
                    plat: 'WeGame'
                },
                {
                    name: 'DOTA2',
                    type: 'MOBA',
                    plat: 'Perfect World'
                }
            ]

    来到最关键的 JS 代码实现,一般来说有字符串拼接型传参和数组传参,它们的区别是后者的拼接效率更高。

    为按钮绑定点击事件,然后来到事件处理程序,我们需要拼接的目标字符串为如下的格式——

            

    表格项 1

            

    表格项 2

            

    表格项 3

    所以,我们可以直接使用模版字符串按上述格式拼接,中间的 td 项使用循环遍历数据数组中的对象。

    或者,我们可以使用一个数组,上面格式中的数据,每一行的代码存为一个数组项,最后再将数组转为字符串。

    由于 push()只是在原数组操作,而字符串拼接总是在创建新字符串,所以数组的效率会更高。

    字符串方式添加数据代码——

                var str = ""
                for (var item of data) {str += ``
                    for (var key in item) {str += `${item[key]}`
                    }
                    str += ``
                }
                console.log(str);
                $("#j_tbData").html(str)

    数组方式添加数据代码——

                var newArr = []
                for (var item of data) {newArr.push("")
                    for (var key in item) {newArr.push(`${item[key]}`)
                    }
                    newArr.push("")
                }
                $("#j_tbData").html(newArr.join(""))

    清空节点

    如果我们需要清空某个节点中的数据,$ 为我们提供了三种方式——

    方法 特点
    html(”) 清空但保留节点
    empty() 清空但保留节点
    remove() 连带当前节点一起删除

    注意,remove()会把本级节点一并删除,所以如果只是要清空节点内的数据,不要使用该方式

    但是,我们可以使用添加删除按钮,利用子节点调用父节点(parent())的方式,向上删除到目标层级,这样是比较安全的。

    添加节点

    在创建完节点之后,我们除了直接为父节点用 html()添加内容,也可以按照插入位置的不同使用下面几种方式添加节点——

    方法 作用
    append() 向自身子级的末尾添加
    prepend() 向自身子级的开头添加
    after() 往自身的后面添加
    before() 往自身的前面添加
    appendTo() 添加到父级的末尾

    其中,参数可以是 DOM 元素,也可以是 $ 对象,DOM 元素会隐式转换为 $ 对象。

    但是,调用者必须使用 $ 对象,比如 appendTo(),如果直接用创建的字符串调用,则它是没有这个方法的,因此用 $ 包装更好。

    结束语

    本期内容到此结束。关于本系列的其他博客,可以查看我的 JS 进阶专栏。

    在全栈领域,博主也只不过是一个普通的萌新而已。本系列的博客主要是记录一下自己学习的一些经历,然后把自己领悟到的一些东西总结一下,分享给大家。

    文章全篇的操作过程都是笔者亲自操作完成的,一些定义性的文字加入了笔者自己的很多理解在里面,所以仅供参考。如果有说的不对的地方,还请谅解。

    == 期待与你在下一期博客中再次相遇 ==

    ——临期的【H2O2】

    原文地址: 【H2O2| 全栈】JS 进阶知识(二)jQuery(2)

      正文完
       0
      Yojack
      版权声明:本篇文章由 Yojack 于2024-11-07发表,共计5401字。
      转载说明:
      1 本网站名称:优杰开发笔记
      2 本站永久网址:https://yojack.cn
      3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
      4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5 本站所有内容均可转载及分享, 但请注明出处
      6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
      7 站长邮箱:laylwenl@gmail.com
      评论(没有评论)