前端基础之jQuery事件
一、常用事件
- click(function(){...})
- hover(function(){...})
- blur(function(){...})
- focus(function(){...})
- change(function(){...})
- keyup(function(){...})
keydown和keyup事件组合示例:
- <!DOCTYPE html>
- <html lang="zh-CN">
- <head>
- <meta http-equiv="content-Type" charset="UTF-8">
- <meta http-equiv="x-ua-compatible" content="IE=edge">
- <title>Title</title>
- </head>
- <body>
- <table border="1">
- <thead>
- <tr>
- <th>#</th>
- <th>姓名</th>
- <th>操作</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td><input type="checkbox"></td>
- <td>Egon</td>
- <td>
- <select>
- <option value="1">上线</option>
- <option value="2">下线</option>
- <option value="3">停职</option>
- </select>
- </td>
- </tr>
- <tr>
- <td><input type="checkbox"></td>
- <td>Alex</td>
- <td>
- <select>
- <option value="1">上线</option>
- <option value="2">下线</option>
- <option value="3">停职</option>
- </select>
- </td>
- </tr>
- <tr>
- <td><input type="checkbox"></td>
- <td>Yuan</td>
- <td>
- <select>
- <option value="1">上线</option>
- <option value="2">下线</option>
- <option value="3">停职</option>
- </select>
- </td>
- </tr>
- <tr>
- <td><input type="checkbox"></td>
- <td>EvaJ</td>
- <td>
- <select>
- <option value="1">上线</option>
- <option value="2">下线</option>
- <option value="3">停职</option>
- </select>
- </td>
- </tr>
- <tr>
- <td><input type="checkbox"></td>
- <td>Gold</td>
- <td>
- <select>
- <option value="1">上线</option>
- <option value="2">下线</option>
- <option value="3">停职</option>
- </select>
- </td>
- </tr>
- </tbody>
- </table>
- <script src="jquery.js"></script>
- <script>
- var flag = false;
- // shift被按下,就将全局的flag置为true
- $(window).keydown(function (e) {
- if (e.keyCode === 16) {
- flag = true;
- }
- });
- // shift被抬起的时候,就将全局的flag置为false
- $(window).keyup(function (e) {
- if (e.keyCode === 16) {
- flag = false;
- }
- });
- // 按下shift键,进入批量编辑模式
- // 应该是给select标签绑定change事件
- $('td>select').change(function () {
- // 判断是否进入批量编辑模式
- // 如何判断shift按键被按下
- // 如何判断当前行被选中
- var isChecked = $(this).parent().prev().prev().find(':checkbox').prop('checked');
- if (flag && isChecked) {
- // 1. 取到当前select选中的值
- var checkedValue = $(this).val();
- // 2. 找到所有被选中的行
- // 3. 把选中行的select置为和我一样的值
- $('tr:has(input:checked)').find('select').val(checkedValue);
- }
- })
- </script>
- </body>
- </html>
按住shift实现批量操作
hover事件示例:
- <!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">
- <title>hover示例</title>
- <style>
- * {
- margin: 0;
- padding: 0;
- }
- .nav {
- height: 40px;
- width: 100%;
- background-color: #3d3d3d;
- position: fixed;
- top: 0;
- }
- .nav ul {
- list-style-type: none;
- line-height: 40px;
- }
- .nav li {
- float: left;
- padding: 0 10px;
- color: #999999;
- position: relative;
- }
- .nav li:hover {
- background-color: #0f0f0f;
- color: white;
- }
- .clearfix:after {
- content: "";
- display: block;
- clear: both;
- }
- .son {
- position: absolute;
- top: 40px;
- right: 0;
- height: 50px;
- width: 100px;
- background-color: #00a9ff;
- display: none;
- }
- .hover .son {
- display: block;
- }
- </style>
- </head>
- <body>
- <div class="nav">
- <ul class="clearfix">
- <li>登录</li>
- <li>注册</li>
- <li>购物车
- <p class="son hide">
- 空空如也...
- </p>
- </li>
- </ul>
- </div>
- <script src="jquery.js"></script>
- <script>
- $(".nav li").hover(
- function () {
- $(this).addClass("hover");
- },
- function () {
- $(this).removeClass("hover");
- }
- );
- </script>
- </body>
- </html>
hover事件
实时监听input输入值变化示例:
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Title</title>
- <script src="jquery.js"></script>
- <script src="xyh.js"></script>
- <script src="ws.js"></script>
- <script>
- window.onload = function () {
- // input框失去焦点才触发
- $('#i1').on('blur', function () {
- var value = $(this).val();
- console.log(value);
- });
- // input框只要值发生变化就触发
- $('#i1').on('input', function () {
- var value = $(this).val();
- console.log(value);
- })
- }
- </script>
- </head>
- <body>
- <input type="text" id="i1">
- </body>
- </html>
input值变化事件
二、事件绑定
1、动态绑定:
$(' ').on('events' 'selector', function(){} )
- events: 事件
- selector: 选择器(可选的)
- function: 事件处理函数
2、静态绑定:
$(' ').click(function(){})
$(' ').on('click', function(){})
三、移除事件
.off(events selector, function(){})
off()
方法移除用 .on()
绑定的事件处理程序。
- events: 事件
- selector: 选择器(可选的)
- function: 事件处理函数
四、阻止后续事件执行
return false; // 常见阻止表单提交等
- e.preventDefault();
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>阻止默认事件</title>
- </head>
- <body>
- <form action="">
- <button id="b1">点我</button>
- </form>
- <script src="jquery-3.3.1.min.js"></script>
- <script>
- $("#b1").click(function (e) {
- alert(123);
- //return false;
- e.preventDefault();
- });
- </script>
- </body>
- </html>
注意:
像click、keydown等DOM中定义的事件,我们都可以使用`.on()`方法来绑定事件,但是`hover`这种jQuery中定义的事件就不能用`.on()`方法来绑定了。
想使用事件委托的方式绑定hover事件处理函数,可以参照如下代码分两步绑定事件:
- $('ul').on('mouseenter', 'li', function() {//绑定鼠标进入事件
- $(this).addClass('hover');
- });
- $('ul').on('mouseleave', 'li', function() {//绑定鼠标划出事件
- $(this).removeClass('hover');
- });
五、阻止事件冒泡
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>阻止事件冒泡</title>
- </head>
- <body>
- <div>
- <p>
- <span>点我</span>
- </p>
- </div>
- <script src="jquery-3.3.1.min.js"></script>
- <script>
- $("span").click(function (e) {
- alert("span");
- e.stopPropagation();
- });
- $("p").click(function () {
- alert("p");
- });
- $("div").click(function () {
- alert("div");
- })
- </script>
- </body>
- </html>
六、页面载入
当DOM载入就绪可以查询及操纵时绑定一个要执行的函数。这是事件模块中最重要的一个函数,因为它可以极大地提高web应用程序的响应速度。
两种写法:
- $(document).ready(function(){
- // 在这里写你的JS代码...
- })
简写:
- $(function(){
- // 你在这里写你的代码
- })
文档加载完绑定事件,并且阻止默认事件发生:
- <!DOCTYPE html>
- <html lang="zh-CN">
- <head>
- <meta charset="UTF-8">
- <meta http-equiv="x-ua-compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>登录注册示例</title>
- <style>
- .error {
- color: red;
- }
- </style>
- </head>
- <body>
- <form id="myForm">
- <label for="name">姓名</label>
- <input type="text" id="name">
- <span class="error"></span>
- <label for="passwd">密码</label>
- <input type="password" id="passwd">
- <span class="error"></span>
- <input type="submit" id="modal-submit" value="登录">
- </form>
- <script src="jquery-3.2.1.min.js"></script>
- <script src="s7validate.js"></script>
- <script>
- function myValidation() {
- // 多次用到的jQuery对象存储到一个变量,避免重复查询文档树
- var $myForm = $("#myForm");
- $myForm.find(":submit").on("click", function () {
- // 定义一个标志位,记录表单填写是否正常
- var flag = true;
- $myForm.find(":text, :password").each(function () {
- var val = $(this).val();
- if (val.length <= 0) {
- var labelName = $(this).prev("label").text();
- $(this).next("span").text(labelName + "不能为空");
- flag = false;
- }
- });
- // 表单填写有误就会返回false,阻止submit按钮默认的提交表单事件
- return flag;
- });
- // input输入框获取焦点后移除之前的错误提示信息
- $myForm.find("input[type!='submit']").on("focus", function () {
- $(this).next(".error").text("");
- })
- }
- // 文档树就绪后执行
- $(document).ready(function () {
- myValidation();
- });
- </script>
- </body>
- </html>
登录校验示例
七、与window.onload的区别
- window.onload()函数有覆盖现象,必须等待着图片资源加载完成之后才能调用
- jQuery的这个入口函数没有函数覆盖现象,文档加载完成之后就可以调用(建议使用此函数)
八、事件委托
事件委托是通过事件冒泡的原理,利用父标签去捕获子标签的事件。
示例:
表格中每一行的编辑和删除按钮都能触发相应的事件。
- $("table").on("click", ".delete", function () {
- // 删除按钮绑定的事件
- })
九、动画效果
- // 基本
- show([s,[e],[fn]])
- hide([s,[e],[fn]])
- toggle([s],[e],[fn])
- // 滑动
- slideDown([s],[e],[fn])
- slideUp([s,[e],[fn]])
- slideToggle([s],[e],[fn])
- // 淡入淡出
- fadeIn([s],[e],[fn])
- fadeOut([s],[e],[fn])
- fadeTo([[s],o,[e],[fn]])
- fadeToggle([s,[e],[fn]])
- // 自定义(了解即可)
- animate(p,[s],[e],[fn])
自定义动画示例:
- <!DOCTYPE html>
- <html lang="zh-CN">
- <head>
- <meta charset="UTF-8">
- <meta http-equiv="x-ua-compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>点赞动画示例</title>
- <style>
- div {
- position: relative;
- display: inline-block;
- }
- div > i {
- display: inline-block;
- color: red;
- position: absolute;
- right: -16px;
- top: -5px;
- opacity: 1;
- }
- </style>
- </head>
- <body>
- <div id="d1">点赞</div>
- <script src="jquery.js"></script>
- <script>
- $("#d1").on("click", function () {
- var newI = document.createElement("i");
- newI.innerText = "+1";
- $(this).append(newI);
- $(this).children("i").animate({
- opacity: 0
- }, 1000)
- })
- </script>
- </body>
- </html>
点赞特效简单示例
十、each
jQuery.each(collection, callback(indexInArray, valueOfElement)):
描述:一个通用的迭代函数,它可以用来无缝迭代对象和数组。数组和类似数组的对象通过一个长度属性(如一个函数的参数对象)来迭代数字索引,从0到length - 1。其他对象通过其属性名进行迭代。
- li =[10,20,30,40]
- $.each(li,function(i, v){
- console.log(i, v);//index是索引,ele是每次循环的具体元素。
- })
输出:
- 010
- 120
- 230
- 340
.each(function(index, Element)):
描述:遍历一个jQuery对象,为每个匹配元素执行一个函数。
.each()
方法用来迭代jQuery对象中的每一个DOM元素。每次回调函数执行时,会传递当前循环次数作为参数(从0开始计数)。由于回调函数是在当前DOM元素为上下文的语境中触发的,所以关键字 this
总是指向这个元素。
- // 为每一个li标签添加foo
- $("li").each(function(){
- $(this).addClass("c1");
- });
注意: jQuery的方法返回一个jQuery对象,遍历jQuery集合中的元素 - 被称为隐式迭代的过程。当这种情况发生时,它通常不需要显式地循环的 .each()
方法:
也就是说,上面的例子没有必要使用each()方法,直接像下面这样写就可以了:
- $("li").addClass("c1"); // 对所有标签做统一操作
注意:
在遍历过程中可以使用 return false
提前结束each循环。
终止each循环
- return false;
十一、.data()
在匹配的元素集合中的所有元素上存储任意相关数据或返回匹配的元素集合中的第一个元素的给定名称的数据存储的值。
.data(key, value):
描述:在匹配的元素上存储任意相关数据。
- $("div").data("k",100); //给所有div标签都保存一个名为k,值为100
.data(key):
描述: 返回匹配的元素集合中的第一个元素的给定名称的数据存储的值—通过 .data(name,value)
或 HTML5 data-*
属性设置。
- $("div").data("k");//返回第一个div标签中保存的"k"的值
.removeData(key):
描述:移除存放在元素上的数据,不加key参数表示移除所有保存的数据。
- $("div").removeData("k"); //移除元素上存放k对应的数据
十二、插件(了解即可)
jQuery.extend(object)
jQuery的命名空间下添加新的功能。多用于插件开发者向 jQuery 中添加新函数时使用。
示例:
- <script>
- jQuery.extend({
- min:function(a, b){return a < b ? a : b;},
- max:function(a, b){return a > b ? a : b;}
- });
- jQuery.min(2,3);// => 2
- jQuery.max(4,5);// => 5
- </script>
jQuery.fn.extend(object)
一个对象的内容合并到jQuery的原型,以提供新的jQuery实例方法。
- <script>
- jQuery.fn.extend({
- check:function(){
- return this.each(function(){this.checked =true;});
- },
- uncheck:function(){
- return this.each(function(){this.checked =false;});
- }
- });
- // jQuery对象可以使用新添加的check()方法了。
- $("input[type='checkbox']").check();
- </script>
单独写在文件中的扩展:
- (function(jq){
- jq.extend({
- funcName:function(){
- ...
- },
- });
- })(jQuery);
例子:
自定义的jQuery登录验证插件
- <!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">
- <title>登录校验示例</title>
- <style>
- .login-form {
- margin: 100px auto 0;
- max-width: 330px;
- }
- .login-form > div {
- margin: 15px 0;
- }
- .error {
- color: red;
- }
- </style>
- </head>
- <body>
- <div>
- <form action="" class="login-form" novalidate>
- <div>
- <label for="username">姓名</label>
- <input id="username" type="text" name="name" required autocomplete="off">
- <span class="error"></span>
- </div>
- <div>
- <label for="passwd">密码</label>
- <input id="passwd" type="password" name="password" required autocomplete="off">
- <span class="error"></span>
- </div>
- <div>
- <label for="mobile">手机</label>
- <input id="mobile" type="text" name="mobile" required autocomplete="off">
- <span class="error"></span>
- </div>
- <div>
- <label for="where">来自</label>
- <input id="where" type="text" name="where" autocomplete="off">
- <span class="error"></span>
- </div>
- <div>
- <input type="submit" value="登录">
- </div>
- </form>
- </div>
- <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
- <script src="validate.js"></script>
- <script>
- $.validate();
- </script>
- </body>
- </html>
HTML文件
- "use strict";
- (function ($) {
- function check() {
- // 定义一个标志位,表示验证通过还是验证不通过
- var flag = true;
- var errMsg;
- // 校验规则
- $("form input[type!=':submit']").each(function () {
- var labelName = $(this).prev().text();
- var inputName = $(this).attr("name");
- var inputValue = $(this).val();
- if ($(this).attr("required")) {
- // 如果是必填项
- if (inputValue.length === 0) {
- // 值为空
- errMsg = labelName + "不能为空";
- $(this).next().text(errMsg);
- flag = false;
- return false;
- }
- // 如果是密码类型,我们就要判断密码的长度是否大于6位
- if (inputName === "password") {
- // 除了上面判断为不为空还要判断密码长度是否大于6位
- if (inputValue.length < 6) {
- errMsg = labelName + "必须大于6位";
- $(this).next().text(errMsg);
- flag = false;
- return false;
- }
- }
- // 如果是手机类型,我们需要判断手机的格式是否正确
- if (inputName === "mobile") {
- // 使用正则表达式校验inputValue是否为正确的手机号码
- if (!/^1[345678]\d{9}$/.test(inputValue)) {
- // 不是有效的手机号码格式
- errMsg = labelName + "格式不正确";
- $(this).next().text(errMsg);
- flag = false;
- return false;
- }
- }
- }
- });
- return flag;
- }
- function clearError(arg) {
- // 清空之前的错误提示
- $(arg).next().text("");
- }
- // 上面都是我定义的工具函数
- $.extend({
- validate: function () {
- $("form :submit").on("click", function () {
- return check();
- });
- $("form :input[type!='submit']").on("focus", function () {
- clearError(this);
- });
- }
- });
- })(jQuery);
JS文件
传参版插件:
- <!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">
- <title>登录校验示例</title>
- <style>
- .login-form {
- margin: 100px auto 0;
- max-width: 330px;
- }
- .login-form > div {
- margin: 15px 0;
- }
- .error {
- color: red;
- }
- </style>
- </head>
- <body>
- <div>
- <form action="" class="login-form" novalidate>
- <div>
- <label for="username">姓名</label>
- <input id="username" type="text" name="name" required autocomplete="off">
- <span class="error"></span>
- </div>
- <div>
- <label for="passwd">密码</label>
- <input id="passwd" type="password" name="password" required autocomplete="off">
- <span class="error"></span>
- </div>
- <div>
- <label for="mobile">手机</label>
- <input id="mobile" type="text" name="mobile" required autocomplete="off">
- <span class="error"></span>
- </div>
- <div>
- <label for="where">来自</label>
- <input id="where" type="text" name="where" autocomplete="off">
- <span class="error"></span>
- </div>
- <div>
- <input type="submit" value="登录">
- </div>
- </form>
- </div>
- <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
- <script src="validate3.js"></script>
- <script>
- $.validate({
- "name": {"required": true},
- "password": {"required": true, "minLength": 8},
- "mobile": {"required": true}
- });
- </script>
- </body>
- </html>
HTML文件
- "use strict";
- (function ($) {
- function check(arg) {
- // 定义一个标志位,表示验证通过还是验证不通过
- var flag = true;
- var errMsg;
- // 校验规则
- $("form input[type!=':submit']").each(function () {
- var labelName = $(this).prev().text();
- var inputName = $(this).attr("name");
- var inputValue = $(this).val();
- if (arg[inputName].required) {
- // 如果是必填项
- if (inputValue.length === 0) {
- // 值为空
- errMsg = labelName + "不能为空";
- $(this).next().text(errMsg);
- flag = false;
- return false;
- }
- // 如果是密码类型,我们就要判断密码的长度是否大于6位
- if (inputName === "password") {
- // 除了上面判断为不为空还要判断密码长度是否大于6位
- if (inputValue.length < arg[inputName].minLength) {
- errMsg = labelName + "必须大于" + arg[inputName].minLength + "位";
- $(this).next().text(errMsg);
- flag = false;
- return false;
- }
- }
- // 如果是手机类型,我们需要判断手机的格式是否正确
- if (inputName === "mobile") {
- // 使用正则表达式校验inputValue是否为正确的手机号码
- if (!/^1[345678]\d{9}$/.test(inputValue)) {
- // 不是有效的手机号码格式
- errMsg = labelName + "格式不正确";
- $(this).next().text(errMsg);
- flag = false;
- return false;
- }
- }
- }
- });
- return flag;
- }
- function clearError(arg) {
- // 清空之前的错误提示
- $(arg).next().text("");
- }
- // 上面都是我定义的工具函数
- $.extend({
- validate: function (arg) {
- $("form :submit").on("click", function () {
- return check(arg);
- });
- $("form :input[type!='submit']").on("focus", function () {
- clearError(this);
- });
- }
- });
- })(jQuery);
JS文件
前端基础之jQuery事件的更多相关文章
- 前端基础之:JQuery(可编辑版)
前端基础之jquery 一 jQuery是什么? [1] jQuery由美国人John Resig创建,至今已吸引了来自世界各地的众多 javascript高手加入其team. [2] ...
- 进击的Python【第十六章】:Web前端基础之jQuery
进击的Python[第十六章]:Web前端基础之jQuery 一.什么是 jQuery ? jQuery是一个JavaScript函数库. jQuery是一个轻量级的"写的少,做的多&quo ...
- 前端第四篇---前端基础之jQuery
前端第四篇---前端基础之jQuery 一.jQuery介绍 二.jQuery对象 三.jQuery基础语法 四.事件 五.动画效果 六.补充each 一.jQuery简介 1.jQuery介绍 jQ ...
- 前端基础之JQuery - day15
写在前面 上课第15天,打卡: 张国臂掖,以通西域: ########### # 课上简书 # ########## http://jquery.cuishifeng.cn/index.html JQ ...
- jQuery 基础(3) -- jQuery 事件
jQuery 是为事件处理特别设计的.什么是事件?页面对不同访问者的响应叫做事件.事件处理程序指的是当 HTML 中发生某些事件时所调用的方法.实例:在元素上移动鼠标.选取单选按钮点击元素在事件中经常 ...
- Python学习(二十三)—— 前端基础之jQuery
转载自http://www.cnblogs.com/liwenzhou/p/8178806.html 一.jQuery入门 jQuery是一个轻量级的.兼容多浏览器的JavaScript库. jQue ...
- 前端基础 之 jQuery
浏览目录 jQuery介绍 jQuery的优势 jQuery对象 jQuery内容 一.jQuery介绍 1.jQuery是一个轻量级的.兼容多浏览器的JavaScript库. 2.jQuery使用户 ...
- 四丶前端基础之jquery
知识预览 一 jQuery是什么? 二 什么是jQuery对象? 三 寻找元素(选择器和筛选器) 四 操作元素(属性,css,文档处理) 扩展方法 (插件机制) 回到顶部 一 jQuery是什么? [ ...
- 前端基础之jQuery
JavaScript和jQuery的区别 JavaScript是一门编程语言,我们用它来编写客户端浏览器脚本 jQuery是javascript的一个库,包含多个可重用的函数,用来辅助我们简化java ...
随机推荐
- [Spring] 04 Denpendency Injection
DI Dependency Injection 依赖注入:从程序代码中移除依赖关系的一种设计模式. 这样就可以更容易地管理和测试应用程序. DI使我们的程序编码 loosely coupled.松耦合 ...
- C语言流控制命令的总结
C语言流控制命令的总结 基本概念: C语言中,自顶向下的的代码的流程叫做程序流. 能够改变程序流顺序的语句叫做流控制命令. 我为什么要写这篇文章 在学习C语言的过程中,经常会用到条件语句和循环语句这些 ...
- Maven报错Please ensure you are using JDK 1.4 or above and not a JRE解决方法!
https://www.cnblogs.com/shihua513/p/6163682.html 在eclipse下用maven编译时,很有可能出现以下错误: Please ensure you ar ...
- slf4j/logback: logging日志的配置
slf4j/logback: logging日志的配置 import依赖: import org.slf4j.Logger;import org.slf4j.LoggerFactory;private ...
- java ----> java.lang.NoClassDefFoundError
环境: centos 6.10,vim,jdk1.8_u72,zookeeper-3.4.6,maven3+ 正文: 使用zk的api操作创建节点发生java.lang.NoClassDefFound ...
- English trip M1 - AC11 May I Help You? 我能帮到你吗? Teacher:Lamb
In this lesson you will learn to ask for things in shops 在本课程中,您将学习如何在商店中寻找东西 课上内容(Lesson) How are ...
- LeetCode--003--无重复字符的最长子串(java)
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc&qu ...
- 通过ambari安装hadoop集群,ZT
通过ambari安装hadoop集群,ZT http://www.cnblogs.com/cenyuhai/p/3295635.html http://www.cnblogs.com/cenyuhai ...
- 【模板/经典题型】树上第k大
直接对树dfs一发,对每个节点建出主席树. 查询的时候主席树上二分,四个参数x+y-lca(x,y)-fa[lca(x,y)]. 如果要求支持动态加边的话,只需要一个启发式合并即可,每次暴力重构主席树 ...
- CentOS7 添加开机启动项
centos6 加入开机启动: vim /etc/rc.d/rc.local 注意命令不要出错,重启后生效 或者 centos 7 下: vim /lib/systemd/system/ ...