Maven Li.074

Maven 坐标 Maven坐标主要组成 groupld:定义当前Maven项目隶属组织名称(通常是域名反写,例如:org.mybatis) artifactld:定义当前Maven项目名称(通常是模块名称,例如CRM、SMS) version:定义当前项目版本号 Maven 指定本地仓库位置 Maven 软件和指定仓库位置的setting.xml都需要更改 <localRepository>D:\maven\repository</localRepository> Maven 镜像 Maven 软件和指定仓库位置的setting.xml都需要更改 <mirror> <id></id> <mirrorOf>central</mirrorOf> <name></name> <url></url> </mirror> Maven 项目构建命令 # 编译 mvn compile # 清理 mvn clean # 测试 mvn test # 打包 mvn package # 安装到本地仓库 mvn install Maven 插件创建工程 mvn archetype:generate -DgroupId={project-packaging} -DartifactId={project-name} -DarchetypeArtifactId=maven-archetype-quickstart -Dversion={project-version} -DinteractiveMode=false mvn archetype:generate "-DgroupId=com.companyname.bank" "-DartifactId=consumerBanking" "-DarchetypeArtifactId=maven-archetype-quickstart" "-DinteractiveMode=false" Idea 创建空项目 再创建Modules 即可, 可创建多个maven工程 Maven中依赖传递 依赖具有传递性 直接依赖: 在当前项目中通过依赖配置建立的依赖关系 间接依赖: 被依赖的资源如果依赖其他资源, 当前项目间接依赖其他资源 依赖传递冲突问题 路径优先: 当依赖中出现相同的资源时, 层级越深, 优先级越低, 层级越浅, 优先级越高 声明优先: 当资源在相同层级被依赖时, 配置顺序先前的覆盖配置顺序我才看到的 特殊优先: 当同级配置了相同资源的不同版本, 后配置的覆盖先配置的. Maven 依赖资源可见和排除 # 被依赖时, 其他人看到不到 <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.1</version> <option>true</option> </dependency> # 排除依赖的某个资源 <dependency> <groupId>org.example</groupId> <artifactId>web02</artifactId> <version>1.0-SNAPSHOT</version> <exclusions> <exclusion> <groupId>junit</groupId> <artifactId>junit</artifactId> </exclusion> </exclusions> </dependency> 依赖范围 scope 主代码 测试代码 打包 范例 compile(默认) log4j test junit provided servlet-api runtime jdbc compile test provided runtime complile compile test provided runtime test provided runtime runtime test provided runtime Maven 构建生命周期 default构建生命周期 validate(校验) 校验项目是否正确并且所有必要的信息可以完成项目的构建过程。 initialize(初始化) 初始化构建状态,比如设置属性值。 generate-sources(生成源代码) 生成包含在编译阶段中的任何源代码。 process-sources(处理源代码) 处理源代码,比如说,过滤任意值。 generate-resources(生成资源文件) 生成将会包含在项目包中的资源文件。 process-resources (处理资源文件) 复制和处理资源到目标目录,为打包阶段最好准备。 compile(编译) 编译项目的源代码。 process-classes(处理类文件) 处理编译生成的文件,比如说对Java class文件做字节码改善优化。 generate-test-sources(生成测试源代码) 生成包含在编译阶段中的任何测试源代码。 process-test-sources(处理测试源代码) 处理测试源代码,比如说,过滤任意值。 generate-test-resources(生成测试资源文件) 为测试创建资源文件。 process-test-resources(处理测试资源文件) 复制和处理测试资源到目标目录。 test-compile(编译测试源码) 编译测试源代码到测试目标目录. process-test-classes(处理测试类文件) 处理测试源码编译生成的文件。 test(测试) 使用合适的单元测试框架运行测试(Juint是其中之一)。 prepare-package(准备打包) 在实际打包之前,执行任何的必要的操作为打包做准备。 package(打包) 将编译后的代码打包成可分发格式的文件,比如JAR、WAR或者EAR文件。 pre-integration-test(集成测试前) 在执行集成测试前进行必要的动作。比如说,搭建需要的环境。 integration-test(集成测试) 处理和部署项目到可以运行集成测试环境中。 post-integration-test(集成测试后) 在执行集成测试完成后进行必要的动作。比如说,清理集成测试环境。 verify (验证) 运行任意的检查来验证项目包有效且达到质量标准。 install(安装) 安装项目包到本地仓库,这样项目包可以用作其他本地项目的依赖。 deploy(部署) 将最终的项目包复制到远程仓库中与其他开发者和项目共享。 插件 <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>3.2.1</version> <executions> <execution> <goals> <goal>jar</goal> </goals> <phase>generate-test-resources</phase> </execution> </executions> </plugin> </plugins> </build>

July 6, 2022&nbsp;·&nbsp;1 分钟&nbsp;·&nbsp;Lizicai

Redis Li.073

Redis 简介 NoSQL NoSQL: 即Not-Only SQL(泛指非关系型的数据库), 作为关系型数据库的补充. 作用: 应对基于海量用户和海量数据前提下的数据处理问题. 特征 可扩容, 可伸缩 大数据量下高性能 灵活的数据模型 高可用 类NoSQL数据库: Redis memcache HBase MongoDB Redis安装与配置 wget https://github.com/redis/redis/archive/7.0.0.tar.gz mkdir -p /opt mv 7.0.0.tar.gz /opt/redis.tar.gz cd /opt tar -xzvf redis.tar.gz cd redis make redis.conf # 需要创建data dir /opt/redis/data #默认端口6379 port 6379 #绑定ip,如果是内网可以直接绑定 127.0.0.1, 或者忽略, 0.0.0.0是外网 bind 0.0.0.0 #守护进程启动 daemonize yes #超时 timeout 300 loglevel notice #分区 databases 16 save 900 1 save 300 10 save 60 10000 rdbcompression yes #存储文件 dbfilename dump.rdb #密码 abcd123 requirepass abcd123 /etc/systemd/system/redis.service, ExecStart与安装目录保持一致 [Unit] Description=Redis7 After=redis7.service [Service] Type=forking ExecStart=/opt/redis/src/redis-server /opt/redis/redis.conf ExecStop=/opt/redis/src/redis-cli shutdown ExecReload=/bin/kill -s HUP $MAINPID PrivateTmp=true RestartSec=10 # The UNIX user and group to execute PostgreSQL as [Install] WantedBy=multi-user.target 启动 systemctl daemon-reload systemctl start redis systemctl stop redis Redis的数据类型 String 存储的数据: 单个数据,最简单的数据存储类型, 也是最常用的数据存储类型 存储数据的格式: 一个存储空间保存一个数据 存储内容: 通常使用字符串, 如果字符串以整数的形式展示, 可以作为数字操作使用 基本操作 # 添加/修改数据 set key value # 获取数据 get key # 删除数据 del key # 判定性添加数据 setnx key value # 添加/修改多个数据 mset key1 value1 key2 value2 ... # 获取多个数据 mget key1 key2 ... 获取数据字符个数 strlen key 追加信息到原始信息后部(如果原始信息存在就追加, 否则新建) append key value String 类型数据的扩展操作 # 设置数值数据增加指定范围的值 incr key incrby key increment incrbyfloat key increment # 设置数值数据减少指定小范围的值 decr key decrby key increment # 设置数据具有指定的生命周期 setex key seconds value psetex key milliseconds value hash类型 新的存储需求: 对一系列存储的数据进行编组, 方便管理, 典型应用存储对象信息 需要的存储结构: 一个存储空间保存多个键值对数据 hash类型: 底层使用哈希表学习方式去实现数据存储 # 添加/修改数据 hset key field value # 获取数据 hget key field hgetall key # 删除数据 hdel key field1 [field2] # 设置field值, 如果该field存在则不做任何操作 hsetnx key field value # 添加/修改多个数据 hmset key field1 value1 field2 value2 ... # 获取多个数据 hmget key field1 field2 ... # 获取哈希表中字段的数量 hlen key # 获取哈希表中是否存在指定的字段 hexists key field hash类型数据扩展操作 # 获取哈希表中所有的字段名或字段值 hkeys key hvals key # 设置指定字段的数值数据增加指定范围的值 hincrby key field increment hincrbyfloat key field increment List 双链结构 # 从左存入 lpush list1 zs ls ww zl # 查询从start到end索引的数据 lrange list1 0 3 lrange list1 0 -1 # 从左移除一个 lpop list1 # 长度 llen list1 # 索引获取 lindex list1 1 list 扩展操作 # 先锋队指定数据 lrem key count value # 规定时间内获取并移除数据, 过了拿不以则返回null blpop key1 [key2] timeout brpop key1 [key2] timeout brpoplpush source destination timeout set # 添加数据 sadd key member1 [member2] # 获取全部数据 smembers key # 删除数据 srem key member1 [member2] # 获取集合数据数量 scard key # 判断集合中是否包含指定数据 sismember key member # 随机获取集合中指定数量的数据 srandmember key [count] # 随机获取集合中某个数据并将该数据移出集合 spop key [count] Set类型数据的扩展操作 # 求两个集合的交, 并, 差集 sinter key1 [key2 ...] sunion key1 [key2 ...] sdiff key1 [key2 ...] # 求两个集合的交,并,差集并存储到指定集合中 sinterstore destination key1 [key2 ...] sunionstore destination key1 [key2 ...] sdiffstore destination key1 [key2 ...] # 将指定数据从原始集合中移动到目标集合中 smove source destination member key 基本操作 # 删除指定key del key # 获取key是否存在 exists key # 获取key的类型 type key # 排序 sort # 改名 rename key newkey renamenx key newkey # 为指定key设置有效期 expire key seconds pexpire key milliseconds expireat key timestamp pexpireat key milliseconds-timestamp # 获取key的有效时间 ttl key pttl key # 切换key从时效性黑的为永久性 persist key # 查询scan, keys会阻塞不再推荐 SCAN cursor [MATCH pattern] [COUNT count] scan 0 MATCH list* COUNT 5 keys pattern # MATCH模式规则 # * 匹配什么问题数量的什么任意符号 ? 配合一个任意符号 []匹配一个指定符号 * 查询所有 hh* 查询所有以hh开头 *hh 查询所有以hh结尾 ??hh 查询所有前面两个字符什么任意, 后面以hh结尾 user:? 查询所有以user:开头,最后一个字符任意 u[st]er:1 查询以u开头,以er:1结尾,中间饮食一个字母,s或t db 基本操作 # 切换数据库 select index # 其他操作, 测试连通 ping # 清空当前库 flushdb # 清空所有库 flushall # 选择库 select # 移动 move # 查询库内存储个数 dbsize Jedis package util; import redis.clients.jedis.HostAndPort; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; import java.util.ResourceBundle; public class JedisUtils { private static int maxTotal; private static int maxIdle; private static String HOST; private static int PORT; private static JedisPoolConfig jedisPoolConfig; private static JedisPool jedisPool; static { ResourceBundle bundle = ResourceBundle.getBundle("redis"); maxTotal = Integer.parseInt( bundle.getString("redis.maxTotal")); maxIdle = Integer.parseInt( bundle.getString("redis.maxIdel")); HOST = bundle.getString("redis.host"); PORT = Integer.parseInt( bundle.getString("redis.port")); jedisPoolConfig = new JedisPoolConfig(); jedisPoolConfig.setMaxTotal(maxTotal); jedisPoolConfig.setMaxIdle(maxIdle); jedisPool = new JedisPool(jedisPoolConfig,HOST,PORT); } public static Jedis getJedis(){ return jedisPool.getResource(); } } import redis.clients.jedis.Jedis; import util.JedisUtils; import java.util.List; public class Test { public static void main(String[] args) { Jedis jedis = JedisUtils.getJedis(); jedis.auth("password"); jedis.set("str2","Mark"); jedis.sadd("set1","a","B","CC"); long longst1 = jedis.scard("set1"); System.out.println(longst1); jedis.lpush("list1","ab","bc","cd","aa"); List<String> list1 = jedis.lrange("list1", 0, -1); System.out.println(list1.toString()); String str1 = jedis.get("str1"); System.out.println(str1); jedis.close(); } } redis.properties redis.maxTotal=50 redis.maxIdel=10 redis.host=127.0.0.1 redis.port=6379 ``` RDB bgsave 启动子进程进行保存, 优于save的阻塞保存方式 sava 2 10, 10秒内2次数据变化保存, sava配置在后台执行的bgsave操作 会对数据产生影响 真正产生了影响, delete不算 不进行数据比对, set s1 2, set s1 3算2次 AOF 记录操作内容 appendonly yes appendfilename "appendonly.aof" appenddirname "appendonlydir" appendfsync everysec

May 10, 2022&nbsp;·&nbsp;4 分钟&nbsp;·&nbsp;Lizicai

Vue和Element二 Li.072

Vue的自定义组件 自宣言组件: 本质上, 组件是带有一个名称且可复用的Vue实例 Vue.component(组件名称,{ props:组件的属性, data:组件的数据函数, template:组件解析的标签模板 } ) <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>自定义组件</title> <script src="../js2/vue.js"></script> </head> <body> <div id="div"> <my-button>我的按钮</my-button> </div> </body> <script> Vue.component("my-button",{ // 属性 props:["style"] , // 数据函数 data: function (){ return{ msg:"我的按钮" } }, // 解析标签模板 template:"<button style='color:red'>{{msg}}</button>" }); new Vue({ el:"#div" }) </script> </html> Vue的生命周期 生命周期的八个阶段 状态 阶段周期 beforeCreate 创建前 created 创建后 beforeMount 载入前 mounted 载入后 beforeUpdate 更新前 updated 更新后 beforeDestroy 销毁前 destroyed 销毁后 Vue 异步操作 在Vue中发送异步请求, 本质上还是AJAX. 我们可以使用axios这个插件来简化操作 使用步骤 引入axios核心js文件 调用axios对象的方法来发起异步请求 调用axios对象的方法来处理响应的数据 axios常用方法 方法名 作用 get(请求的资源路径与请求的参数) 发起GET方式请求 post(请求的资源路径,请求的参数) 发起POST方式请求 then(reponse) 请求成功后的回调函数,通过resposnse获取响应的数据 catch(error) 请求失败后的回调函数,通过error获取错误信息 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>异步操作</title> <script src="js/vue.js"></script> <script src="https://unpkg.com/axios/dist/axios.min.js"></script> </head> <body> <div id="div"> {{name}} <button @click="send()">发起请求</button> </div> </body> <script> new Vue({ el:"#div", data:{ name:"张三" }, methods:{ send(){ // // Get方式请求 // axios.get("testServlet?name="+this.name) // .then(resp => { // alert(resp.data); // }) // .catch(error =>{ // alert(error) // }) axios.post("testServlet","name="+this.name) .then( resp =>{ alert(resp.data); }) .catch( error =>{ alert(error) }) } } }) </script> </html>

February 14, 2022&nbsp;·&nbsp;1 分钟&nbsp;·&nbsp;Lizicai

Vue和Element一 Li.071

Vue 简介 Vue 是一套构建用户界面的渐进式前端框架。 只关注视图层,并且非常容易学习,还可以很方便的与其它库或已有项目整合。 通过尽可能简单的 API来实现响应数据的绑定和组合的视图组件。 特点 易用:在有HTML CSS JavaScript 的基础上,快速上手。 灵活:简单小巧的核心,渐进式技术栈,足以应付任何规模的应用。 性能:20kb min+gzip运行大小、超快虛拟DOM、最省心的优化。 Vue 入门 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>快速入门</title> </head> <body> <div id="div"> {{msg}} </div> </body> <script src="js/vue.js"></script> <script> // 脚本 new Vue({ el:"#div", data:{ msg:"Hello Vue" } }) </script> </html> Vue 核心对象: 每一个Vue程序都是从一个Vue核心对象开始的 let vm = new Vue({ 选项列表; }) Vue的程序包含视图和脚本两个核心部分 选项列表 el选项: 用于接收获取到页面中的元素.(根据常用选择器获取) data选项: 用于保存当前Vue对象中的数据. 在视图中声明的变量需要在此处赋值 methods选项: 用于定义方法. 方法可以直接通过对象名调用, this代表当前Vue对象 数据绑定 在视图部分获取脚本部分的数据 {{变量名}} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>快速入门升级</title> </head> <body> <!-- 视图--> <div id="div"> <div>姓名:{{name}}</div> <div>班级:{{classRoom}}</div> <button onclick="hi()">打招呼</button> <button onclick="update()">修改班级</button> </div> </body> <script src="js/vue.js"></script> <script> // 脚本 let vm = new Vue({ el:"#div", data:{ name:"张三", classRoom:"不一班" }, methods:{ study(){ alert(this.name + "正在" + this.classRoom+"好好学习") } } }) // 定义打招呼的方法 function hi(){ vm.study(); } function update(){ vm.classRoom = "地球人" } </script> </html> Vue 常用指令 指令: 是带有v-前缀的我死属性, 不同指令具有不同含义. 例如v-html, v-if, v-for 使用指令时,通常编与在标签的属性上,值可以使用JS的表达式。 常用指令 指令 作用 v-html 把文本解析为HTML代码 v-bind 为HTML标签绑定属性值 v-if 条件性的渲染某元素,判定为true时渲染,否则不渲染 v-else 条件性的渲染某元素,判定为true时渲染,否则不渲染 v-else-if 条件性的渲染某元素,判定为true时渲染,否则不渲染 v-show 根据条件展示某元素, 区别在于切换的是display属性的值 y-for 列表渲染, 遍历容器的元素或者对象的厲性 v-on 为HTML标签绑定事件 v-model 在表单元素上创建双向数据绑定 文本插值 v-html: 把文本解析为HTML代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>文本插值</title> </head> <body> <div id="div"> <div>{{msg}}</div> <div v-html="msg"></div> </div> </body> <script src="../js/vue.js"></script> <script> let vm = new Vue({ el:"#div", data:{ msg:"<b>Hello Vue</b>" } }) </script> </html> 绑定属性 v-bind:为HTML标签绑定属性值 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>绑定属性</title> <style> .my{ border: 1px solid red; } </style> </head> <body> <div id="div"> <a v-bind:href="url">百度一下</a> <br> <a :href="url">百度一下</a> <br> <div :class="cls">我是div</div> </div> </body> <script src="../js/vue.js"></script> <script> new Vue({ el:"#div", data:{ url:"http://www.baidu.com", cls: "my" } }) </script> </html> 条件渲染 v-if: 条件性的渲染某元素, 判定为真时渲染,否则不渲染 v-else:条件性的渲染 v-else-if:条件性的渲染 v-show:根据条件展示某元素,区别在于切换的是display属性的值 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>条件渲染</title> </head> <body> <div id="div"> <!-- 判断num的值, 对3取余, 余数为0显示div1 余数为1显示div2 余数为2显示div3--> <div v-if="num % 3 == 0">div1</div> <div v-else-if="num % 3 == 1">div2</div> <div v-else>div3</div> <div v-show="flag">div4</div> </div> </body> <script src="../js/vue.js"></script> <script> new Vue({ el:"#div", data:{ num:2, flag:false } }) </script> </html> 列表渲染 v-for:列表渲染,遍历窗口的元素或者对象的属性 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>列表渲染</title> </head> <body> <div id="div"> <ul> <li v-for="name in names"> {{name}} </li> <li v-for="value in student"> {{value}} </li> </ul> </div> </body> <script src="../js/vue.js"></script> <script> new Vue({ el: "#div", data:{ names:["张三","李四","王五"], student:{ name:"张三", age:23 } } }) </script> </html> 事件绑定 v-on: 为HTML标签绑定事件 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>事件绑定</title> </head> <body> <div id="div"> <div>{{name}}</div> <button v-on:click="change">改变div的内容</button> <button v-on:dblclick="change">改变div的内容</button> <button @click="change">改变div的内容</button> </div> </body> <script src="../js/vue.js"></script> <script> new Vue({ el:"#div", data:{ name:"来了呀, 老弟!" }, methods:{ change(){ this.name = "来了" } } }) </script> </html> 表单绑定, 只能表单使用 v-model:在表单元素上创建双向数据绑定 双向数据绑定 更新data数据, 页面中的数据也会更新 更新页面数据, data数据也会更新 MVVM模型(Model View ViewModel):是MVC模式的改进版 在前端页面中,JS对象表示 Model,页面表示View,两者做到了最大限度的分离。 将Model和View 关联起来的就是ViewModel,它是桥梁。 ViewModel 负责把 Model 的数据同步到 View 显示出来,还负责把 View 修改的数据同步回 Model. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>表单绑定</title> </head> <body> <div id="div"> <form autocomplete="off"> 姓名: <input type="text" name="username" v-model="username"> <br> 年龄: <input type="number" name="age" v-model="age"> </form> </div> </body> <script src="../js/vue.js"></script> <script> new Vue({ el:"#div", data:{ username:"张三", age:23 } }) </script> </html> Element 组件库 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>快速入门</title> <link rel="stylesheet" href="../element-ui/lib/theme-chalk/index.css"> <script src="../js2/vue.js"></script> <script src="../element-ui/lib/index.js"></script> </head> <body> <button>我是按钮</button> <br> <div id="div"> <template> <el-row class="mb-4"> <el-button>Default</el-button> <el-button type="primary">Primary</el-button> <el-button type="success">Success</el-button> <el-button type="info">Info</el-button> <el-button type="warning">Warning</el-button> <el-button type="danger">Danger</el-button> <el-button>中文</el-button> </el-row> <br> </template> </div> </body> <script> new Vue({ el:"#div" }) </script> </html> <html lang="en"> <head> <meta charset="UTF-8"> <title>基础布局</title> <link rel="stylesheet" href="../element-ui/lib/theme-chalk/index.css"> <script src="../js2/vue.js"></script> <script src="../element-ui/lib/index.js"></script> <style> .bg-purple-dark { background: #99a9bf; } .bg-purple { background: #d3dce6; } .bg-purple-light { background: #e5e9f2; } .grid-content { border-radius: 4px; min-height: 36px; } </style> </head> <body> <div id="div"> <template> <el-row> <el-col :span="24"><div class="grid-content bg-purple-dark"></div></el-col> </el-row> <el-row> <el-col :span="12"><div class="grid-content bg-purple"></div></el-col> <el-col :span="12"><div class="grid-content bg-purple-light"></div></el-col> </el-row> <el-row> <el-col :span="8"><div class="grid-content bg-purple"></div></el-col> <el-col :span="8"><div class="grid-content bg-purple-light"></div></el-col> <el-col :span="8"><div class="grid-content bg-purple"></div></el-col> </el-row> </template> </div> </body> <script> new Vue({ el:"#div" }) </script> </html> 布局方式 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>容器布局</title> <link rel="stylesheet" href="../element-ui/lib/theme-chalk/index.css"> <script src="../js2/vue.js"></script> <script src="../element-ui/lib/index.js"></script> <style> .el-header, .el-footer { background-color: #B3C0D1; color: #333; text-align: center; line-height: 60px; } .el-aside { background-color: #D3DCE6; color: #333; text-align: center; line-height: 300px; } .el-main { background-color: #E9EEF3; color: #333; text-align: center; line-height: 600px; } </style> </head> <body> <div id="div"> <el-container> <el-header>Header</el-header> <el-container> <el-aside width="300px">Aside</el-aside> <el-container> <el-main>Main</el-main> <el-footer>Footer</el-footer> </el-container> </el-container> </el-container> </div> </body> <script> new Vue({ el:"#div" }) </script> </html> 表单组件 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>容器布局</title> <link rel="stylesheet" href="../element-ui/lib/theme-chalk/index.css"> <script src="../js2/vue.js"></script> <script src="../element-ui/lib/index.js"></script> <style> </style> </head> <body> <div id="div"> <el-form ref="form" :model="form" label-width="80px"> <el-form-item label="活动名称"> <el-input v-model="form.name"></el-input> </el-form-item> <el-form-item label="活动区域"> <el-select v-model="form.region" placeholder="请选择活动区域"> <el-option label="区域一" value="shanghai"></el-option> <el-option label="区域二" value="beijing"></el-option> </el-select> </el-form-item> <el-form-item label="活动时间"> <el-col :span="11"> <el-date-picker type="date" placeholder="选择日期" v-model="form.date1" style="width: 100%;"></el-date-picker> </el-col> <el-col class="line" :span="2">-</el-col> <el-col :span="11"> <el-time-picker placeholder="选择时间" v-model="form.date2" style="width: 100%;"></el-time-picker> </el-col> </el-form-item> <el-form-item label="即时配送"> <el-switch v-model="form.delivery"></el-switch> </el-form-item> <el-form-item label="活动性质"> <el-checkbox-group v-model="form.type"> <el-checkbox label="美食/餐厅线上活动" name="type"></el-checkbox> <el-checkbox label="地推活动" name="type"></el-checkbox> <el-checkbox label="线下主题活动" name="type"></el-checkbox> <el-checkbox label="单纯品牌曝光" name="type"></el-checkbox> </el-checkbox-group> </el-form-item> <el-form-item label="特殊资源"> <el-radio-group v-model="form.resource"> <el-radio label="线上品牌商赞助"></el-radio> <el-radio label="线下场地免费"></el-radio> </el-radio-group> </el-form-item> <el-form-item label="活动形式"> <el-input type="textarea" v-model="form.desc"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="onSubmit">立即创建</el-button> <el-button>取消</el-button> </el-form-item> </el-form> </div> </body> <script> new Vue({ el:"#div", data() { return { form: { name: '', region: '', date1: '', date2: '', delivery: false, type: [], resource: '', desc: '' } } }, methods: { onSubmit() { console.log('submit!'); } } }) </script> </html> 表格组件 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>表格组件</title> <link rel="stylesheet" href="../element-ui/lib/theme-chalk/index.css"> <script src="../js2/vue.js"></script> <script src="../element-ui/lib/index.js"></script> </head> <body> <div id="div"> <template> <el-table :data="tableData" stripe style="width: 100%"> <el-table-column prop="date" label="日期" width="180"> </el-table-column> <el-table-column prop="name" label="姓名" width="180"> </el-table-column> <el-table-column prop="address" label="地址"> </el-table-column> <el-table-column label="操作" width="100"> <el-button size="mini" type="warning">编辑</el-button> <el-button size="mini" type="danger">编辑</el-button> </el-table-column> </el-table> </template> </div> </body> <script> new Vue({ el:"#div", data() { return { tableData: [{ date: '2016-05-02', name: '王小虎', address: '上海市普陀区金沙江路 1518 弄' }, { date: '2016-05-04', name: '王小虎', address: '上海市普陀区金沙江路 1517 弄' }, { date: '2016-05-01', name: '王小虎', address: '上海市普陀区金沙江路 1519 弄' }, { date: '2016-05-03', name: '王小虎', address: '上海市普陀区金沙江路 1516 弄' }] } } }) </script> </html> 顶部导航栏组件 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>顶部导航栏组件</title> <link rel="stylesheet" href="../element-ui/lib/theme-chalk/index.css"> <script src="../js2/vue.js"></script> <script src="../element-ui/lib/index.js"></script> </head> <body> <div id="div"> <el-menu :default-active="activeIndex" class="el-menu-demo" mode="horizontal" @select="handleSelect"> <el-menu-item index="1">处理中心</el-menu-item> <el-submenu index="2"> <template slot="title">我的工作台</template> <el-menu-item index="2-1">选项1</el-menu-item> <el-menu-item index="2-2">选项2</el-menu-item> <el-menu-item index="2-3">选项3</el-menu-item> <el-submenu index="2-4"> <template slot="title">选项4</template> <el-menu-item index="2-4-1">选项1</el-menu-item> <el-menu-item index="2-4-2">选项2</el-menu-item> <el-menu-item index="2-4-3">选项3</el-menu-item> </el-submenu> </el-submenu> <el-menu-item index="3" disabled>消息中心</el-menu-item> <el-menu-item index="4"><a href="https://www.ele.me" target="_blank">订单管理</a></el-menu-item> </el-menu> <div class="line"></div> <el-menu :default-active="activeIndex2" class="el-menu-demo" mode="horizontal" @select="handleSelect" background-color="#545c64" text-color="#fff" active-text-color="#ffd04b"> <el-menu-item index="1">处理中心</el-menu-item> <el-submenu index="2"> <template slot="title">我的工作台</template> <el-menu-item index="2-1">选项1</el-menu-item> <el-menu-item index="2-2">选项2</el-menu-item> <el-menu-item index="2-3">选项3</el-menu-item> <el-submenu index="2-4"> <template slot="title">选项4</template> <el-menu-item index="2-4-1">选项1</el-menu-item> <el-menu-item index="2-4-2">选项2</el-menu-item> <el-menu-item index="2-4-3">选项3</el-menu-item> </el-submenu> </el-submenu> <el-menu-item index="3" disabled>消息中心</el-menu-item> <el-menu-item index="4"><a href="https://www.ele.me" target="_blank">订单管理</a></el-menu-item> </el-menu> </div> </body> <script> new Vue({ el:"#div", data() { return { activeIndex: '1', activeIndex2: '1' }; }, methods: { handleSelect(key, keyPath) { console.log(key, keyPath); } } }) </script> </html> 侧边导航栏 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>侧边导航栏</title> <link rel="stylesheet" href="../element-ui/lib/theme-chalk/index.css"> <script src="../js2/vue.js"></script> <script src="../element-ui/lib/index.js"></script> </head> <body> <div id="div"> <el-row class="tac"> <el-col :span="3"> <h5>自定义颜色</h5> <el-menu default-active="2" class="el-menu-vertical-demo" @open="handleOpen" @close="handleClose" background-color="#545c64" text-color="#fff" active-text-color="#ffd04b"> <el-submenu index="1"> <template slot="title"> <i class="el-icon-location"></i> <span>导航一</span> </template> <el-menu-item-group> <template slot="title">分组一</template> <el-menu-item index="1-1">选项1</el-menu-item> <el-menu-item index="1-2">选项2</el-menu-item> </el-menu-item-group> <el-menu-item-group title="分组2"> <el-menu-item index="1-3">选项3</el-menu-item> </el-menu-item-group> <el-submenu index="1-4"> <template slot="title">选项4</template> <el-menu-item index="1-4-1">选项1</el-menu-item> </el-submenu> </el-submenu> <el-menu-item index="2"> <i class="el-icon-menu"></i> <span slot="title">导航二</span> </el-menu-item> <el-menu-item index="3" disabled> <i class="el-icon-document"></i> <span slot="title">导航三</span> </el-menu-item> <el-menu-item index="4"> <i class="el-icon-setting"></i> <span slot="title">导航四</span> </el-menu-item> </el-menu> </el-col> </el-row> </div> </body> <script> new Vue({ el:"#div", methods: { handleOpen(key, keyPath) { console.log(key, keyPath); }, handleClose(key, keyPath) { console.log(key, keyPath); } } }) </script> </html>

December 30, 2021&nbsp;·&nbsp;6 分钟&nbsp;·&nbsp;Lizicai

AJAX Li.070

AJAX 介绍 AJAX(Asynchronous JavaScript And XML): 异步的JavaScript和XML 本身不是新技术, 而是多个技术的综合. 用于快速创建动态网页的技术. 一般的负面如果需要更新内容, 必需重新加载整个页面 而AJAX通过浏览器与服务器进行少量数据交换, 不可以使网页异步更新. 不重新加载整个页面, 对网页部分内容局部更新 原生JavaScript 实现AJAX 核心对象:xMLHttpRequest 用于在后台与服务器交换数据。可以在不重新加载整个网页的情况下,对网页的某部分进行更新。 打开链接:open(method,url,async) method :请求的类型 GET 或 POST. url:请求资源的路径, async:true(异步) 或false(同步)。 发送请求:send(String params) params:请求的参数(POST 专用)。 处理响应:onreadystatechange readyState :0-请求末初始化,1-服务器连接已建立,2-请求已接收 ,3-请求处理中,4-请求已完成,且响应已就绪。 status:200-响应已全部OK。 获得响应数据形式 response Text :获得字符串形式的响应数据。 responseXML:获得XML形式的响应 jQuery的Get方式实现AJAX 核心语法:$.get(url,[data],[callback],[type]); url:请求的资源路径 data:发送给服务器端的请求参数,格式可以是key=value,也可以是js对象 callback :当请求成功后的回调函数,可以在函数中编写我们的逻辑代码 type : 预期的返回数据的类型, 取值可以是xml, html, js, ison, text等 @WebServlet("/userServlet") public class UserServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("UTF-8"); resp.setContentType("text/html;charset=UTF-8"); // 1. 获取请求参数 String username = req.getParameter("username"); // 2. 判断姓名是否注册 if("zhangsan".equals(username)){ resp.getWriter().write(("<font color='red'>用户名已注册</font>")); }else{ resp.getWriter().write(("<font color='green'>用户名可用</font>")); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } } <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>用户注册</title> </head> <body> <form autocomplete="off" > 姓名: <input type="text" id="username"> <span id="uSpan"></span> <br> 密码: <input type="password" id="password"> <br> <input type="submit" value="注册"> </form> </body> <script src="js/jquery-3.6.0.min.js"></script> <script> // 1. 为姓名绑定推动焦点事件 $("#username").blur(function(){ let username = $("#username").val(); // 2. jQuery的get方式实现AJAX $.get( "userServlet", "username="+username, // 3. 回调函数 function(data){ // 将响应的数据显示到span标签 $("#uSpan").html(data) }, "text" ); }) </script> </html> jQuery的POST方式实现AJAX 核心语法:$.post(url,[data],[callback],[type]) url:请求的资源路径 data:发送给服务器端的请求参数,格式可以是key=value,也可以是js对象 callback :当请求成功后的回调函数,可以在函数中编写我们的逻辑代码 type : 预期的返回数据的类型, 取值可以是xml, html, js, ison, text等 <script src="js/jquery-3.6.0.min.js"></script> <script> // 1. 为姓名绑定推动焦点事件 $("#username").blur(function(){ let username = $("#username").val(); // 2. jQuery的POST方式实现AJAX $.post( "userServlet", "username="+username, // 3. 回调函数 function(data){ // 将响应的数据显示到span标签 $("#uSpan").html(data) }, "text" ); }) </script> jQuery的通用方式实现AJAX 核心语法: $.ajax({name:value,name:value,…}); url :请求的资源路径. async :是否异步请求,true-是,false-否(默认是true)。 data:发送到服务器的数据,可以是键值对形式,也可以是js对象形式。 type:请求方式,POST或GET (默认是GET)。 dataType:预期的返回数据的券型,取值可以是xml,html,js, json, text等。 success :请求成功时调用的回调函数。 error :请求失败时调用的回调函数。 <script src="js/jquery-3.6.0.min.js"></script> <script> // 1. 为姓名绑定推动焦点事件 $("#username").blur(function(){ let username = $("#username").val(); $.ajax({ url: "userServlet", async: true, data: "username=" + username, type: "GET", success: function (data) { $("#uSpan").html(data) }, dataType: "text", error: function () { $("#uSpan").html("<font color='red'>出错了, 请稍后重试</font>") } }); }) </script> JSON 格式 类型 语法 说明 对象类型 {name:value,name:value,…} name是字符串类型, value可以是任意类型 数组/集合类型 [{name:value,…},{name:value,…}] name是字符串类型, value可以是任意类型 混合类型 {name: [{name:value,…},{name:value,…}] } name是字符串类型, value可以是任意类型 常用方法 成员方法 说明 stringify(对象) 将指定对象转换为json格式字符串 parse(字符串) 将指定json格式字符串解析成对象 JSON Java 转换工具 jackson 类名 说明 ObjectMapper Jackson工具包的核心类,它提供一些方法来实现JSON字符串和对象之间的转换 TypeReference 对集合泛型的反序列化,使用TypeReference可以明确的指定反序列化的对象类型 ObjectMappper 常用方法 方法名 说明 String.writeValueAsString(Object.obj) 将Java对象转换成JSON字符串 <T>T.readValue(String.json,Class<T>.valueType) 将JSON字符串转换成Java对象 <T>T.readValue(String.json,TypeReference.valueTypeRef) 将JSON字符串转换成Java对象 public class User { private String name; private Integer age; public User(){} public User(String name, Integer age) { this.name = name; this.age = age; } } package com.example.ajax2; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Test; import com.example.ajax2.User; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class ObjectMapperTest { private ObjectMapper mapper = new ObjectMapper(); // 1. User对象转换json, json转User对象 @Test public void test01() throws JsonProcessingException { User user1 = new User("张三", 23); String json = mapper.writeValueAsString(user1); System.out.println("json字符串"+json); User user2 = mapper.readValue(json, User.class); System.out.println("Java对象"+user2); } // 2.map<String,String>转json json转map<String,String> @Test public void test02() throws IOException { Map<String,String> map = new HashMap<>(); map.put("姓名","张三"); map.put("性别","男"); String json = mapper.writeValueAsString(map); System.out.println("json字符串"+json); HashMap map2 = mapper.readValue(json, HashMap.class); System.out.println("Map对象"+map2); } // 3. map<String,User>转json json转map<String,User> @Test public void test03() throws Exception{ Map<String, User> map1 = new HashMap<>(); map1.put("1", new User("张三",23)); map1.put("2", new User("李四",24)); String json = mapper.writeValueAsString(map1); System.out.println("json字符串"+json); HashMap map2 = mapper.readValue(json, new TypeReference<HashMap<String, User>>() {} ); System.out.println("Map对象"+map2); } // 4.List<String>转json, json转List<String> @Test public void test04() throws Exception{ ArrayList<String> list = new ArrayList<>(); list.add("张三"); list.add("李四"); String json = mapper.writeValueAsString(list); System.out.println("json字符串"+json); // ArrayList<String> list2 = mapper.readVal ue(json, new TypeReference<ArrayList<String>>() { }); ArrayList<String> list2 = mapper.readValue(json, ArrayList.class); System.out.println("List<string>集合"+list2); } // 5. List<User>转json, json转List<User> @Test public void test05() throws Exception { ArrayList<User> list1 = new ArrayList<>(); list1.add(new User("张三",23)); list1.add(new User("李四",24)); String json = mapper.writeValueAsString(list1); System.out.println("json字符串"+json); ArrayList<User> list2 = mapper.readValue(json, new TypeReference<ArrayList<User>>() { }); System.out.println("List对象"+list2); } } 搜索联想 package com.lizicai.bean; public class Student { private Integer id; private String name; private Integer age; private Integer score; public Student(){} public Student(Integer id, String name, Integer age, Integer score) { this.id = id; this.name = name; this.age = age; this.score = score; } } <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>搜索</title> </head> <body> <form autocomplete="off" > 姓名: <input type="text" id="username" list="userlist" placeholder="输入名称搜索"> <datalist id="userlist"> </datalist> </form> </body> <script src="js/jquery-3.6.0.min.js"></script> <script> // 1. 为用户名输入框绑定鼠标点击事件 $("#username").mousedown(function(){ // 2. 获取用户名是否为空 let username = $("#username").val(); if( username == null || username == ""){ return; }else{ $.ajax({ url: "userServlet", async: true, data: {"username":username}, type: "POST", success: function (data) { let names = ""; console.log(data) for(let i=0;i<data.length;i++){ names +="<option>"+data[i].name+"</option>"; console.log(data[i]) } $("#userlist").html(names) }, dataType: "json" }); } }) </script> </html> package com.lizicai.sql; import org.apache.ibatis.jdbc.SQL; public class ReturnSql { public String getSelectLikeName(){ return new SQL(){ { SELECT("*"); FROM("student"); WHERE("name like CONCAT('%',#{name},'%')"); ORDER_BY("score DESC"); LIMIT("0,4"); } }.toString(); } } package com.lizicai.mapper; import com.lizicai.bean.Student; import com.lizicai.sql.ReturnSql; import org.apache.ibatis.annotations.*; import java.util.List; public interface StudentMapper { @SelectProvider(type = ReturnSql.class, method = "getSelectAll") public abstract List<Student> selectAll(); @SelectProvider(type = ReturnSql.class, method = "getSelectLikeName") public abstract List<Student> selectLikeName(String name); } package com.lizicai.service; import com.lizicai.bean.Student; import com.lizicai.mapper.StudentMapper; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Test; import java.io.IOException; import java.io.InputStream; import java.util.List; public class Test001 { @Test public List<Student> selectLikeName(String name) throws IOException { InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is); SqlSession sqlSession = sqlSessionFactory.openSession(true); StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); List<Student> students = mapper.selectLikeName(name); for (Student stu : students) { System.out.println(stu); } sqlSession.close(); is.close(); return students; } } package com.lizicai.controller; import com.fasterxml.jackson.databind.ObjectMapper; import com.lizicai.bean.Student; import com.lizicai.service.Test001; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.util.List; @WebServlet("/userServlet") public class UserServlet extends HttpServlet { @Override public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("UTF-8"); String username = req.getParameter("username"); ObjectMapper mapper = new ObjectMapper(); Test001 t = new Test001(); List<Student> list = t.selectLikeName(username); String json = mapper.writeValueAsString(list); resp.setContentType("application/json; charset=utf-8"); PrintWriter pw = resp.getWriter(); pw.write(json); pw.close(); } } 瀑布流分页 create database db11; use db11; CREATE TABLE news( id INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(999) ); DELIMITER $$ CREATE PROCEDURE create_date() BEGIN DECLARE i INT; SET i=1; WHILE i<=100 do INSERT INTO news VALUES (NULL,CONCAT('今天吃瓜啦,瓜',i)); SET i=i+1; end WHILE; end $$ CALL create_date(); 如何确定当前显示的数据已经浏览完毕 公式: 滚动条距询问的距离+滚去条上下滚动的距离+当前窗口的高度>=100 当前文档高度: 存储10条数据,100px 滚去条距询问的距离: 1px 当前窗口的高度: 80px 滚去条上下滚去的距离: >=19px 前置知识 功能 说明 $(function(){}) 页面加载事件 $(window) 获取当前窗口对象 scroll() 鼠标滚去事件 $(window).height() 当前窗口的高度 $(window).scrollTop() 滚去条上下滚去的距离 $(document).height() 当前文档的高度 package com.lizicai.controller; import com.fasterxml.jackson.databind.ObjectMapper; import com.github.pagehelper.Page; import com.lizicai.bean.News; import com.lizicai.service.NewsService; import com.lizicai.service.impl.NewsServiceImpl; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.util.List; @WebServlet("/newsList") public class NewsServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("UTF-8"); String pageNum = req.getParameter("pageNum"); String pageSize = req.getParameter("pageSize"); System.out.println(pageNum+" "+pageSize+"----"); Integer intPageNum = Integer.parseInt(pageNum) ; Integer intPageSize = Integer.parseInt(pageSize) ; ObjectMapper mapper = new ObjectMapper(); NewsService newsService = new NewsServiceImpl(); Page<News> page = newsService.pageQuery(intPageNum,intPageSize); String json = mapper.writeValueAsString(page); resp.setContentType("application/json; charset=utf-8"); PrintWriter pw = resp.getWriter(); pw.write(json); pw.close(); } } package com.lizicai.controller; import com.fasterxml.jackson.databind.ObjectMapper; import com.github.pagehelper.Page; import com.github.pagehelper.PageInfo; import com.lizicai.bean.News; import com.lizicai.service.NewsService; import com.lizicai.service.impl.NewsServiceImpl; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.util.List; @WebServlet("/newsList2") public class NewsServlet2 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("UTF-8"); String pageNum = req.getParameter("pageNum"); String pageSize = req.getParameter("pageSize"); System.out.println(pageNum+" "+pageSize+"----"); Integer intPageNum = Integer.parseInt(pageNum) ; Integer intPageSize = Integer.parseInt(pageSize) ; ObjectMapper mapper = new ObjectMapper(); NewsService newsService = new NewsServiceImpl(); Page page = newsService.pageQuery(intPageNum,intPageSize); PageInfo<List<News>> pageInfo = new PageInfo<>(page); String json = mapper.writeValueAsString(pageInfo); resp.setContentType("application/json; charset=utf-8"); PrintWriter pw = resp.getWriter(); pw.write(json); pw.close(); } } <script> //1.定义发送请求标记 let send = true; //2.定义当前页码和每页显示的条数 let pageNum = 1; let pageSize = 10; //3.定义滚动条距底部的距离 let bottom = 1 //4.设置页面加载事件 $(function (){ //5.为当前窗口绑定滚动条滚动事件 $(window).scroll(function (){ //6.获取必要信息,用于计算当前展示数据是否浏览完毕 //当前窗口的高度 let windowHeight = $(window).height() ; //当前滚动条从上往下滚动的距离 let scrollTop = $(window).scrollTop(); //当前文档的高度 let docHeight = $(document).height() ; //7.计算当前展示数据什么时候浏览完毕 //当 滚动条距底部的距离 + 当前滚动条滚动的距离 + 当前窗口的高度 >= 当前文档的高度 if((bottom + scrollTop + windowHeight) >= docHeight) { //8.判断请求标记是否为true if(send == true){ // 如果当前页大于10,则将加载动图隐藏并结束方法 //9.将请求标记置为false,当前异步操作完成前,不能重新发起请求 send = false; //10.根据当前页和每页显示的条数来 请求查询分页数据 queryByPage(pageNum, pageSize); //11.当前页码+1 pageNum++; } } }); }) //请求查询分页数据的函数 function queryByPage(pageNum, pageSize){ //将加载动图显示 $(".loading").show(); //发起AJAX异步请求 $.ajax({ url:"newsList", data:{"pageNum":pageNum,"pageSize":pageSize}, type:"POST", dataType:"json", success:function (data){ if(data.length == 0){ // 加载动图隐藏 $(".loading").hide(); $("#no").html("我也是有底线的") return; } // 将数据进行显示 let titles = ""; for(let i=0;i<data.length;i++){ titles += "<li>\n" + " <div class=\"title-box\">\n" + " <a href=\"#\" class=\"link\">\n" + data[i].title+ " <hr>\n" + " </a>\n" + " </div>\n" + " </li>"; } //追加到页面 $(".news_list").append(titles); //将请求标记置为true send = true; } }) } </script> <script> // 1. 定义当前页码和每页显示的条数 let pageNum = 1; let pageSize = 10; // 2. 调用查询数据的方法 queryByPage(pageNum, pageSize) // 3. 定义请求查询分布数据的函数, 发起AJAX异步请求, 将数据显示到页面 function queryByPage(pageNum, pageSize){ $.ajax({ url:"newsList2", data:{"pageNum":pageNum,"pageSize":pageSize}, type:"POST", dataType:"json", success:function (pageInfo){ let titles = ""; for( let i=0;i<pageInfo.list.length;i++){ titles += "<li>\n" + " <div class=\"title-box\">\n" + " <a href=\"#\" class=\"link\">\n" + pageInfo.list[i].title+ " <hr>\n" + " </a>\n" + " </div>\n" + " </li>"; } // 将数据显示到页面上 $(".news_list").html(titles); // 4. 为分布按钮区域设置页数参数(总页数和当前页) $("#light-pagination").pagination({ pages:pageInfo.pages, currentPage: pageInfo.pageNum }); // 5. 为分布按钮绑定单击事件, 完成上一页下一页 $(".page-link").click(function(){ // 获取点击按钮的文本内容 let page = $(this).html() console.log(page) // 如果点击的是Prev, 调用查询方法, 查询当前页的上一页数据 if( page == "Prev"){ queryByPage(pageInfo.pageNum-1, pageSize) } else if(page == "Next"){ queryByPage(pageInfo.pageNum+1, pageSize) } else{ queryByPage(page, pageSize) } }) } }) } </script>

December 10, 2021&nbsp;·&nbsp;7 分钟&nbsp;·&nbsp;Lizicai

jQuery二 Li.069

jQuery DOM 常用方法 方法 作用 html() 获取标签的文本 html(value) 设置标签的文本内容,解析标签 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>操作文本</title> </head> <body> <div id="div">我是div</div> <input type="button" id="btn1" value="获取div的文本"> <input type="button" id="btn2" value="获取div的文本"> </body> <script src="../jQuery/jquery-3.6.0.js"></script> <script> // html() 获取标签的文本 let div = $("div"); // html(value) 设置标签的文本内容,解析标签 let btn1 = $("#btn1") btn1.click(cc1) function cc1() { alert(div.html()) } let btn2 = $("#btn2") btn2.click(cc2) function cc2(){ div.html("<b>小明</b>") } </script> </html> jQuery 操作对象 方法 作用 $("元素") 创建指定元素 append(element) 添加成最后一个子元素,由添加者对象调用 appendTo(element) 添加成最后一个子元素,由被添加者对象调用 prepend(element) 添加成第一个子元素,由添加者对象调用 prependTo(element) 添加成第一个子元素,由被添加者对象调用 before(element) 添加到当前元素的前面,两者是兄弟关系,由添加者对象调用 after(element) 添加到当前元素的后面,两者之间是兄弟关系,由添加者对象调用 remove() 删除指定元素(自己移除自己) empty() 清空指定元素的所有子元素 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>操作对象</title> </head> <body> <div id="div"></div> <input type="button" id="btn1" value="添加一个span到div"> <br><br><br> <input type="button" id="btn2" value="将加油添加到城市列表最下方"><br/> <input type="button" id="btn3" value="将加油添加到城市列表最上方"><br/> <input type="button" id="btn4" value="将加油添加到上海下方"><br/> <input type="button" id="btn5" value="将加油添加到上海上方"><br/> <ul id="city"> <li id="bj">北京</li> <li id="sh">上海</li> <li id="gz">广州</li> <li id="sz">深圳</li> </ul> <br> <ul id="desc"> <li id="xg">新冠</li> <li id="xq">雄起</li> </ul> <input type="button" id="btn6" value="清除新冠"><br> <input type="button" id="btn7" value="描述列表删除"><br> <br> </body> <script src="../jQuery/jquery-3.6.0.js"></script> <script> let div = $("#div"); // $("元素") 创建指定元素 // append(element) 添加成最后一个子元素,由添加者对象调用 // 添加一个span到div let btn1 = $("#btn1"); btn1.click(cc1) function cc1(){ let span = $("<span>span</span>") div.append(span) } // appendTo(element) 添加成最后一个子元素,由被添加者对象调用 // 将加油添加到城市列表最下方 let city = $("#city") let btn2 = $("#btn2") btn2.click(cc2) function cc2(){ let jy = $("<li id=\"jy\">加油</li>") jy.appendTo(city) } // prepend(element) 添加成第一个子元素,由添加者对象调用 // 加油添加到城市列表最上方 let btn3 = $("#btn3") btn3.click(cc3) function cc3(){ let jy = $("<li id=\"jy\">加油</li>") city.prepend(jy) } // prependTo(element) 添加成第一个子元素,由被添加者对象调用 // before(element) 添加到当前元素的前面,两者是兄弟关系,由添加者对象调用 // 将加油添加到上海下方 let btn5 = $("#btn5") btn5.click(cc5) function cc5(){ let jy = $("<li id=\"jy\">加油</li>") let sh = $("#sh") sh.before(jy) } // after(element) 添加到当前元素的后面,两者之间是兄弟关系,由添加者对象调用 let btn4 = $("#btn4") btn4.click(cc4) function cc4(){ let jy = $("<li id=\"jy\">加油</li>") let sh = $("#sh") sh.after(jy) } // remove() 删除指定元素(自己移除自己) let btn6 = $("#btn6") btn6.click(cc5) function cc5(){ let xg = $("#xg") xg.remove() } // empty() 清空指定元素的所有子元素 let btn7 = $("#btn7") btn7.click(cc6) function cc6(){ let desc = $("#desc") desc.empty() } </script> </html> iQuery DOM 常用方法 方法 作用 css(name) 根据样式名称获取css样式 css(name,value) 设置CSS样式 addClass(value) 给指定的对象添加样式类名 removeClass(value) 给指定的对象删除样式类名 toggleClass(value) 如果没有样式类名,则添加,如果有,则删除 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>操作样式</title> <style> .cls1{ background: pink; height: 30px; } </style> </head> <body> <div style="border: 1px solid red;" id="div">我是div</div> <input type="button" id="btn1" value="获取div样式"><br/> <input type="button" id="btn2" value="设置div的背景色为蓝色"><br/> <input type="button" id="btn3" value="给div设置cls1样式"><br/> <input type="button" id="btn4" value="给div删除cls1样式"><br/> <input type="button" id="btn5" value="给div设置或删除cls1样式"><br/> </body> <script src="../jQuery/jquery-3.6.0.js"></script> <script> let div = $("#div") // css(name) 根据样式名称获取css样式 let btn1 = $("#btn1") btn1.click(get1) function get1(){ alert(div.css("border")) } // css(name,value) 设置CSS样式 // div背景色为蓝色 let btn2 = $("#btn2") btn2.click(get2) function get2(){ div.css("background","blue") } // addClass(value) 给指定的对象添加样式类名 let btn3 = $("#btn3") btn3.click(get3) function get3(){ div.addClass("cls1"); } // removeClass(value) 给指定的对象删除样式类名 let btn4 = $("#btn4") btn4.click(get4) function get4(){ div.removeClass("cls1"); } // toggleClass(value) 如果没有样式类名,则添加,如果有,则删除 let btn5 = $("#btn5") btn5.click(get5) function get5(){ div.toggleClass("cls1"); } </script> </html> jQuery DOM 操作属性 方法 作用 attr(name,[value]) 获得/设置属性的值 prop(name,[value]) 获得/设置属性的值(checked,selected) <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>操作属性</title> </head> <body> <input type="text" id="username"> <br> <input type="button" id="btn1" value="获取输入框的id属性"> <br/> <input type="button" id="btn2" value="给输入框设置value属性"> <br/> <input type="radio" name="gender" id="gender1">男 <input type="radio" name="gender" id="gender2">女 <br/> <input type="button" value="选中女" id="btn3"> <br/> <select> <option>---请选择---</option> <option id="bk">本科</option> <option id="zk">专科</option> </select> <br/> <input type="button" value="选中本科" id="btn4"> </body> <script src="../jQuery/jquery-3.6.0.js"></script> <script> // 获取输入框的id属性 let username = $("#username") let btn1 = $("#btn1") btn1.click(test1) function test1(){ alert(username.attr("id")) } // 给输入框设置value属性 let btn2 = $("#btn2") btn2.click(test2) function test2(){ username.attr("value","哈哈") } // 选中女 $("#btn3").click(function (){ $("#gender2").prop("checked",true) }) // 选中本科 let bk = $("#bk") let btn4 = $("#btn4") btn4.click(test4) function test4(){ bk.prop("selected",true) } </script> </html> 操作复选框 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>复选框</title> </head> <body> <table id="tab1" border="1" width="800" align="center"> <tr> <th style="text-align: left"> <input style="background:lightgreen" id="selectAll" type="button" value="全选"> <input style="background:lightgreen" id="selectNone" type="button" value="全不选"> <input style="background:lightgreen" id="reverse" type="button" value="反选"> </th> <th>分类ID</th> <th>分类名称</th> <th>分类描述</th> <th>操作</th> </tr> <tr> <td><input type="checkbox" class="item"></td> <td>1</td> <td>手机数码</td> <td>手机数码类商品</td> <td><a href="">修改</a>|<a href="">删除</a></td> </tr> <tr> <td><input type="checkbox" class="item"></td> <td>2</td> <td>电脑办公</td> <td>电脑办公类商品</td> <td><a href="">修改</a>|<a href="">删除</a></td> </tr> <tr> <td><input type="checkbox" class="item"></td> <td>3</td> <td>鞋靴箱包</td> <td>鞋靴箱包类商品</td> <td><a href="">修改</a>|<a href="">删除</a></td> </tr> <tr> <td><input type="checkbox" class="item"></td> <td>4</td> <td>家居饰品</td> <td>家居饰品类商品</td> <td><a href="">修改</a>|<a href="">删除</a></td> </tr> </table> </body> <script src="../jQuery/jquery-3.6.0.js"></script> <script> //全选 //1.为全选按钮添加单击事件 $("#selectAll").click(function(){ //2.获取所有的商品复选框元素,为其添加checked属性,属性值true $(".item").prop("checked",true); }); //全不选 //1.为全不选按钮添加单击事件 $("#selectNone").click(function(){ //2.获取所有的商品复选框元素,为其添加checked属性,属性值false $(".item").prop("checked",false); }); //反选 //1.为反选按钮添加单击事件 $("#reverse").click(function(){ //2.获取所有的商品复选框元素,为其添加checked属性,属性值是目前相反的状态 let items = $(".item"); items.each(function(){ $(this).prop("checked",!$(this).prop("checked")); }); }); </script> </html> 随机图片 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>随机图片</title> </head> <body> <!-- 小图 --> <div style="background-color:red;border: dotted; height: 50px; width: 50px"> <img src="img/01.jpg" id="small" style="width: 50px; height: 50px;"> </div> <!-- 大图 --> <div style="border: double ;width: 400px; height: 400px; position: absolute; left: 500px; top:10px"> <img src="" id="big" style="width: 400px; height: 400px; display:none;"> </div> <!-- 开始和结束按钮 --> <input id="startBtn" type="button" style="width: 150px;height: 150px; font-size: 20px" value="开始"> <input id="stopBtn" type="button" style="width: 150px;height: 150px; font-size: 20px" value="停止"> </body> <script src="js/jquery-3.3.1.min.js"></script> <script> //1.准备一个数组 let imgs = [ "img/01.jpg", "img/02.jpg", "img/03.jpg", "img/04.jpg", "img/05.jpg", "img/06.jpg", "img/07.jpg", "img/08.jpg", "img/09.jpg", "img/10.jpg"]; //2.定义计数器变量 let count = 0; //3.声明定时器对象 let time = null; //4.声明图片路径变量 let imgSrc = ""; //5.为开始按钮绑定单击事件 $("#startBtn").click(function(){ //6.设置按钮状态 //禁用开始按钮 $("#startBtn").prop("disabled",true); //启用停止按钮 $("#stopBtn").prop("disabled",false); //7.设置定时器,循环显示图片 time = setInterval(function(){ //8.循环获取图片路径 let index = count % imgs.length; // 0%10=0 1%10=1 2%10=2 .. 9%10=9 10%10=0 //9.将当前图片显示到小图片上 imgSrc = imgs[index]; $("#small").prop("src",imgSrc); //10.计数器自增 count++; },10); }); //11.为停止按钮绑定单击事件 $("#stopBtn").click(function(){ //12.取消定时器 clearInterval(time); //13.设置按钮状态 //启用开始按钮 $("#startBtn").prop("disabled",false); //禁用停止按钮 $("#stopBtn").prop("disabled",true); //14.将图片显示到大图片上 $("#big").prop("src",imgSrc); $("#big").prop("style","width: 400px; height: 400px;"); }); </script> </html>

November 30, 2021&nbsp;·&nbsp;4 分钟&nbsp;·&nbsp;Lizicai

jQuery一 Li.068

jQuery 介绍 jQuery是一个JavaScript库 封装了很多预定义的函数, 获取元素, 执行隐藏移动等 目的就是在使用时直接调用, 不需要再重复定义, 这样就可以极大地简化了JavaScript编程 jQuery 快速入门 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>快速入门jQuery</title> </head> <body> <div id="div">我是div</div> </body> <script src="../jQuery/jquery-3.6.0.js"></script> <script> // let div = document.getElementById("div"); // alert(div.innerText) // jQuery 方式 let jqDiv = $("#div"); alert(jqDiv) alert(jqDiv.html()) </script> </html> JS对象和jQuery对象黑的 jQuery本质上虽然也是JS, 但如果想使用jQuery的属性和方法那么必须保证对象是jQuery对象, 而不是JS方式获得的DOM对象 二者的API方法不能混合使用, 若想使用对方的API, 需要进行对象转换 JS的DOM对象黑的成jQuery对象 $(JS的DOM对象); jQuery对象转换成jQuery对象 jQuery对象[索引]; jQuery对象.get(索引); <body> <div id="div">我是div</div> </body> <script src="../jQuery/jquery-3.6.0.js"></script> <script> // js 方式, 通过id获取div元素 // JS对象 转换 jQuery对象 let div1 = document.getElementById("div"); jsDiv1 = $(div1) alert(jsDiv1.html()) // jQuery对象 转换 DOM对象 let jqDiv2 = $("#div"); let div2 = jqDiv2[0] alert(div2.innerText) let div3 = jqDiv2.get(0) alert(div3.innerText) </script> jQuery事件的使用 常用事件 jQuery中将事件封装成了对应的方法. 去年了JS中的.on语法. 事件名 说明 onload 某个页面或图像被完成加载 onsubmit 当表单提交时触发该事件 onclick 鼠标单击事件 ondblclick 鼠标双击事件 onblur 元素失去焦点 onfocus 元素获得焦点 onchange 用户改变真苦域的内容 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>事件的使用</title> </head> <body> <input type="button" id="btn" value="点我"> <br> <input type="text" id="input"> </body> <script src="../jQuery/jquery-3.6.0.js"></script> <script> let btn = $("#btn") btn.click(check) function check(){ alert("点我干嘛") } $("#btn").click(function () { alert("匿名函数") }) // 获取焦点事件 let input = $("#input") input.focus(getFocus) function getFocus(){ // alert("你要输入数据了") } input.blur(loseFocus) function loseFocus(){ alert("你输入完成了") } </script> </html> 事件的绑定和解绑 绑定事件 jQuery对象.on(事件名称,执行的功能); 解绑事件 jQuery对象.off(事件名称) 如果不指定事件名称,则会把该对象绑定的所有事件都解绑 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>事件的绑定和解绑</title> </head> <body> <input type="button" id="btn1" value="点我"> <input type="button" id="btn2" value="解绑"> </body> <script src="../jQuery/jquery-3.6.0.js"></script> <script> // 1. 给btn1 绑定一个单击的事件 let btn1 = $("#btn1"); btn1.on("click", cc) function cc(){ alert("点我干嘛") } let btn2 = $("#btn2") btn2.on("click", jiebang) function jiebang(){ btn1.off("click") } </script> </html> 事件的切换 事件的切换: 需要给同一个对象绑定多个事件, 而且多个事件还有先后顺序关系 方式一: 单独定义 $(元素).事件方法名(要执行的功能); $(元素).事件方法名(要执行的功能); 方式二: 链式定义 $(元素).事件方法名1(要执行的功能).事件方法名2(要执行的功能) … <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>事件的切换</title> <style> #div{ border: 1px solid black; } </style> </head> <body> <div id="div">dvi</div> </body> <script src="../jQuery/jquery-3.6.0.js"></script> <script> // 方式一, this的使用 // $("#div").mouseover(function () { // $(this).css("background","red"); // }) // 方式一, 单独定义 let div = $("#div"); // div.on("mouseover", changeRed) // div.on("mouseout",changeBlue) function changeRed(){ div.css("background-color","red") } function changeBlue(){ div.css("background-color","blue") } // 方式二, 链式定义 div.on("mouseover", changeRed).on("mouseout",changeBlue) </script> </html> 遍历 方式一: 传统方式 for (let i=0;i<窗口对象长度;i++){ 执行功能; } 方式二:对象.each()方法 容器对象.each(function(index,ele){ 执行功能; }) 方式三:$.each()方法 $.each(容器对象,function(index.ele){ 执行功能; }); 方式四: for of 语句 for(ele of 容器对象){ 执行功能; } <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>遍历</title> </head> <body> <input type="button" id="btn" value="遍历列表项"> <ul> <li>前端</li> <li>后端</li> <li>全占工程师</li> </ul> </body> <script src="../jQuery/jquery-3.6.0.js"></script> <script> $("#btn").on("click", showCicle4); // 方式一: 传统方式 let lis = document.getElementsByTagName("li"); function showCicle1(){ for(let i=0; i< lis.length; i++){ console.log(lis[i].innerHTML+" ") } document.write("<br/>") } // 方式二: 对象.each()方法 let lis2 = $("li") function showCicle2(){ lis2.each(function(index,ele){ console.log(ele.innerHTML+" ") }); document.write("<br/>") } // 方式三: $.each()方法 let lis3 = $("li") function showCicle3(){ $.each(lis3,function(index,ele){ console.log(ele.innerHTML+" ") }); document.write("<br/>") } // 方式四: ele of 容器 let lis4 = $("li") function showCicle4(){ for(ele of lis4){ console.log(ele.innerHTML+" ") } document.write("<br/>") } </script> </html> jQuery 基本选择器 id选择器, 类选择器, 元素选择器, 属性选择器等等 jQuery中选择器的语法:$() 基本选择器 选择器 语法 作用 元素选择器 $("元素名称"); 根据元素名称获取元素对象们 id选择器 $("#id属性值") 根据id属性值获取元素对象 类选择器 $(".class属性值") 根据class属性值获取元素对象位 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>基本选择器</title> </head> <body> <div id="#div1">div1</div> <div class="div2">div2</div> <div class="div2">div3</div> </body> <script src="../jQuery/jquery-3.6.0.js"></script> <script> let divs = $("div") alert(divs.length) let div1 = $("#div1"); alert(div1) let div2 = $(".div2") alert(div2.length) </script> </html> jQuery 层级选择器 选择器 语法 作用 后代选择器 $("A B") A下的所有B(包括B的子级) 子选择器 $("A > B") A下的所有B(不包括B的子级) 兄弟选择器 $("A + B") A相邻的下一个B 兄弟选择器 $("A ~ B") A相邻的所有B <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>层级选择器</title> </head> <body> <div> <span>s1 <span>s1-1</span> <span>s1-2</span> </span> <span>s2</span> </div> <div></div> <p>p1</p> <p>p2</p> </body> <script src="../jQuery/jquery-3.6.0.js "></script> <script> // 1. 后代选择器 $("A B") A下的所有B(包括B的子级) let spans = $("div span"); // alert(spans.length) // 子选择器 $("A > B") A下的所有B(不包括B的子级) let spans2 = $("div > span") // alert(spans2.length) // 兄弟选择器 $("A + B") A相邻的下一个B let p1 = $("div+p") alert(p1.html()) // 兄弟选择器 $("A ~ B") A相邻的所有B let p2 = $("div ~ p") alert(p2.length+" "+p2[0].innerHTML) </script> </html> jQuery 属性选择器 选择器 语法 作用 属性名选择器 $("A[属性名]"); 根据指定属性名获取元素对象们 属性值选择器 $("A[属性名=属性值]"); 根据指定属性名和属性值获取元素对象们 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>属性选择器</title> </head> <body> <input type="text"> <input type="password"> <input type="password"> </body> <script src="../jQuery/jquery-3.6.0.js"></script> <script> // 属性名选择器 $("A[属性名]"); 根据指定属性名获取元素对象们 let inputs = $("input[type]"); // alert(inputs.length) // 属性值选择器 $("A[属性名=属性值]"); 根据指定属性名和属性值获取元素对象们 let inputs2 = $("input[type='password']") alert(inputs2.length) </script> </html> jQuery 过滤器选择器 选择器 语法 作用 首元素选择器 $("A:first"); 获得选择的元素中的第一个元素 尾元素选择器 $("A:last"); 获得选择的元素中的最后一个元素 非元素选择器 $("A:not(B)"); 不包括指定内容的元素 偶数选择器 $("A:even"); 偶数,从0开始计数 奇数选择器 $("A:odd"); 奇数,从0开始计数 等于索引选择器 $("A:eq(index)") 指定索引元素,和数组索引一致 大于索引选择器 $("A:gt(index)") 大于指定索引元素 小于索引选择器 $("A:lt(index)") 小玩指定索引元素 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>过滤器选择器</title> </head> <body> <div>div1</div> <div id="div2">div2</div> <div>div3</div> <div>div4</div> </body> <script src="../jQuery/jquery-3.6.0.js"></script> <script> // 首元素选择器 $("A:first"); 获得选择的元素中的第一个元素 let divFirst = $("div:first"); // alert(divFirst.html()) // 尾元素选择器 $("A:last"); 获得选择的元素中的最后一个元素 let divLast = $("div:last"); // alert(divLast.html()) // 非元素选择器 $("A:not(B)"); 不包括指定内容的元素 let divs3 = $("div:not(#div2)") // alert(divs3.length) // 偶数选择器 $("A:even"); 偶数,从0开始计数 let divs4 = $("div:even") // alert(divs4.length) // alert(divs4[0].innerHTML) // alert(divs4[1].innerHTML) // 奇数选择器 $("A:odd"); 奇数,从0开始计数 let divs5 = $("div:odd") // alert(divs5.length) alert(divs5[0].innerHTML) alert(divs5[1].innerHTML) // 等于索引选择器 $("A:eq(index)") 指定索引元素,和数组索引一致 let divs6 = $("div:eq(2)") // alert(divs6.html()) // 大于索引选择器 $("A:gt(index)") 大于指定索引元素 let divs7 = $("div:gt(0)") // alert(divs7.length) // 小于索引选择器 $("A:lt(index)") 小玩指定索引元素 let divs8 = $("div:lt(4)") // alert(divs8.length) </script> </html> jQuery 表单属性选择器 选择器 语法 作用 可用元素选择器 $("A:enabled"); 获得可用元素 不可用元素选择器 $("A:disabled"); 获得不可用元素 单选/复选框被选中的元素 $("A:checked"); 获得单选/复选框被选中的元素 下拉框被选中的元素 $("A:selected"); 获得下拉框选中的元素 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>表单选择器</title> </head> <body> <input type="text" disabled> <input type="text"> <input type="radio" name="gender" value="men" checked>男 <input type="radio" name="gender" value="women">女 <input type="checkbox" name="hobby" value="study" checked> <input type="checkbox" name="hobby" value="sleep" checked> <select> <option>---请选择---</option> <option selected>本科</option> <option>专科</option> </select> </body> <script src="../jQuery/jquery-3.6.0.js"></script> <script> // 可用元素选择器 $("A:enabled"); 获得可用元素 let inputs1 = $("input:enabled"); // alert(inputs1.length) // 不可用元素选择器 $("A:disabled"); 获得不可用元素 let inputs2 = $("input:disabled"); // alert(inputs2.length) // 单选/复选框被选中的元素 $("A:checked"); 获得单选/复选框被选中的元素 let inputs3 = $("input:checked"); // alert(inputs3.length) // 下拉框被选中的元素 $("A:selected"); 获得下拉框选中的元素 let selects1 = $("option:selected") alert(selects1.get(0).innerHTML) </script> </html>

November 24, 2021&nbsp;·&nbsp;5 分钟&nbsp;·&nbsp;Lizicai

JavaScript二 Li.067

JavaScript 面向对象, 类的定义和使用 定义格式 class 类名{ constructor(变量列表){ 变量赋值; } 方法名(参数列表){ 方法体; return 返回值; } } <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>类的定义和使用</title> </head> <body> </body> <script> class Person{ constructor(name,age) { this.name = name this.age = age } // show method show(){ document.write(this.name+" "+this.age+"<br/>"); } eat(){ document.write("吃饭<br>"); } } let p = new Person("张三",23) p.show() p.eat() </script> </html> 字面量定义类和使用 let 对象名 = { 变量名 : 变量值, 变量名 : 变量值, ... 方法名 : function(参数列表){ 方法体; return 返回值; } ... }; 使用格式 对象名.变量名 对象名.方法名(); <script> let person = { name : "张三", age : 23, hobby : ["听课","学习"], show : function (){ document.write(this.name+" "+this.age+"<br>") }, eat : function (){ document.write("吃饭") } } document.write(person.name+person.age+person.hobby[0]+","+person.hobby[1]+"<br/>") person.eat() </script> 继承 继承: 让类与类产生子父类的关系,子类可以使用父类有权限的成员 继承关键字: extends 顶级父类: Object <script> class Person{ constructor(name,age) { this.name = name this.age = age } // show method show(){ document.write(this.name+" "+this.age+"<br/>"); } } class Worker extends Person{ constructor(name,age,salary) { super(name, age); this.salary = salary } show(){ document.write(this.name+this.age+this.salary) } } var w = new Worker("张三",23,10000) w.show() </script JavaScript 内置对象 Number 方法名 说明 parseFloat() 将传入的字符串浮点数转为浮点数 parseInt() 将传入的字符串整数转为整数 <script> // 1. parseFloat() 将传入的字符串浮点数转为浮点数 document.write(Number.parseFloat("2.333")) document.write("<br>") document.write(Number.parseFloat("2.333")+2) document.write("<br>") // 2. parseInt() 将传入的字符串整数转为整数 document.write(Number.parseInt("100")) document.write("<br>") document.write(Number.parseInt("100")+20) document.write("<br>") document.write(Number.parseInt("1100ab")) document.write("<br>") </script> Math 方法名 说明 ceil(x) 向上取整 floor(x) 向下取整 round(x) 把数四舍五入为最接近的整数 random() 随机数,返回的是0.0-1.0之间范围(含头不含尾) pow(x,y) 幂运算的x的y次方 <script> // ceil(x) 向上取整 document.write(Math.ceil(4.4)) document.write("<br>") // floor(x) 向下取整 document.write(Math.floor(4.4)) document.write("<br>") // round(x) 把数四舍五入为最接近的整数 document.write(Math.round(4.1)) document.write("<br>") document.write(Math.round(4.6)) document.write("<br>") // random() 随机数,返回的是0.0-1.0之间范围(含头不含尾) document.write(Math.random()) document.write("<br>") // pow(x,y) 幂运算的x的y次方 document.write(Math.pow(2,3)) </script> Date 构造方法 说明 Date() 根据当前时间创建对象 Date(value) 根据指定毫秒值创建对象 Date(year,month,[day,hours,minutes,seconds,milliseconds]) 根据指定字段你出去对象(月份是0-11) 成员方法 说明 getFullYear() 获取年份 getMonth() 获取月份 getDate() 获取天数 getHours() 获取小时 getMinutes() 获取分钟 getSeconds() 获取秒数 getTime() 返回距1970年1月1日至今的毫秒数 toLocaleString() 返回本地日期格式的字符串 <script> // Date() 根据当前时间创建对象 let d1 = new Date() document.write(d1) document.write("<br>") // Date(value) 根据指定毫秒值创建对象 let d2 = new Date(20000) document.write(d2) document.write("<br>") // Date(year,month,[day,hours,minutes,seconds,milliseconds]) 根据指定字段你出去对象(月份是0-11) let d3 = new Date(2022,9,3,4,5,6) document.write(d3) document.write("<br>") // getFullYear() 获取年份 document.write(d3.getFullYear()) document.write("<br>") // getMonth() 获取月份 document.write(d3.getMonth()) document.write("<br>") // getDate() 获取天数 document.write(d3.getDate()) document.write("<br>") // getHours() 获取小时 document.write(d3.getHours()) document.write("<br>") // getMinutes() 获取分钟 document.write(d3.getMinutes()) document.write("<br>") // getSeconds() 获取秒数 document.write(d3.getSeconds()) document.write("<br>") // getTime() 返回距1970年1月1日至今的毫秒数 document.write(d3.getTime()) document.write("<br>") // toLocaleString() 返回本地日期格式的字符串 document.write(d3.toLocaleString()) document.write("<br>") </script String 内置对象 构造方法 说明 String(value) 根据指定字符串创建对象 let s="字符串" 直接赋值 成员方法 说明 length属性 获取字符串长度 charAt(index) 获取指定索引处的字符 indexOf(value) 获取指定字符串出现的索引位置,换不到为-1 substring(start,end) 根据指定索引范围截取字符串(含头不含尾) split(value) 根据指定规则切割字符串,返回数组 replace(old,new) 使用新字符串替换老字符串 <script> // String(value) 根据指定字符串创建对象 let s1 = new String("Hello") document.write(s1) document.write("<br>") // let s="字符串" 直接赋值 let s2 = "World" document.write(s2) document.write("<br>") // 成员方法 说明 // length属性 获取字符串长度 let s3 = "What is you name!" document.write(s3.length) document.write("<br>") // charAt(index) 获取指定索引处的字符 document.write(s3.charAt(10)) document.write("<br>") // indexOf(value) 获取指定字符串出现的索引位置,换不到为-1 document.write(s3.indexOf("a")) document.write("<br>") // substring(start,end) 根据指定索引范围截取字符串(含头不含尾) document.write(s3.substring(0,4)) document.write("<br>") // split(value) 根据指定规则切割字符串,返回数组 let s5arr = s3.split("\\s") for(ss of s5arr){ document.write(ss) } document.write("<br>") // replace(old,new) 使用新字符串替换老字符串 let s6 = "What is youuuu name!" document.write(s6.replace("uu","s")) document.write("<br>") </script> RegExp ...

November 19, 2021&nbsp;·&nbsp;5 分钟&nbsp;·&nbsp;Lizicai