jQuery

1、JQuery介绍

	1. JQuery是一个轻量级的、兼容多浏览器的JavaScript库,JQuery极大地简化了JavaScript编程。
	1. JQuery使用户能够更方便地处理HTML Document、Events、实现动画效果、方便地进行Ajax交互,能够极大地简化JavaScript编程。它的宗旨就是:“Write less, do more.“

JQuery的优势

 1. 一款轻量级的JS框架。jQuery核心js文件才几十kb,不会影响页面加载速度。(js类库就是一些函数的集合,他把特定的效果的代码写好,你只需要用很少的代码去调用就可以,补充几种常见的js类库:Extjs, prototype.js, zepto.js)
	2. 丰富的DOM选择器,jQuery的选择器用起来很方便,比如要找到某个DOM对象的相邻元素,JS可能要写好几行代码,而jQuery一行代码就搞定了,再比如要将一个表格的隔行变色,jQuery也是一行代码搞定。
	3. 链式表达式。jQuery的链式操作可以把多个操作写在一行代码里,更加简洁。
	4. 事件、样式、动画支持。jQuery还简化了js操作css的代码,并且代码的可读性也比js要强。
	5. Ajax操作支持。jQuery简化了AJAX操作,后端只需返回一个JSON格式的字符串就能完成与前端的通信。
	6. 跨浏览器兼容。jQuery基本兼容了现在主流的浏览器,不用再为浏览器的兼容问题而伤透脑筋。
	7. 插件扩展开发。jQuery有着丰富的第三方的插件,例如:树形菜单、日期控件、图片切换插件、弹出窗口等等基本前端页面上的组件都有对应插件,并且用jQuery插件做出来的效果很炫,并且可以根据自己需要去改写和封装插件,简单实用。

jQuery版本

- 1.x:兼容IE678,使用最为广泛的,官方只做BUG维护,功能不再新增。因此一般项目来说,使用1.x版本就可以了,最终版本:1.12.4 (2016年5月20日)
- 2.x:不兼容IE678,很少有人使用,官方只做BUG维护,功能不再新增。如果不考虑兼容低版本的浏览器可以使用2.x,最终版本:2.2.4 (2016年5月20日)
- 3.x:不兼容IE678,只支持最新的浏览器。需要注意的是很多老的jQuery插件不支持3.x版。目前该版本是官方主要更新维护的版本。

*维护IE678是一件让人头疼的事情,一般我们都会额外加载一个CSS和JS单独处理。值得庆幸的是使用这些浏览器的人也逐步减少,PC端用户已经逐步被移动端用户所取代,如果没有特殊要求的话,一般都会选择放弃对678的支持。*

2、使用jQuery
    1、引入jQuery文件
        <script src="jquery-1.11.3.js"></script>
        注意:引入的操作必须要放在其他jQuery操作之前
    2、使用jQuery
        ... ...
3、jQuery对象
    1、什么是jQuery对象
        jQuery对象是由jQuery对页面元素进行封装后的一种体现
        jQuery中所提供的所有操作都只针对jQuery对象,其他对象不能用(如:DOM对象)
    2、工厂函数 - $()
        想要获取jQuery对象 或 转换为jQuery对象的话,就必须要使用工厂函数
    3、DOM对象 和 jQuery对象之间的转换
        DOM对象:以DOM的方式获取出来的节点对象,都是DOM对象,DOM对象只能使用DOM中所提供的方法和属性,是不能
访问jQuery提供的属性和方法

        jQuery对象:由jQuery封装而得到的对象。jQuery对象只能访问jQuery提供的属性和方法,是不能访问DOM提供的属性和 
方法

        1、将DOM对象转换为jQuery对象
            语法:var $obj=$(DOM对象);
            注意:在为jQuery对象起名的时候,最好在变量名称前 + $

        2、将jQuery对象转换为DOM对象
            1、var dom对象 = jQuery对象.get(0);
            2、var dom对象 = jQuery对象[0];

jQuery基础语法

$(selector).action()

JS中创建对象

1、使用Object 直接创建对象
    var newObj = new Object();
    //添加属性
    newObj.property1 = value1;
    newObj.property2 = value2;
    ... ...
    //添加方法
    newObj.method1 = function(){
        ... ...
    }

    newObj.method2 = function(arg){
        arg 就是参数
    }
2、使用构造器创建对象
    function 对象名(参数1,参数2,...){
        
        //只能使用this来访问或创建当前对象的成员
        
        //使用参数为属性赋值
        this.属性1 = 参数1;
        this.属性2 = 参数2;
        //创建方法
        this.funName = function(){
            
        }
    }

    使用对象
    var obj1 = new 对象名(参数1,参数2);

3、使用JSON创建对象
    1、什么是JSON
        JSON:JavaScript Object Notation - JS对象表现形式
        JSON通常会作为轻量级的数据交换格式

        JSON一般表示只有属性没有方法的对象
    2、声明JSON对象
        0、JSON对象使用{}来表示
        1、使用键值对的方式来声明数据的
        2、所有的属性,必须用""引起来,如果值是字符串的话,也必须用""引起来
        3、属性 和 值 之间用 : 隔开
        4、多对属性之间,使用 , 隔开

jQuery选择器

1、作用
    获取页面上的元素们,返回jQuery对象所组成的数组
    语法:$("选择器");
2、选择器的分类
    1、基础选择器
        1、ID选择器
            用法:$("#ID值");
            说明:返回HTML中指定ID值的元素
        2、类选择器
            用法;$(".className");
            说明:返回HTML中所有class为className的元素
        3、元素选择器
            用法:$("元素名称");
            说明:返回HTML中所有指定标记的元素
        4、通用选择器
            用法:$("*");
            说明:返回HTML中所有的元素
        5、组合选择器
            用法:$("#id, .className, tagName")
            说明:返回满足工厂函数内所有选择器的元素
        5、配合使用
           用法: $("div.c1")
           说明:找到有c1 class类的div标签
    2、层级选择器
        1、$("selector1 selector2")
                后代选择器
        2、$("selector1>selector2")
                子代选择器
        3、$("selector1+selector2")
            名称:相邻兄弟选择器
            作用:匹配紧紧跟在selector1后面且满足selector2选择器的元素
        4、$("selector1~selector2")
            名称:通用兄弟选择器
            作用:匹配selector1后面且满足selector2选   择器的所有元素
    3、过滤选择器
        1、基本过滤选择器
            1、:first
                只匹配到一组元素中的第一个
            2、:last
                只匹配到一组元素中的最后一个
            3、:not(selector)
                在一组元素中,将满足selector的元素排除出去
            4、:odd
                匹配 偶数行 元素(奇数索引)
            5、:even
                匹配 奇数行 元素(偶数索引)
            6、:eq(index)
                匹配下标等于 index 的元素
                $("p:eq(0)").css();
            7、:gt(index)
                匹配下标大于 index 的元素
            8、:lt(index)
                匹配下标小于 index 的元素
        2、内容过滤选择器
            1、:contains("text")
                匹配包含指定文本的元素
                $("p:contains('佳能')")
            2、:empty
                匹配空元素(不包含任何子元素以及文本)
            3、:has(selector)
                匹配含有指定选择器的元素
            4、:parent
                匹配本身是父元素的元素
        3、可见性过滤选择器
            1、:visible
                匹配所有的可见元素
            2、:hidden
                匹配所有不可见元素
        4、状态过滤选择器
            主要用在表单控件上
            1、:enabled
                匹配所有的可用元素
            2、:disabled
                匹配所有禁用元素
            3、:checked
                匹配所有被选中的元素(radio 和 checkbox)
            4、:selected
                匹配所有被选中的元素(select)
        5、子元素过滤选择器
            1、:first-child
                匹配属于其父元素中的第一个子元素
            2、:last-child
                匹配属于其父元素中的最后一个子元素
            3、:nth-child(n)
                匹配属于其父元素中的第n个子元素
    4、属性选择器
        使用元素的属性来匹配页面的元素
        1、[attr]
            匹配具有attr属性的元素
            ex:
                1、匹配页面中所有有id属性的元素
                    $("[id]")
                2、匹配页面中所有有class属性的元素
                    $("[class]")
        2、[attr=value]
            匹配attr属性值为value的元素
            ex:匹配页面中所有的文本框
                $(":text");
                $("input[type='text']")
        3、[attr!=value]
        4、[attr^=value]
            匹配attr属性值是以value字符开始的元素们
        5、[attr$=value]
            匹配attr属性值是以value字符结尾的元素们
        6、[attr*=value]
            匹配attr属性值中包含value字符的元素们

jQuery 操作 DOM

1、基本操作
    1、html()
        等同于dom中的 innerHTML
        作用:读取或设置jQuery对象中的HTML内容
    2、text()
        等同于dom中的 innerText
        作用:读取或设置jQuery对象中的普通文本内容
    3、val()
        等同于dom中的 value
        作用:读取或设置jQuery对象的value值(表单)
    4、属性操作
        1、attr()
            作用:读取或设置jquery对象的属性值
            ex:
                $("#main").attr("id");
                $("#main").attr("class","redBack");
        2、removeAttr(attrName)
            作用:删除jQuery对象的指定属性
2、样式操作
    1、attr("class","className")
        为元素动态绑定class属性值
    2、$obj.addClass("className")

        $obj.addClass("c1").addClass('c2').addClass('c3').html("测试的文本");
    3、removeClass("className")
        删除指定的类选择器
    4、removeClass()
        删除所有的类选择器
    5、toggleClass("className")
        切换样式
         元素如果具备className选择器,则删除
         元素如果没有className选择器,则添加
    6、hasClass("className")
        判断元素是否包含className选择器
    7、css("属性","值")
        为元素动态的设置某css属性极其值
        $obj.css("background-color","red");
    8、css(JSON对象)
        $obj.css({
            "color":"red",
            "font-size":"32px",
            "text-decoration":"underline"
        });
3、遍历节点
    1、children() / children(selector)
        获取jQuery对象的所有子元素或带有指定选择器的子元素
        注意:只考虑子元素不考虑后代元素
    2、next() / next(selector)
        获取jQuery对象的下一个兄弟元素 / 满足selector的下一个兄弟元素
    3、prev() / prev(selector)
        获取jQuery对象的上一个兄弟元素 / 满足selector的上一个兄弟元素
    4、siblings() / siblings(selector)
        获取jQuery对象的所有兄弟 / 满足selector的所有兄弟
    5、find(selector)
        查找满足selector选择器的后代元素
    6、parent()
        查找jQuery对象的父元素
4、创建 & 插入节点
    1、创建对象
        语法:$("创建内容");
        ex:
            1、创建一个div
                var $div=$("<div></div>");
            2、创建一个button,文本为 测试按钮
                var $btn=$("<button>测试按钮</button>");
    2、插入节点
        1、内部插入
            1、$obj.append($new);
                将$new作为$obj的最后一个子元素插入进来
            2、$obj.prepend($new);
                将$new作为$obj的第一个子元素插入进来
        2、外部插入
            1、$obj.after($new)
                将$new作为$obj的下一个兄弟插入进来
            2、$obj.before($new)
                将$new作为$obj的上一个兄弟插入进来
5、删除节点
    1、remove()
        语法:$obj.remove();
        作用:删除$obj元素
    2、remove("selector")
        语法:$obj.remove("selector")
        作用:按选择器删除元素
    3、empty()
        语法:$obj.emptu()
        作用:清空$obj中所有的内容
6、替换 和 复制
    1、替换
        1、replaceWith
            语法:$old.replaceWith($new);
            使用$new元素替换$old元素
        2、replaceAll
            语法:$new.replaceAll($old);
    2、复制
        1、clone()
            $new = $old.clone();

jQuery 事件

1、页面加载后执行
    HTML页面加载流程:
        1、向服务器发送请求
        2、接收服务器的响应
        3、在内存中生成DOM树
        4、渲染 - 显示内容到网页上
        5、执行window.onload
    jQuery 处理的时候
        1、向服务器发送请求
        2、接收服务器的响应
        3、在内存中生成DOM树
        4、执行 加载后的 操作
        5、渲染 - 显示内容到网页上
    如何实现页面加载后执行:
    1、
        $(document).ready( function(){
            //页面的初始化操作
            //DOM数加载完成后就开始执行
        } );
    2、
        $().ready( function(){
            //页面的初始化操作
            //DOM数加载完成后就开始执行
        } );
    3、
        $( function(){
            //页面的初始化操作
            //DOM数加载完成后就开始执行
        } );
2、jQuery实现事件的绑定
    1、方式1
        $obj.bind("事件名称",function(){
            //事件的操作
            //允许使用this来表示当前元素
        });

        $obj.bind("事件名称",function(event){
            //事件的操作
            //允许使用this来表示当前元素
            //允许传递event对象,作为事件对象
        });
    2、方式2
        $obj.事件名称(function(){
            //事件的操作
            //允许使用this来表示当前元素
        });

        $obj.事件名称(function(event){
            //事件的操作
            //允许使用this来表示当前元素
            //允许传递event来表示事件对象
        })

事件

常用事件

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
    tdinput type="checkbox"/td
    tdEgon/td
    td
      select
        option value="1"上线/option
        option value="2"下线/option
        option value="3"停职/option
      /select
    /td
  /tr
  tr
    tdinput type="checkbox"/td
    tdAlex/td
    td
      select
        option value="1"上线/option
        option value="2"下线/option
        option value="3"停职/option
      /select
    /td
  /tr
  tr
    tdinput type="checkbox"/td
    tdYuan/td
    td
      select
        option value="1"上线/option
        option value="2"下线/option
        option value="3"停职/option
      /select
    /td
  /tr
  tr
    tdinput type="checkbox"/td
    tdEvaJ/td
    td
      select
        option value="1"上线/option
        option value="2"下线/option
        option value="3"停职/option
      /select
    /td
  /tr
  tr
    tdinput type="checkbox"/td
    tdGold/td
    td
      select
        option value="1"上线/option
        option value="2"下线/option
        option value="3"停职/option
      /select
    /td
  /tr
  /tbody
/table

input type="button" id="b1" value="全选"
input type="button" id="b2" value="取消"
input type="button" id="b3" value="反选"

script src="jquery-3.3.1.js"/script
script

    var flag = false;
    // shift按键被按下的时候

    (window).keydown(function (event) {
        console.log(event.keyCode);
        if (event.keyCode === 16){
            flag = true;
        }
    });
    // shift按键被抬起的时候
    (window).keyup(function (event) {
        console.log(event.keyCode);
        if (event.keyCode === 16){
            flag = false;
        }
    });
    // select标签的值发生变化的时候
    $("select").change(function (event) {
        // 如果shift按键被按下,就进入批量编辑模式
        // shift按键对应的code是16
        // 判断当前select这一行是否被选中
        console.log($(this).parent().siblings().first().find(":checkbox"));
        var isChecked = $(this).parent().siblings().first().find(":checkbox").prop("checked");
        console.log(isChecked);
        if (flag && isChecked) {
            // 进入批量编辑模式
            // 1. 取到当前select选中的值
            var value = $(this).val();
            // 2. 给其他被选中行的select设置成和我一样的值
            // 2.1 找到那些被选中行的select
            var $select = $("input:checked").parent().parent().find("select")
            // 2.2 给选中的select赋值
            $select.val(value);
        }
    });
/script
/body
/html

按住shift实现批量操作

hover事件示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<p>苍茫的天涯是我的哎,绵绵的青山脚下一片海!</p>

script src="jQuery-3.3.1.js"
/script
script
    $('p').hover(
        function () {
            alert('来啦,老弟')
        },
        function () {
            alert('慢走哦~')
        }
    )
/script
/body
/html

hover事件

实时监听input输入值变化示例:

<!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>实时监听input输入值变化</title>
</head>
<body>
<input type="text" id="i1">

script src="jquery-3.2.1.min.js"/script
script
  /*

- oninput是HTML5的标准事件
- 能够检测textarea,input:text,input:password和input:search这几个元素的内容变化,
- 在内容修改后立即被触发,不像onchange事件需要失去焦点才触发
- oninput事件在IE9以下版本不支持,需要使用IE特有的onpropertychange事件替代
- 使用jQuery库的话直接使用on同时绑定这两个事件即可。
- */
$("#i1").on("input propertychange", function () {
alert($(this).val());
  })
/script
/body
/html

input值变化事件

事件绑定

  1. .on( events [, selector ],function(){})
  • events: 事件
  • selector: 选择器(可选的)
  • function: 事件处理函数

移除事件

  1. .off( events [, selector ][,function(){}])

off() 方法移除用 .on()绑定的事件处理程序。

  • events: 事件
  • selector: 选择器(可选的)
  • function: 事件处理函数

阻止后续事件执行

  1. return false; // 常见阻止表单提交等
  2. 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事件处理函数,可以参照如下代码分两步绑定事件:

[复制代码](javascript:void(0)😉

复制代码

$('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();      //阻止事件冒泡      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 () {
  // 删除按钮绑定的事件
})

jQuery 动画

1、基本显示 / 隐藏
    语法:
        显示:$obj.show(); / $obj.show(duration);
        隐藏:$obj.hide(); / $obj.hide(duration);
2、滑动式 显示/隐藏
    语法:
        显示:$obj.slideDown() / $obj.slideDown(duration);
        隐藏:$obj.slideUp() / $obj.slideUp(duration);
3、淡入淡出式 显示/隐藏
    语法:
        显示:$obj.fadeIn() / $obj.fadeIn(duration)
        隐藏:$obj.fadeOut() / $obj.fadeOut(duration)
4、自定义(了解即可)
		语法:
     		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-3.2.1.min.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

点赞特效简单示例

JSON :

JavaScript Object Notation
JSON是一种轻量级的数据交换格式

声明JSON格式的对象:
    1、JSON格式的对象使用 {}
    2、使用键值对的方式来声明数据
        键 - 表示该对象的属性
        值 - 表示该对象的值
    3、属性的属性(键),必须用""引起来,值也是字符串的话也需要使用""引起来
    4、属性 和 值之间使用 : 隔开
    5、多对属性之间,使用 , 隔开

    var obj = {
        "name":"sanfeng.zhang",
        "age":"30",
        "gender":"男"
    };

Python工具 - pip

1、作用
    Python的软件包管理器,有一些python包被集成到了pip中。只要被集成到pip中的包,都允许通过pip直接安装
2、安装 pip
    sudo apt install python-pip (python2)
    sudo apt install python3-pip (python3)
3、使用 pip / pip3
    1、安装/更新/删除 python包
        1、安装python包
            sudo pip3 install SomePackage
            ex:
                sudo pip3 install pymysql==0.7.11
        2、下载 python 包
            sudo pip3 download SomePackage
        3、删除 python 包
            sudo pip3 uninstall SomePackage
        4、更新(升级)python包
            sudo pip3 upgrade SomePackage
    2、查看当前环境中所安装的包
        pip3 list
    3、搜索
        pip3 search SomePackage
    4、展示
        pip3 show SomePackage
    5、记录现有环境的python包
        1、pip3 freeze > requirements.txt
            将当前python环境中所安装的内容打包成一个列表
        2、pip3 install -r requirements.txt
            允许在当前系统下,逐一安装requirements.txt中所列出的内容

Python工具 - VirtualEnv

1、什么是VirtualEnv - 虚拟环境
    VirtualEnv,是Python中的虚拟环境,在做Python应用开发时,如果不想在大的Python环境中安装各种各样的包的话,则可以虚拟
出一个Python环境,可以让虚拟环境专门为某一个应用而存在。允许在虚拟环境中安装各种包且不影响大的python环境
2、安装 VirtualEnv
    sudo pip3 install virtualenv
3、创建 和 使用 虚拟环境
    1、准备工作
        mkdir my_env
        cd my_env
    2、创建虚拟环境
        virtualenv 虚拟环境名称
        ex:virtualenv default

        创建指定版本的虚拟环境
        virtualenv -p /usr/bin/python2.7 名称
        virtualenv -p /usr/bin/python3.5 名称
    3、启动虚拟环境
        注意:不能在 bin 目录中启动虚拟环境
        source bin/activate
    4、退出虚拟环境
        deactivate
    5、删除虚拟环境
        rm 虚拟环境目录 -rf

    注意:
        在虚拟环境中使用pip安装和卸载内容时,不要使用 sudo 进行授权
4、虚拟环境管理工具 - VirtualenvWrapper
    1、作用
        第三方的管理工具,能够快速,高效而且方便的管理虚拟环境
    2、安装虚拟环境管理工具
        sudo pip3 install virtualenvwrapper
    3、配置 virtualenvwrapper
        在~目录下,有一个终端管理文件 .bashrc (在~目录下,输入 ll)
        配置 .bashrc ,以便在启动终端时,就自动启动虚拟环境管理工具
        修改.bashrc : sudo vi .bashrc
        在 .bashrc 最底部增加以下内容:
        1、export WORKON_HOME=~/my_env
            将 ~/my_env 作为虚拟环境的管理目录,所有使用virtualenvwrapper创建的虚拟环境都默认保存于此
        2、如果系统中包含多个python执行环境的话,则添加以下内容
            export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
        3、source /usr/local/bin/virtualenvwrapper.sh
        4、在 ~ 目录下,执行一遍 .bashrc
            source .bashrc
    4、使用虚拟环境管理工具
        1、创建并进入虚拟环境
            1、mkvirtualenv 虚拟环境名称
                ex: mkvirtualenv default
            2、
                mkvirtualenv --python=/usr/bin/python2.7 虚拟环境名称
        2、查看当前所维护的所有虚拟环境
            workon
        3、切换虚拟环境
            workon 虚拟环境名称
        4、退出虚拟环境
            deactivate
        5、删除虚拟环境
            rmvirtualenv 虚拟环境名称
        

WEB 与 服务器

1、WEB :表示用户可以浏览的网页(HTML,CSS,JS)
2、服务器
    1、硬件 与 软件
        硬件范畴:一台主机
        软件范畴:一个能够接受用户请求并给出响应的程序
    2、作用
        1、存储WEB上的信息(网页,图片,音视频,css)
        2、能够处理用户的请求(request)并给出响应(response)
        3、能够执行服务器端程序:如查询数据库
    3、WEB与服务器的关系
        参考图 - WEB与服务器的关系
        运行在服务器端的程序,可以由不同的语言来编写:
            Java语言 -> JSP
            C#语言 -> ASP.NET
            php语言 -> php
            Python语言 -> Django
    4、网站请求的全过程
        1、用户:输入域名,通过域名解析(DNS)器得到IP地址
        2、向服务器发送http/https请求
        3、传输层TCP协议,经过网络传输和路由解析
        4、WEB服务器接收HTTP请求
        5、服务器处理请求内容,并进行必要的数据交换
        6、将响应的内容发回给浏览器(响应)
        7、浏览器解析HTML
        8、显示解析好的内容      

基本筛选器:

:first // 第一个
:last // 最后一个
:eq(index)// 索引等于index的那个元素
:even // 匹配所有索引值为偶数的元素,从 0 开始计数
:odd // 匹配所有索引值为奇数的元素,从 0 开始计数
:gt(index)// 匹配所有大于给定索引值的元素
:lt(index)// 匹配所有小于给定索引值的元素
:not(元素选择器)// 移除所有满足not条件的标签
:has(元素选择器)// 选取所有包含一个或多个标签在其内的标签(指的是从后代元素找)

例子:

$("div:has(h1)")// 找到所有后代中有h1标签的div标签
$("div:has(.c1)")// 找到所有后代中有c1样式类的div标签
$("li:not(.c1)")// 找到所有不包含c1样式类的li标签
$("li:not(:has(a))")// 找到所有后代中不含a标签的li标签

练习:

自定义模态框,使用jQuery实现弹出和隐藏功能。

<!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>
    .cover {
      position: fixed;
      left: 0;
      right: 0;
      top: 0;
      bottom: 0;
      background-color: darkgrey;
      z-index: 999;
    }
    .modal {
      width: 600px;
      height: 400px;
      background-color: white;
      position: fixed;
      left: 50%;
      top: 50%;
      margin-left: -300px;
      margin-top: -200px;
      z-index: 1000;
    }
    .hide {
      display: none;
    }
  </style>
</head>
<body>
<input type="button" value="弹" id="i0">

div class="cover hide"/div
div class="modal hide"
  label for="i1"姓名/label
  input id="i1" type="text"
   label for="i2"爱好/label
  input id="i2" type="text"
  input type="button" id="i3" value="关闭"
/div
script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"/script
script
  var tButton = $("#i0")[0];
  tButton.onclick=function () {
    var coverEle = $(".cover")[0];
    var modalEle = $(".modal")[0];

    $(coverEle).removeClass("hide");
    $(modalEle).removeClass("hide");

  };

  var cButton = $("#i3")[0];
  cButton.onclick=function () {
    var coverEle = $(".cover")[0];
    var modalEle = $(".modal")[0];

    $(coverEle).addClass("hide");
    $(modalEle).addClass("hide");

  }
/script
/body
/html

jQuery版自定义模态框

属性选择器:

[attribute]
[attribute=value]// 属性等于
[attribute!=value]// 属性不等于

例子:

// 示例
<input type="text">
<input type="password">
<input type="checkbox">
$("input[type='checkbox']");// 取到checkbox类型的input标签
$("input[type!='text']");// 取到类型不是text的input标签

表单筛选器

:text
:password:file
:radio
:checkbox
:submit
:reset
:button

例子:

$(":checkbox")  // 找到所有的checkbox

表单对象属性:

:enabled
:disabled
:checked
:selected

例子:

找到可用的input标签

<form>
  <input name="email" disabled="disabled" />
  <input name="id" />
</form>

$("input:enabled")  // 找到可用的input标签

找到被选中的option:

<select id="s1">
  <option value="beijing">北京市</option>
  <option value="shanghai">上海市</option>
  <option selected value="guangzhou">广州市</option>
  <option value="shenzhen">深圳市</option>
</select>

$(":selected")  // 找到所有被选中的option

筛选器方法

下一个元素:

$("#id").next()
$("#id").nextAll()
$("#id").nextUntil("#i2")

上一个元素:

$("#id").prev()
$("#id").prevAll()
$("#id").prevUntil("#i2")

父亲元素:

$("#id").parent()
$("#id").parents()  // 查找当前元素的所有的父辈元素$("#id").parentsUntil() // 查找当前元素的所有的父辈元素,直到遇到匹配的那个元素为止。

儿子和兄弟元素:

$("#id").children();// 儿子们
$("#id").siblings();// 兄弟们

查找

搜索所有与指定表达式匹配的元素。这个函数是找出正在处理的元素的后代元素的好方法。

$("div").find("p")

等价于$("div p")

筛选

筛选出与指定表达式匹配的元素集合。这个方法用于缩小匹配的范围。用逗号分隔多个表达式。

$("div").filter(".c1")  // 从结果集中过滤出有c1样式类的

等价于 $("div.c1")

补充:

.first() // 获取匹配的第一个元素
.last() // 获取匹配的最后一个元素
.not() // 从匹配元素的集合中删除与指定表达式匹配的元素
.has() // 保留包含特定后代的元素,去掉那些不含有指定后代的元素。
.eq() // 索引值等于指定值的元素

示例:左侧菜单

操作标签

样式操作

样式类

addClass();// 添加指定的CSS类名。
removeClass();// 移除指定的CSS类名。
hasClass();// 判断样式存不存在
toggleClass();// 切换CSS类名,如果有就移除,如果没有就添加。

示例:开关灯和模态框

CSS

css("color","red")//DOM操作:tag.style.color="red"

示例:

$("p").css("color", "red"); //将所有p标签的字体设置为红色

位置操作

offset()// 获取匹配元素在当前窗口的相对偏移或设置元素位置
position()// 获取匹配元素相对父元素的偏移
scrollTop()// 获取匹配元素相对滚动条顶部的偏移
scrollLeft()// 获取匹配元素相对滚动条左侧的偏移

.offset()方法允许我们检索一个元素相对于文档(document)的当前位置。

.position()的差别在于: .position()是相对于相对于父级元素的位移。

示例:

返回顶部示例

尺寸:

height()
width()
innerHeight()
innerWidth()
outerHeight()
outerWidth()

文本操作

HTML代码:

html()// 取得第一个匹配元素的html内容
html(val)// 设置所有匹配元素的html内容

文本值:

text()// 取得所有匹配元素的内容
text(val)// 设置所有匹配元素的内容

值:

val()// 取得第一个匹配元素的当前值
val(val)// 设置所有匹配元素的值
val([val1, val2])// 设置多选的checkbox、多选select的值

例如:

[复制代码](javascript:void(0)😉

复制代码

<input type="checkbox" value="basketball" name="hobby">篮球
<input type="checkbox" value="football" name="hobby">足球

select multiple id="s1"
    option value="1"1/option
    option value="2"2/option
    option value="3"3/option
/select

(javascript:void(0)😉

设置值:

$("[name='hobby']").val(['basketball', 'football']);
$("#s1").val(["1", "2"])

示例:

获取被选中的checkbox或radio的值:

<label for="c1">女</label>
<input name="gender" id="c1" type="radio" value="0">
<label for="c2">男</label>
<input name="gender" id="c2" type="radio" value="1">

可以使用:

$("input[name='gender']:checked").val()

自定义登录校验示例

属性操作

用于ID等或自定义属性:

attr(attrName)// 返回第一个匹配元素的属性值
attr(attrName, attrValue)// 为所有匹配元素设置一个属性值
attr({k1: v1, k2:v2})// 为所有匹配元素设置多个属性值
removeAttr()// 从每一个匹配的元素中删除一个属性

用于checkbox和radio

prop() // 获取属性
removeProp() // 移除属性

注意:

在1.x及2.x版本的jQuery中使用attr对checkbox进行赋值操作时会出bug,在3.x版本的jQuery中则没有这个问题。为了兼容性,我们在处理checkbox和radio的时候尽量使用特定的prop(),不要使用attr("checked", "checked")。

<input type="checkbox" value="1">
<input type="radio" value="2">
<script>
  $(":checkbox[value='1']").prop("checked", true);
  $(":radio[value='2']").prop("checked", true);
</script>

prop和attr的区别:

attr全称attribute(属性)

prop全称property(属性)

虽然都是属性,但他们所指的属性并不相同,attr所指的属性是HTML标签属性,而prop所指的是DOM对象属性,可以认为attr是显式的,而prop是隐式的。

举个例子:

<input type="checkbox" id="i1" value="1">

针对上面的代码,

$("#i1").attr("checked")  // undefined
$("#i1").prop("checked")  // false

可以看到attr获取一个标签内没有的东西会得到undefined,而prop获取的是这个DOM对象的属性,因此checked为false。

如果换成下面的代码:

<input type="checkbox" checked id="i1" value="1">

再执行:

$("#i1").attr("checked")   // checked
$("#i1").prop("checked")  // true

这已经可以证明attr的局限性,它的作用范围只限于HTML标签内的属性,而prop获取的是这个DOM对象的属性,选中返回true,没选中返回false。

接下来再看一下针对自定义属性,attr和prop又有什么区别:

<input type="checkbox" checked id="i1" value="1" me="自定义属性">

执行以下代码:

$("#i1").attr("me")   // "自定义属性"
$("#i1").prop("me")  // undefined

可以看到prop不支持获取标签的自定义属性。

总结一下:

  1. 对于标签上有的能看到的属性和自定义属性都用attr
  2. 对于返回布尔值的比如checkbox、radio和option的是否被选中都用prop。

练习题:全选、反选、取消

文档处理

添加到指定元素内部的后面

$(A).append(B)// 把B追加到A
$(A).appendTo(B)// 把A追加到B

添加到指定元素内部的前面

$(A).prepend(B)// 把B前置到A
$(A).prependTo(B)// 把A前置到B

添加到指定元素外部的后面

$(A).after(B)// 把B放到A的后面
$(A).insertAfter(B)// 把A放到B的后面

添加到指定元素外部的前面

$(A).before(B)// 把B放到A的前面
$(A).insertBefore(B)// 把A放到B的前面

移除和清空元素

remove()// 从DOM中删除所有匹配的元素。
empty()// 删除匹配的元素集合中所有的子节点。

例子:

点击按钮在表格添加一行数据。

点击每一行的删除按钮删除当前行数据。

替换

replaceWith()
replaceAll()

克隆

clone()// 参数

克隆示例:

<!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>
    #b1 {
      background-color: deeppink;
      padding: 5px;
      color: white;
      margin: 5px;
    }
    #b2 {
      background-color: dodgerblue;
      padding: 5px;
      color: white;
      margin: 5px;
    }
  </style>
</head>
<body>

button id="b1"屠龙宝刀,点击就送/button
hr
button id="b2"屠龙宝刀,点击就送/button

script src="jquery-3.2.1.min.js"/script
script
  // clone方法不加参数true,克隆标签但不克隆标签带的事件
  ("#b1").on("click", function () {
    $(this).clone().insertAfter(this);
  });
  // clone方法加参数true,克隆标签并且克隆标签带的事件
  ("#b2").on("click", function () {
    $(this).clone(true).insertAfter(this);
  });
/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 中添加新函数时使用。

示例:

jQuery.fn.extend(object)

一个对象的内容合并到jQuery的原型,以提供新的jQuery实例方法。


单独写在文件中的扩展:


(function(jq){
jq.extend({
funcName:function(){
...
},
});
})(jQuery);



例子:

自定义的jQuery登录验证插件

 传参版插件:

登录校验示例

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


[![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0);)

HTML文件

![img](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)

"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(



## 框架

```html
    1、什么是框架
        框架是一个为了解决某些开放性问题而存在的一种结构。框架提供了最基本的功能,我们只需要在这些基本功能的基础上构建
自己的操作就可以了。
    2、框架的优点
    1、快速开发 - 基本功能已经提供好了
    2、可以解决大部分问题
    3、bug少,稳定性较高
    3、框架的分类
        1、前端框架
                处理前端内容(HTML,CSS,JS)
        2、后端框架
            处理服务器程序的
            Spring - Java
        3、全栈框架
                包含WEB整体的解决方案,包含开发框架,运行环境
                Rails (Ruby)
                Django(Python)
    4、Python的WEB框架
        1、Django :重量级的Python Web 框架
        2、Tornado :异步框架
        3、Flask :轻量级框架
        4、Webpy :轻量级框架
        5、Web2py :全栈框架,webpy的加强版

设计模式 与 框架模式

1、设计模式
    设计模式,是一套被反复使用,多数人知晓并经过分类的代码设计经验的总结,是为了解决一些通用性问题的
    目的:重用代码并保证代码的可靠性
    官方认证的设计模式有23种:单例模式,抽象工厂模式,观察者模式 -- 《大话设计模式》
2、框架模式
    代码的重用,框架模式是解决如何设计程序框架的代码,在框架模式中会包含多种的设计模式
    如:MVC,MTV,MVVM,ORM,... ...
    1、MVC
        M :Models,模型层
            在程序中主要处理数据,负责在数据库中对数据进行存取操作(CRUD)
        V :Views , 视图层
            应用程序中处理显示的部分内容(html,jsp)
        C :Controllers , 控制器层
            处理用户交互的部分,通常负责从模型中取出数据,再进行业务的处理,最后将数据给视图,并将视图给客户端
    2、MTV
        M :Models 模型层,功能同上
        T :Templates 模板层
            用于处理用户显示的部分内容,如:html
        V :Views 视图层
            处理用户交互部分,从模型中获取数据,再将数据给模板,再显示给用户

        M  ---  M
        V  ---  T
        C  ---  V
posted on 2019-12-17 17:11  luelue  阅读(129)  评论(0编辑  收藏  举报