python运维开发(十七)----jQuery续(示例)web框架django

时间:2023-03-08 16:58:36
python运维开发(十七)----jQuery续(示例)web框架django

内容目录:

  • jQuery示例
  • 前端插件
  • web框架
  • Django框架

jQuery示例

  • dom事件绑定,dom绑定在form表单提交按钮地方都会绑定一个onclick事件,所有查看网站的人都能看到代码。
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Dom表单验证</title>
            <style>
            .item{
                width: 250px;
                height: 60px;
                position: relative;
            }
            .item input{
                width: 200px;
            }
            .item span{
                position: absolute;
                top: 20px;
                left: 0px;
                font-size: 8px;
                background-color: indianred;
                color: white;
                display: inline-block;
                width: 200px;
            }
        </style>
    </head>
    <body>
      <div>
            <form>
                <div class="item">
                    <input class="c1" type="text" name="username" label="用户名"/>
                    <!--<span>用户名不能为空</span>-->
                </div>
                <div class="item">
                    <input  class="c1" type="password" name="pwd" label="密码"/>
                    <!--<span>密码不能为空</span>-->
                </div>
                <input type="submit" value="提交" onclick="return CheckValid();" />
            </form>
        </div>
        <script src="jquery-1.12.4.js"></script>
        <script>
            $('form .c1 span').remove();
            function CheckValid() {
                //找到form标签下的所有需要验证的标签
                //$('form .c1')
                //$('form input[type="text"],form input[type="password"]')
                //循环所有需要验证的标签,获取内容
                var flag = true;
                $('form .c1').each(function () {
                    //每一个元素执行匿名函数
                    //this
                    //console.log(this,$(this));
                    var val = $(this).val();
                    if (val.length <=0 ){
                        var label = $(this).attr('label');
                        var tag = document.createElement('span');
                        tag.innerText=label+"不能为空";
                        $(this).after(tag);
                        flag=false;
                        return false;
                    }
                });
                return flag;
            }
        </script>
    
    </body>
    </html>

    dom表单提交事件绑定demo

  • jQuery事件绑定,使用jquery方式绑定的事件通过浏览器的调试模式也看不到绑定的事件,使网站的代码更安全。
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>jQuery表单验证</title>
            <style>
            .item{
                width: 250px;
                height: 60px;
                position: relative;
            }
            .item input{
                width: 200px;
            }
            .item span{
                position: absolute;
                top: 20px;
                left: 0px;
                font-size: 8px;
                background-color: indianred;
                color: white;
                display: inline-block;
                width: 200px;
            }
        </style>
    </head>
    <body>
      <div>
            <form>
                <div class="item">
                    <input class="c1" type="text" name="username" label="用户名"/>
                    <!--<span>用户名不能为空</span>-->
                </div>
                <div class="item">
                    <input  class="c1" type="password" name="pwd" label="密码"/>
                    <!--<span>密码不能为空</span>-->
                </div>
                <input type="submit" value="提交"  />
            </form>
        </div>
        <script src="jquery-1.12.4.js"></script>
        <script>
            $(function () {
                //当页面框架加载完成之后,自动执行
               BindCheckValid();
            });
            function BindCheckValid() {
                $('form :submit').click(function () {
                    var flag=true;
                    //只要一点击submit按钮,执行此处内容,找到form标签下的所有需要匹配的标签
                    $('form .item span').remove();
                    $('form .c1').each(function () {
                         //每一个元素执行匿名函数
                        //this
                        //console.log(this,$(this));
                        var val = $(this).val();
                        if (val.length <=0 ){
                            var label = $(this).attr('label');
                            var tag = document.createElement('span');
                            tag.innerText=label+"不能为空";
                            $(this).after(tag);
                            flag=false;
                            return false;
                        }
                });
    
                return flag;
                })
            }
    
        </script>
    
    </body>
    </html>

    jQuery表单提交事件绑定demo

  • jQuery循环break,在jQuery中return false 表示中断循环
    $.each([11,22,33,44],function(k,v){
    if(v == 22){
    //return ; // continue
    return false; //break
    }
    console.log(v);
  • jQuery扩展方法
    • jQuery.extend(object):扩展jQuery对象本身
      //在jQuery命名空间上增加两个函数
      jQuery.extend({
        min: function(a, b) { return a < b ? a : b; },
        max: function(a, b) { return a > b ? a : b; }
      });
      //调用方式
      $.min(2,3); // => 2
      $.max(4,5); // => 5
    • jQuery.fn.extend(object):扩展 jQuery 元素集来提供新的方法(通常用来制作插件)
      //增加两个插件方法
      jQuery.fn.extend({
        check: function() {
          return this.each(function() { this.checked = true; });
        },
        uncheck: function() {
          return this.each(function() { this.checked = false; });
        }
      });
      //调用方式
      $("input[type=checkbox]").check();
      $("input[type=radio]").uncheck();
  • jQuery自定义扩展的方法
  • <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>jquery扩展</title>
    </head>
    <body>
    <script src="jquery-1.12.4.js"></script>
    <script src="extend1.js"></script>
    <script>
        $.jabe1('123');
    </script>
    </body>
    </html>

    HTML代码

    //普通函数方式
    a = function(jq){
        jq.extend({
            'jabe1': function(arg){
                console.log(arg);
                alert(arg);
            }
        });
    
        function f1(){
    
        }
    };
    a(jQuery);
    //自执行函数方式
    (function (jq) {
        jq.extend({
                'jabe1':function(arg) {
                    // console.log(arg);
                    alert(arg);
                }
            });
    })(jQuery);    

    js代码

  • jQuery扩展实现基本验证
    • 支持是否为空验证
    • 文本长度验证
    • 正则匹配验证
      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>输入文本长度和手机号验证</title>
          <style>
              .item{
                  width: 250px;
                  height: 60px;
                  position: relative;
              }
              .item input{
                  width: 200px;
              }
              .item span{
                  position: absolute;
                  top: 20px;
                  left: 0px;
                  font-size: 8px;
                  background-color: indianred;
                  color: white;
                  display: inline-block;
                  width: 200px;
              }
          </style>
      </head>
      <body>
      
          <div>
              <form id="form1">
                  <div class="item">
                      <input class="c1" type="text" name="username" label="用户名" require="true" min-len="6"/>
                  </div>
                  <div class="item">
                      <input  class="c1" type="password" name="pwd" label="密码"/>
                  </div>
                  <div class="item">
                      <input  class="c1" type="text" name="phone" label="手机" require="true" phone="true"/>
                  </div>
                  <input type="submit" value="提交" />
              </form>
      
          </div>
      
          <script src="jquery-1.12.4.js"></script>
          <script src="commons.js"></script>
          <script>
              $(function(){
                  $.valid('#form1');
              });
      
          </script>
      </body>
      </html>

      手机号和长度匹配验证demo-HTML代码

      (function(jq){
      
          function ErrorMessage(inp,message){
              var tag = document.createElement('span');
              tag.innerText = message;
              inp.after(tag);
          }
      
          jq.extend({
              valid:function(form){
                  // #form1 $('#form1')
                  jq(form).find(':submit').click(function(){
      
                      jq(form).find('.item span').remove();
      
                      var flag = true;
                      jq(form).find(':text,:password').each(function(){
      
                          var require = $(this).attr('require');
                          if(require){
                              var val = $(this).val();
      
                              if(val.length<=0){
                                  var label = $(this).attr('label');
                                  ErrorMessage($(this),label + "不能为空");
                                  flag = false;
                                  return false;
                              }
      
                              var minLen = $(this).attr('min-len');
                              if(minLen){
                                  var minLenInt = parseInt(minLen);
                                  if(val.length<minLenInt){
                                      var label = $(this).attr('label');
                                      ErrorMessage($(this),label + "长度最小为"+ minLen);
                                      flag = false;
                                      return false;
                                  }
                                  //json.stringify()
                                  //JSON.parse()
                              }
      
                              var phone = $(this).attr('phone');
                              if(phone){
                                  // 用户输入内容是否是手机格式
                                  var phoneReg = /^1[3|5|8]\d{9}$/;
                                  if(!phoneReg.test(val)){
                                      var label = $(this).attr('label');
                                      ErrorMessage($(this),label + "格式错误");
                                      flag = false;
                                      return false;
                                  }
                              }
      
                              // 1、html自定义标签属性
                              // 增加验证规则+错误提示
      
                          }
                          // 每一个元素执行次匿名函数
                          // this
                          //console.log(this,$(this));
                          /*
                          var val = $(this).val();
                          if(val.length<=0){
                              var label = $(this).attr('label');
                              var tag = document.createElement('span');
                              tag.innerText = label + "不能为空";
                              $(this).after(tag);
                              flag = false;
                              return false;
                          }
                          */
                      });
      
                      return flag;
                  });
              }
          });
      })(jQuery);

      手机号和长度匹配验证demo-js代码

正则匹配

1、定义正则表达式

  • /.../  用于定义正则表达式
  • /.../g 表示全局匹配,类似生成器,每次执行exec取一个结果,全部匹配完成后返回null
  • /.../i 表示不区分大小写
  • /.../m 表示多行匹配
    JS正则匹配时本身就是支持多行,此处多行匹配只是影响正则表达式^和$,m模式也会使用^$来匹配换行的内容)
    var pattern = /^Java\w*/gm;
    var text = "JavaScript is more fun than \nJavaEE or JavaBeans!";
    result = pattern.exec(text)
    result = pattern.exec(text)
    result = pattern.exec(text)
    

    注:定义正则表达式也可以  reg= new RegExp()

2、匹配,JavaScript中支持正则表达式,其主要提供了两个功能:

  • test(string)     检查字符串中是否和正则匹配
    n = 'uui99sdf'
    reg = /\d+/
    reg.test(n)  ---> true
    
    # 只要正则在字符串中存在就匹配,如果想要开头和结尾匹配的话,就需要在正则前后加 ^和$ 
  • exec(string)    获取正则表达式匹配的内容,如果未匹配,值为null,否则,获取匹配成功的数组
    //获取正则表达式匹配的内容,如果未匹配,值为null,否则,获取匹配成功的数组。
    
    //非全局模式
    //获取匹配结果数组,注意:第一个元素是第一个匹配的结果,后面元素是正则子匹配(正则内容分组匹配)
        var pattern = /\bJava\w*\b/;
        var text = "JavaScript is more fun than Java or JavaBeans!";
        result = pattern.exec(text)
    
        var pattern = /\b(Java)\w*\b/;
        var text = "JavaScript is more fun than Java or JavaBeans!";
        result = pattern.exec(text)
    
    //全局模式
    //需要反复调用exec方法,来一个一个获取结果,直到匹配获取结果为null表示获取完毕
        var pattern = /\bJava\w*\b/g;
        var text = "JavaScript is more fun than Java or JavaBeans!";
        result = pattern.exec(text)
    
        var pattern = /\b(Java)\w*\b/g;
        var text = "JavaScript is more fun than Java or JavaBeans!";
        result = pattern.exec(text)

3、字符串中相关方法

obj.search(regexp)  //获取索引位置,搜索整个字符串,返回匹配成功的第一个位置(g模式无效)
obj.match(regexp)   // 获取匹配内容,搜索整个字符串,获取找到第一个匹配内容,如果正则是g模式找到全部
obj.replace(regexp, replacement)  //替换匹配替换,正则中有g则替换所有,否则只替换第一个匹配项,
$数字:匹配的第n个组内容;
$&:当前匹配的内容;
$`:位于匹配子串左侧的文本;
$':位于匹配子串右侧的文本
$$:直接量$符号
var text = "JavaScript is more fun than Java or JavaBeans!";

text.search(/\b(Java)\w*\b/g)

0//结果返回第一个的位置

text.match(/\b(Java)\w*\b/g)

["JavaScript", "Java", "JavaBeans"]//返回匹配的所有存放在列表中

text.replace('Java','Python')

"PythonScript is more fun than Java or JavaBeans!"//Java替换为Python

滚动菜单实例

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>

        body{
            margin: 0px;
        }
        img {
            border: 0;
        }
        ul{
            padding: 0;
            margin: 0;
            list-style: none;
        }
        .clearfix:after {
            content: ".";
            display: block;
            height: 0;
            clear: both;
            visibility: hidden;
        }

        .wrap{
            width: 980px;
            margin: 0 auto;
        }

        .pg-header{
            background-color: #303a40;
            -webkit-box-shadow: 0 2px 5px rgba(0,0,0,.2);
            -moz-box-shadow: 0 2px 5px rgba(0,0,0,.2);
            box-shadow: 0 2px 5px rgba(0,0,0,.2);
        }
        .pg-header .logo{
            float: left;
            padding:5px 10px 5px 0px;
        }
        .pg-header .logo img{
            vertical-align: middle;
            width: 110px;
            height: 40px;

        }
        .pg-header .nav{
            line-height: 50px;
        }
        .pg-header .nav ul li{
            float: left;
        }
        .pg-header .nav ul li a{
            display: block;
            color: #ccc;
            padding: 0 20px;
            text-decoration: none;
            font-size: 14px;
        }
        .pg-header .nav ul li a:hover{
            color: #fff;
            background-color: #425a66;
        }
        .pg-body{

        }
        .pg-body .catalog{
            position: absolute;
            top:60px;
            width: 200px;
            background-color: #fafafa;
            bottom: 0px;
        }
        .pg-body .catalog.fixed{
            position: fixed;
            top:10px;
        }

        .pg-body .catalog .catalog-item.active{
            color: #fff;
            background-color: #425a66;
        }

        .pg-body .content{
            position: absolute;
            top:60px;
            width: 700px;
            margin-left: 210px;
            background-color: #fafafa;
            overflow: auto;
        }
        .pg-body .content .section{
            height: 500px;
        }
    </style>
</head>
<body>

    <div class="pg-header">
        <div class="wrap clearfix">
            <div class="logo">
                <a href="#">
                    <img src="">
                </a>
            </div>
            <div class="nav">
                <ul>
                    <li>
                        <a  href="#">首页</a>
                    </li>
                    <li>
                        <a  href="#">功能一</a>
                    </li>
                    <li>
                        <a  href="#">功能二</a>
                    </li>
                </ul>
            </div>

        </div>
    </div>

    <div class="pg-body">
        <div class="wrap">
            <div class="catalog">
                <div class="catalog-item" auto-to="function1"><a>第1张</a></div>
                <div class="catalog-item" auto-to="function2"><a>第2张</a></div>
                <div class="catalog-item" auto-to="function3"><a>第3张</a></div>
            </div>

            <div class="content">
                <div menu="function1" class="section" style='background-color:green;'>
                    <h1>第一章</h1>
                </div>
                <div menu="function2" class="section" style='background-color:yellow;'>
                    <h1>第二章</h1>
                </div>
                <div menu="function3" class="section" style='background-color:red;'>
                    <h1>第三章</h1>
                </div>
            </div>
        </div>

    </div>

    <script type="text/javascript" src="jquery-1.8.2.min.js"></script>
    <script type="text/javascript">

        $(function(){
            // 自动执行
            Init();
        });

        function Init(){

            $(window).scroll(function() {
                // 监听窗口滚动事件

                // 获取滚动条高度
                var scrollTop = $(window).scrollTop();

                // 当滚动到50像素时,左侧带菜单固定
                if(scrollTop > 50){
                    $('.catalog').addClass('fixed');
                }else{
                    $('.catalog').children().removeClass('active');
                    $('.catalog').removeClass('fixed');
                }

                // 循环所有的内容
                $('.content').children().each(function(){
                    // 当前标签距离顶部高度
                    var offSet = $(this).offset(); // 高度,左边有多远
                    // offSet.top
                    // offSet.left

                    // 自身高度
                    var height = $(this).height();

                    //offSet<滚动高度<offSet+height

                    // 当前内容位于用户阅览区
                    if(scrollTop>offSet.top && scrollTop< offSet.top + height){
                        // $(this) 当前内容标签
                        /*
                        var target = $(this).attr('menu');
                        $('.catalog').find('div[auto-to="'+target+'"]').addClass('active').siblings().removeClass('active');
                        return false;
                        */

                        var docHeight = $(document).height();
                        var winHeight = $(window).height();
                        // 如果,滚轮到达底部,则显示最后一个菜单
                        if(docHeight == winHeight+scrollTop)
                        {
                            $('.catalog').find('div:last-child').addClass('active').siblings().removeClass('active');
                        }else{
                            var target = $(this).attr('menu');
                            $('.catalog').find('div[auto-to="'+target+'"]').addClass('active').siblings().removeClass('active');
                        }
                        return false;

                    }
                });

            });

        }

    </script>
</body>
</html>

滚动菜单--demo

注:以上demo需要下载jquery,配合使用

前端插件

  • fontawsome 小图片插件
  • easyui 基于jQuery的UI插件集合体
  • jqueryui 是jQuery插件,专指由jQuery官方维护的UI方向的插件
  • bootstrap 模板使用
    • -- 引入css
    • -- 引入jQuery(2.x,1.12)
    • -- 引入js
  • bxslider 滚动图片插件
  • jquery.lazyload 延迟加载图片滚动多少加载多少
     <!DOCTYPE html>
     <html>
     <head lang="en">
         <meta charset="UTF-8">
         <title></title>
         <style>
             body{
                 margin: 0 auto;
             }
             .pg-header{
                 height: 48px;
                 background-color: #3b5998;
             }
             .w{
                 width: 980px;
                 margin: 0 auto;
             }
             .clearfix:after{
                 clear: both;
                 content: '.';
                 visibility: hidden;
                 height: 0;
                 display: block;
             }
             .product-list .item{
                 float: left;
                 height: 240px;
                 width: 184px;
                 overflow: hidden;
                 border: 1px solid red;
                 padding: 5px;
             }
             .product-list .item .lazy{
    
                 height: 200px;
                 width: 184px;
             }
         </style>
     </head>
     <body>
         <div class="pg-header"></div>
         <div class="pg-body">
             <div class="w">
                 <div class="product-list clearfix">
                     <div class="item">
                         <img class="lazy" data-original="img/1.png"/>
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/2.png" />
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/3.png"/>
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/4.png"/>
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/5.png"/>
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/6.png" />
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/7.png"/>
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/8.png"/>
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/9.png" />
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/10.png" />
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/11.png"/>
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/12.png"/>
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/13.png"/>
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/14.png" />
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/15.png" />
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/16.png" />
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/17.png" />
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/1.png"/>
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/2.png" />
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/3.png"/>
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/4.png"/>
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/5.png"/>
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/6.png" />
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/7.png"/>
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/8.png"/>
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/9.png" />
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/10.png" />
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/11.png"/>
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/12.png"/>
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/13.png"/>
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/14.png" />
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/15.png" />
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/16.png" />
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/17.png" />
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/1.png"/>
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/2.png" />
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/3.png"/>
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/4.png"/>
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/5.png"/>
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/6.png" />
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/7.png"/>
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/8.png"/>
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/9.png" />
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/10.png" />
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/11.png"/>
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/12.png"/>
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/13.png"/>
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/14.png" />
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/15.png" />
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/16.png" />
                     </div>
                     <div class="item">
                         <img class="lazy" data-original="img/17.png" />
                     </div>
    
                 </div>
             </div>
             </div>
         <div class="pg-footer"></div>
    
         <script src="js/jquery-1.12.4.js"></script>
         <script src="js/jquery.lazyload.js"></script>
         <script>
             $(function(){
                 $('img.lazy').lazyload({
                     //container: $('.product-list'),   // 对指定标签对象内的图片实现效果,表示在此标签中滚动时,触发加载(注意:如果容器未设置height和overfload:auto,那么会默认加载所有图片)
                     threshold: 100,                    //当图片顶部距离显示区域还有100像素时,就开始加载
                     placeholder : "img/grey.gif",      // 图片未加载时,占位
                     effect: "slideDown",               // 图片出现的效果,值有show(直接显示),fadeIn(淡入),slideDown(下拉)
                     effect_speed: 1000,                // 效果出现的时间
                     event: 'scroll',                   // 滚动滚轮时触发,可以是:click、mouseover等
                     data_attribute: 'original',        // img标签中保存url的自定义属性,默认:data-original
                     skip_invisible: true,              // 是否跳过已经隐藏的图片(display:none)
                     failure_limit: 2,                  // 由于延迟加载是根据Dom从上到下执行
                                                        // 如果遇到Dom位置在上,但是图片定位在下导致看不到,那么会以为之后的图片不在应用延迟加载
                                                        // 此处的failure_limit用于限制如果出现N个【Dom位置在上,但是图片定位在下】才终止
                     appear: function(){                // 当图片位置刚出现在视图时,触发此事件
                         $(this).attr('src');
                     },
                     load: function(){                  // 当图片路径加载之后,触发此事件
                         $(this).attr('src');
                     }
    
                 });
             })
         </script>
     </body>
     </html>

    lazyload--demo_HTML

    $(function(){
        $('img.lazy').lazyload({
            //container: $('.product-list'),   // 对指定标签对象内的图片实现效果,表示在此标签中滚动时,触发加载(注意:如果容器未设置height和overfload:auto,那么会默认加载所有图片)
            threshold: 100,                    //当图片顶部距离显示区域还有100像素时,就开始加载
            placeholder : "img/grey.gif",      // 图片未加载时,占位
            effect: "slideDown",               // 图片出现的效果,值有show(直接显示),fadeIn(淡入),slideDown(下拉)
            effect_speed: 1000,                // 效果出现的时间
            event: 'scroll',                   // 滚动滚轮时触发,可以是:click、mouseover等
            data_attribute: 'original',        // img标签中保存url的自定义属性,默认:data-original
            skip_invisible: true,              // 是否跳过已经隐藏的图片(display:none)
            failure_limit: 2,                  // 由于延迟加载是根据Dom从上到下执行
                                               // 如果遇到Dom位置在上,但是图片定位在下导致看不到,那么会以为之后的图片不在应用延迟加载
                                               // 此处的failure_limit用于限制如果出现N个【Dom位置在上,但是图片定位在下】才终止
            appear: function(){                // 当图片位置刚出现在视图时,触发此事件
                $(this).attr('src');
            },
            load: function(){                  // 当图片路径加载之后,触发此事件
                $(this).attr('src');
            }
    
        });
    })

    参数说明

    源码下载

web框架

对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端。

WEB框架前面有WSGI或者是自己写的SOCKET,然后交给URL路由系统处理,然后交给某个函数或某个类,然后在模板里拿到模板然后模板和数据进行混合然后返回给用户!

WSGI用来接收请求,然后封装请求。对于Django来说都封装到了request里面。

MVC/MTV架构的不同主要是他们处理请求不同内容来放到不同的目录

请求周期
处理用户请求    放置HTML模版    操作数据库
Controllers      Views       Modals

Views        Template     Modals

其中Django属于MTV架构

Django框架

1、安装

pip3 install django

2、创建项目(前提环境变量配置好)

django-admin startproject HelloWorld

pycharm中可以直接进行创建project选择django项目

3、创建应用

python3 manage.py startapp cmdb

4、修改urls

from cmdb import views

url(r'^index/', views.index),

5、添加index函数在views

from django.shortcuts import HttpResponse

def index(request):

return HttpResponse("Hello World")

6、启动django

python manage.py runserver 127.0.0.1:8000

在pycharm中可以直接点击启动,访问http://127.0.0.1:8000/index/

7、修改setting中添加默认模板位置配置

TEMPLATES

'DIRS': [os.path.join(BASE_DIR, 'templates')],

项目目录下面添加创建templates目录,如果存在则不用创建,再在templates下创建index.html

8、 访问html文件

views下面用render返回

from django.shortcuts import render

def index(request):

return render(request,'index.html')

重新启动访问http://127.0.0.1:8000/index/就能看到index.html中的内容了

9、配置静态文件目录js、css、图片等目录

setting中最后添加如下配置

STATICFILES_DIRS = (
os.path.join(BASE_DIR,"statics"),
)

配置之后在项目project的目录下添加statics目录,并将jquery文件放入到该目录

STATIC_URL = '/static/' 表示引用的前缀

index.html中调用jquery地址如下:

<script src="/statics/jquery-1.12.4.js"></script>

10、浏览网页时候点击提交提示403的报错,需要将如下注释掉

MIDDLEWARE_CLASSES
  #'django.middleware.csrf.CsrfViewMiddleware',

由于版本不同, MIDDLEWARE_CLASSES可能不相同,只需要注释'django.middleware.csrf.CsrfViewMiddleware',这一行即可

11、配置提交的请求views,获取提交上来的数据并处理views

# 处理用户请求
USER_INPUT = [
    {'user':'u1', 'email': 'e1'},
    {'user':'u2', 'email': 'e2'},
]

def index(request):
    # ...
    # 判断用户是否是POST请求
    if(request.method == 'POST'):
        user = request.POST.get('user',None)
        email = request.POST.get('email',None)
        temp = {'user': user, 'email': email}
        USER_INPUT.append(temp)
        # request.POST.get('pwd',None)

    # return HttpResponse('123')
    # 模版引擎
    # 获取index.html模版 + {'data': USER_INPUT } ==》 渲染
    # 字符串
    return render(request, 'index.html', {'data': USER_INPUT })

# def index(request):
#     # return HttpResponse("Hello World")
#     return  render(request,'index.html')

views配置

12、在实际的环境中我们需要将提交和读取的数据放到数据库中的,相关sqllite配置如下:

  • views配置,获取收到的数据和返回处理后的数据,setting中注册APP(在settings里面注册,如果没有注册不能忘记要不然不能创建数据表)
    from django.shortcuts import render
    from django.shortcuts import HttpResponse
    from cmdb import  models
    
    # Create your views here.
    # 处理用户请求
    
    def index(request):
        # ...
        # 判断用户是否是POST请求
        if(request.method == 'POST'):
            # user = request.POST.get('user',None)
            # email = request.POST.get('email',None)
            u = request.POST.get('user',None)
            e = request.POST.get('email',None)
            models.UserInfo.objects.create(user=u,email=e)
    
        data_list = models.UserInfo.objects.all()
    
        return render(request, 'index.html', {'data': data_list })

    views配置

  • //INSTALLED_APPS 中添加创建的应用名称
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'cmdb'
    ]

    setting配置

  • from django.db import models
    
    # Create your models here.
    
    class UserInfo(models.Model):
        user = models.CharField(max_length=32)
        email = models.CharField(max_length=32)

    models配置

    models配置完之后需要执行创建表,两条命令

    python3 manage.py makemigrations
    python3 manage.py migrate 读取这个数据库结构生成数据库表,执行之后在应用名/migrations/0001_initial.py这个文件

  • 重新启动就能看到效果了,将所有读取和写入的数据都进入到sqllite中了,不会重启之后数据就显示不出来了。

13、在实际应用中可能会涉及到跳转,django配置跳转的话

在views配置导入模块from django.shortcuts import redirect

返回跳转后的地址,可以是外部的地址也可以是自己做的页面地址return redirect('http://baidu.com')