• 6 Jun 18 jQuery


    6 Jun 18

    一、今日面试题(面向对象)

    1. 谈谈你对面向对象的理解?

       扩展方便;上帝视角,造一些对象(对象是特征与技能的结合体),让他们之间发生反应

    2. Python面向对象中的继承有什么特点?

       方便代码重用,可以多继承

    3. 面向对象深度优先和广度优先是什么?

       菱形继承的背景下,查找属性时:

       1、经典类:深度优先

       在python2中,A为经典类,F->D->B->A->E->C

       2、新式类:广度优先

       在python3中,A为新式类,F->D->B->E->C-A->object

    4. 面向对象中super的作用?

       A内super会基于C.mro()继续往后找;子代继承父代的方法

    5. 列举面向对象中特殊成员(带双下划线的特殊方法,如:__new__、__init__、__call__等)

       __new__  # 创建对象

       __init__  # 初始化对象

       __call__  # 调用对象

       __str__   # print打印一个对象时  __unicode__(python2中)

        __repr__  # 输入对象回车找的是__repr__; print先找__str__,没有__str__找__repr__

       __doc__  # 查看文档注释

       __getattr__

       __setattr__

       __del__  # 删除对象

    6. 静态方法和类方法区别?

      @staticmethod 不主动传值,只是一个单纯的函数

      @classmethod 类调用时,将类本身作为第一个参数传入

    7. 面向对象三大特性:封装、继承、多态

    二、作业讲解(新增,删除,取消)

    <!DOCTYPE html>

    <html lang="en">

    <head>

       <meta charset="UTF-8">

       <title>Title</title>

       <style>

           .cover {

               position: fixed;

               top: 0;

               right: 0;

               bottom: 0;

               left: 0;

               background-color: rgba(0,0,0,0.4);

               z-index: 9;

           }

           .modal {

               position: absolute;

               left:50%;

               top: 50%;

               height: 300px;

                400px;

               background-color: white;

               z-index: 10;

               margin-top: -150px;

               margin-left: -200px;

           }

           .hide {

               display: none;

           }

       </style>

       <script src="jquery-3.3.1.min.js"></script>

    </head>

    <body>

    <button id="add">add</button>

    <table border="1">

       <thead>

       <tr>

           <th>#</th>

           <th>NAME</th>

           <th>HOBBY</th>

           <th>OPERATION</th>

       </tr>

       </thead>

       <tbody>

       <tr>

           <td>1</td>

           <td>Egon</td>

           <td>Sing</td>

           <td>

               <input type="button" value="edit" class="edit">

               <input type="button" value="delete" class="delete">

           </td>

       </tr>

       <tr>

           <td>2</td>

           <td>Alex</td>

           <td>Dance</td>

           <td>

               <input type="button" value="edit" class="edit">

               <input type="button" value="delete" class="delete">

           </td>

       </tr>

       <tr>

           <td>3</td>

           <td>Yuan</td>

           <td>Speak</td>

           <td>

               <input type="button" value="edit" class="edit">

               <input type="button" value="delete" class="delete">

           </td>

       </tr>

       </tbody>

    </table>

    <div class="cover hide"></div>

    <div class="modal hide">

       <p><input type="text" id="username"></p>

       <p><input type="text" id="hobby"></p>

       <p>

           <button id="submit">submit</button>

           <button id="cancel">cancel</button>

       </p>

    </div>

    <script>

       // 定义一个隐藏模态框的函数

       function hideModel(){

           $(".cover,.modal").addClass("hide");

        }

       $("#add").click(function(){

           // 点击新增按钮要做的事儿

           // 1. 弹出模态框

           $(".cover,.modal").removeClass("hide");

       });

       $("#submit").click(function(){

           // 点击提交按钮要做的事儿

           // 1. 取值,取模态框中用户填写的值

           let username=$("#username").val();

           let hobby=$("#hobby").val();

           // 2. 隐藏模态框

           hideModel()

           // 3. 创建tr标签, 追加td, 要拼接序号和用户填写的信息

           let trELe=document.createElement("tr");

           let td1=document.createElement("td");

           td1.innerText=$("table tr").length;

           $(trELe).append(td1);

           let td2=document.createElement("td");

           td2.innerText=username;

           $(trELe).append(td2);

           let td3=document.createElement("td");

           td3.innerText=hobby;

           $(trELe).append(td3);

           // clone,不推荐使用clone;如果表中没有数据,没有可clone的对象

           // $("table td").last().clone().appendTo(trEle);

           let td4=document.createElement("td");

           td4.innerHTML =`

               <input type="button" value="edit" class="edit">

               <input type="button" value="delete" class="delete">

           `;

           $(trELe).append(td4);

           // 4. 追加到table tbody标签的最后

           $("tbody").append(trELe);

       });

       $("#cancel").on("click",function(){

           // 点击取消

            // 1. 把模态框隐藏

           hideModel();

           // 2. 把之前填写的清空掉

           $("#username,#hobby").val("");

       });

       // 如果不用委托,会导致新增的数据删除不了;这是因为绑定事件发生在最开始(刷新时),后续用js方法创建的对象的相应属性没有被绑定上该事件

       // 事件委托: 事件委托是通过事件冒泡的原理,利用父标签去捕获子标签的事件。

       // 事件冒泡:是从触发事件的那个节点一直到document,是自下而上的去触发事件。

        $("table").on("click",".delete",function(){

           // 删除按钮点击要做的事儿

           // 1.更新序号...

           // 把当前行后面的所有tr的第一个td的值-1

           let $currentTr=$(this).parent().parent();

           let $nextAllTr=$currentTr.nextAll();

           for (let i=0;i<$nextAllTr.length;i++){

               let n=$($nextAllTr[i]).children().first().text();

               $($nextAllTr[i]).children().first().text(n-1);

           }

           // 2. 把当前点击按钮所在的行 删掉

           $currentTr.remove();

       })

    </script>

    </body>

    </html>

    三、今日内容

    A. 常用事件

    1. hover

    应用: 导航条中,鼠标悬浮于购物车时显示购物车内容

    <!DOCTYPE html>

    <html lang="en">

    <head>

       <meta charset="UTF-8">

       <title>Title</title>

       <style>

           body {

               margin: 0;

           }

           .nav {

               height: 40px;

               background-color: #3d3d3d;

                100%;

           }

           ul {

               list-style-type: none;

               padding: 0;

               margin: 0;

           }

           a {

               text-decoration: none;

            }

           .nav a {

               color: #999;

           }

           .nav a:hover {

               color: white;

           }

           .nav li {

               float: left;

               height: 40px;

               line-height: 40px;

               margin-right: 15px;

               padding: 0 10px;

           }

           .nav li:hover {

               background-color: black;

           }

           .father {

               position:relative;

           }

           .son {

               height: 100px;

                200px;

               background-color: blue;

               color: white;

               position: absolute;

               left: 0;

               top: 40px;

               margin: 0;

               display: none;

           }

           .show {

               display: block;

           }

       </style>

       <script src="jquery-3.3.1.min.js"></script>

    </head>

    <body>

    <div class="nav">

       <ul>

           <li><a href="">login</a></li>

           <li><a href="">register</a></li>

           <li class="father"><a href="">shopping cart</a>

               <p class="son">None~</p>

           </li>

       </ul>

    </div>

    <script>

       // 鼠标移到.father 上时 让.son 添加一个.show

        // hover()接收两个参数,一个为鼠标悬浮的事件,一个为鼠标移除的事件

        $(".father").hover(

            function(){

               $(this).find(".son").addClass("show");

            },

            function(){

               $(this).find(".son").removeClass("show");

            }

        )

    </script>

    </body>

    </html>

    2. keydown和keyup

    3. change

    应用:批量操作(键盘按住shift,可以批量修改选中行的值)(含each的应用)

    <!DOCTYPE html>

    <html lang="en">

    <head>

       <meta charset="UTF-8">

       <title>Title</title>

       <script src="jquery-3.3.1.min.js"></script>

    </head>

    <body>

    <table border="1">

       <thead>

       <tr>

           <th>#</th>

           <th>name</th>

           <th>operation</th>

       </tr>

       </thead>

       <tbody>

       <tr>

           <td><input type="checkbox"></td>

           <td>Egon</td>

           <td>

               <select>

                    <option value="1">operation1</option>

                    <option value="2">operation2</option>

                    <option value="3">operation3</option>

               </select>

           </td>

       </tr>

       <tr>

           <td><input type="checkbox"></td>

           <td>Alex</td>

           <td>

               <select>

                    <option value="1">operation1</option>

                    <option value="2">operation2</option>

                    <option value="3">operation3</option>

               </select>

           </td>

       </tr>

       <tr>

           <td><input type="checkbox"></td>

           <td>Yuan</td>

           <td>

               <select>

                    <option value="1">operation1</option>

                    <option value="2">operation2</option>

                    <option value="3">operation3</option>

               </select>

           </td>

       </tr>

       <tr>

           <td><input type="checkbox"></td>

           <td>EvaJ</td>

           <td>

               <select>

                    <option value="1">operation1</option>

                    <option value="2">operation2</option>

                    <option value="3">operation3</option>

               </select>

           </td>

       </tr>

       <tr>

           <td><input type="checkbox"></td>

           <td>Gold</td>

           <td>

               <select>

                    <option value="1">operation1</option>

                    <option value="2">operation2</option>

                    <option value="3">operation3</option>

               </select>

           </td>

       </tr>

       </tbody>

    </table>

    <input type="button" id="b1" value="select all">

    <input type="button" id="b2" value="cancel">

    <input type="button" id="b3" value="select opposite">

    <script>

        let flag=false;

       // 如何获取用户按下那个按键

        // e表示事件本身;shift的keycode是16

        $(window).on("keydown",function(e){

            console.log(e.keyCode);

            if (e.keyCode===16){

                flag=true;

            }

        });

        // 绑定一个按键抬起的事件,将flag重置为false,即将批量修改的效果取消

        $(window).on("keyup",function(e){

            if(e.keyCode===16){

                flag=false;

            }

        });

        // 找到select标签 绑定change事件

       $("select").on("change",function () {

           // 拿到当前select标签的值

           let v=$(this).val();

           // 判断一下当前行是否被选中

           let isCheck=$(this).parent().parent().find("input:checkbox").prop("checked");

           // 如果是批量编辑模式,就要找到所有被选中的行,然后将其select置为和我一样的值

           // 如果shift被按住且被触发的确实被选中

           if (flag && isCheck){

               // 用for循环,找到所有被选中的行

               // let $allChecked=$("input:checked");

               // for (let i=0;i<$allChecked.length;i++){

               //    $($allChecked[i]).parent().parent().find("select").val(v);

               // }

               // 也可使用each循环

               $("input:checked").each(function () {

                   $(this).parent().parent().find("select").val(v);

                })

            }

           // 如果不是批量编辑模式,什么都不干

       });

       $("#b1").click(

           function(){

               $("table :checkbox").prop("checked",true);

           }

       );

       $("#b2").click(

           function(){

               $("table :checkbox").prop("checked",false);

           }

       );

       $("#b3").click(

           function(){

               var $checkboxs=$("table :checkbox")

               for (let i=0;i<$checkboxs.length;i++){

               current_checkbox=$checkboxs[i]

               $(current_checkbox).prop("checked",!$(current_checkbox).prop("checked"))

           }

        }

    )

    </script>

    </body>

    </html>

    4. focus和blur

    5. input

    应用:获取光标,移除光标,输入框内容变化(input)

    <!DOCTYPE html>

    <html lang="en">

    <head>

       <meta charset="UTF-8">

       <title>Title</title>

       <script src="jquery-3.3.1.min.js"></script>

    </head>

    <body>

    <input type="text" id="i1">

    <script>

        // 当input框获取焦点时触发

        $("#i1").on("focus",function(){

            console.log(123);

        });

        // 当input框失去焦点时触发

        $("#i1").on("blur",function(){

            console.log($(this).val());

        });

        // 当input框的值发生变化时触发

        $("#i1").on("input",function(){

            console.log($(this).val());

        })

    </script>

    </body>

    </html>

    B. 事件绑定的方式(详见前面例子)

    1. .click(function(){...})

    2. .on("事件名称", function(){...})  # 1,2效果等同

    3. 事件委托

        语法:

           .on("事件名称", "选择器", function(){...})

        特点:

           1. 利用事件冒泡的特点

           2. 基于一个已经存在的标签给未来的标签添加事件处理函数

    C. return false;阻止后续事件的执行

    应用:登陆注册示例

    <!DOCTYPE html>

    <html lang="en">

    <head>

       <meta charset="UTF-8">

       <title>登录注册示例</title>

       <style>

           .error {

               color: red;

           }

       </style>

    </head>

    <body>

    <form action="">

       <p>

           <label for="username">用户名</label>

           <input type="text" id="username" name="username">

           <span class="error"></span>

       </p>

       <p>

           <label for="pwd">密码</label>

           <input type="password" id="pwd" name="pwd">

           <span class="error"></span>

       </p>

       <p>

           <input type="submit" id="b1" value="登录">

       </p>

    </form>

    <script src="jquery-3.3.1.min.js"></script>

    <script>

       $("#b1").click(function () {

           var flag = true;

           $(".error").text("");

           var $username = $("#username");

           var $pwd = $("#pwd");

           // 取input框的值判断长度是否为0

           if ($username.val().length === 0){

               // 用户名没有输入, 提示

               $username.next().text("用户名不能为空!");

               flag = false;

           }

           if ($pwd.val().length === 0){

               // 用户名没有输入, 提示

               $pwd.next().text("密码不能为空!");

               flag = false;

           }

           return flag;  // 阻止后续事件的执行

       })

    </script>

    </body>

    </html>

    D. 页面加载完成后执行(ready)

    当DOM载入就绪可以查询及操纵时绑定一个要执行的函数。这是事件模块中最重要的一个函数,因为它可以极大地提高web应用程序的响应速度。

    1. 不用ready的话,可以将script放在body的最后面;否则报错
    2. 可以用ready,并将要执行的代码放入ready里
    3. 一般,我们会将代码放入ready,并将ready放在body的最后面

    ready的两种写法

    $(document).ready(function(){

    //在这里写你的JS代码...

    })

    $(function(){

    //你在这里写你的代码

    })  # 一般不用,要看懂

    应用:页面加载完执行

    <!DOCTYPE html>

    <html lang="en">

    <head>

       <meta charset="UTF-8">

       <title>页面加载完执行</title>

    </head>

    <body>

    <div id="d1">div</div>

    <script src="jquery-3.3.1.min.js"></script>

    <script>

        // ready的第一种写法

        $(document).ready(function () {

            var d1Ele = document.getElementById("d1");

            console.log(d1Ele);

            console.log(d1Ele.innerText);

        });

        

        // ready的第二种写法,一般不用,要看懂

       // $(function () {

      //     var d1Ele = document.getElementById("d1");

      //     console.log(d1Ele);

      //    console.log(d1Ele.innerText);

       // })

    </script>

    </body>

    </html>

    E. jQuery自带的动画效果(一般不用)

    // 基本

    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-3.3.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>

    F. 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是每次循环的具体元素。

    })

     

    .each(function(index, Element)):

    描述:遍历一个jQuery对象,为每个匹配元素执行一个函数。

    .each() 方法用来迭代jQuery对象中的每一个DOM元素。每次回调函数执行时,会传递当前循环次数作为参数(从0开始计数)。由于回调函数是在当前DOM元素为上下文的语境中触发的,所以关键字this 总是指向这个元素。

    // 为每一个li标签添加foo

    $("li").each(function(){

      $(this).addClass("c1");

    });

    在遍历过程中可以使用return false提前结束each循环。

    return只能结束本次循环,不能跳出each循环

    G. .data() (具体应用详见明天作业)

    $("div").data("k",100);  //给所有div标签都保存一个名为k,值为100

    $("div").data("k");  //返回第一个div标签中保存的"k"的值

    $("div").removeData("k");  //移除元素上存放k对应的数据

  • 相关阅读:
    Monkeyrunner环境搭建
    学习Monkeyrunner过程
    uiautomatorviewer使用报错
    安装JMeter
    如何测试网页的访问速度
    安装Android studio
    软件测试工程师具备技能
    WinRAR去除广告弹框(精华在末尾)
    android studio adb连接不上手机
    DOM的理解
  • 原文地址:https://www.cnblogs.com/zhangyaqian/p/py20180606.html
Copyright © 2020-2023  润新知