zoukankan      html  css  js  c++  java
  • 复习第一天内容

    短信验证码写法 一般购买厂商都可以找下 

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
      <script src="./js/jquery.js"></script>
    </head>
    <body>
       手机号 :<input id="phone" type="tel"> <button id='btn'>60s倒计时手机验证码</button>
       <script>
        //  点击按钮  把手机号  发送ajax  到后台 
           document.querySelector('#btn').onclick=function(){
                let phone=$("#phone").val()
                $.ajax({
                   url:"./php/duanxinyanzhengma.php",
                   type:"get",
                   data:{
                     phone:phone
                   },
                   success:function(res){
                        console.log('res',res)
                   }
                })
           }
       </script>
    </body>
    </html>
    View Code

    滑动验证码

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>大图模式</title>
        <style>
            body {
                margin: 50px 0;
                text-align: center;
                font-family: "PingFangSC-Regular", "Open Sans", Arial, "Hiragino Sans GB", "Microsoft YaHei", "STHeiti", "WenQuanYi Micro Hei", SimSun, sans-serif;
            }
    
            .inp {
                border: 1px solid #cccccc;
                border-radius: 2px;
                padding: 0 10px;
                width: 278px;
                height: 40px;
                font-size: 18px;
            }
    
            .btn {
                display: inline-block;
                box-sizing: border-box;
                border: 1px solid #cccccc;
                border-radius: 2px;
                width: 100px;
                height: 40px;
                line-height: 40px;
                font-size: 16px;
                color: #666;
                cursor: pointer;
                background: white linear-gradient(180deg, #ffffff 0%, #f3f3f3 100%);
            }
    
            .btn:hover {
                background: white linear-gradient(0deg, #ffffff 0%, #f3f3f3 100%)
            }
    
            #captcha {
                width: 300px;
                display: inline-block;
            }
    
            label {
                vertical-align: top;
                display: inline-block;
                width: 80px;
                text-align: right;
            }
    
            #text {
                height: 42px;
                width: 298px;
                text-align: center;
                border-radius: 2px;
                background-color: #F3F3F3;
                color: #BBBBBB;
                font-size: 14px;
                letter-spacing: 0.1px;
                line-height: 42px;
            }
    
            #wait {
                display: none;
                height: 42px;
                width: 298px;
                text-align: center;
                border-radius: 2px;
                background-color: #F3F3F3;
            }
    
            .loading {
                margin: auto;
                width: 70px;
                height: 20px;
            }
    
            .loading-dot {
                float: left;
                width: 8px;
                height: 8px;
                margin: 18px 4px;
                background: #ccc;
    
                -webkit-border-radius: 50%;
                -moz-border-radius: 50%;
                border-radius: 50%;
    
                opacity: 0;
    
                -webkit-box-shadow: 0 0 2px black;
                -moz-box-shadow: 0 0 2px black;
                -ms-box-shadow: 0 0 2px black;
                -o-box-shadow: 0 0 2px black;
                box-shadow: 0 0 2px black;
    
                -webkit-animation: loadingFade 1s infinite;
                -moz-animation: loadingFade 1s infinite;
                animation: loadingFade 1s infinite;
            }
    
            .loading-dot:nth-child(1) {
                -webkit-animation-delay: 0s;
                -moz-animation-delay: 0s;
                animation-delay: 0s;
            }
    
            .loading-dot:nth-child(2) {
                -webkit-animation-delay: 0.1s;
                -moz-animation-delay: 0.1s;
                animation-delay: 0.1s;
            }
    
            .loading-dot:nth-child(3) {
                -webkit-animation-delay: 0.2s;
                -moz-animation-delay: 0.2s;
                animation-delay: 0.2s;
            }
    
            .loading-dot:nth-child(4) {
                -webkit-animation-delay: 0.3s;
                -moz-animation-delay: 0.3s;
                animation-delay: 0.3s;
            }
    
            @-webkit-keyframes loadingFade {
                0% { opacity: 0; }
                50% { opacity: 0.8; }
                100% { opacity: 0; }
            }
    
            @-moz-keyframes loadingFade {
                0% { opacity: 0; }
                50% { opacity: 0.8; }
                100% { opacity: 0; }
            }
    
            @keyframes loadingFade {
                0% { opacity: 0; }
                50% { opacity: 0.8; }
                100% { opacity: 0; }
            }
    
        </style>
    </head>
    <body>
    <h2><a href="./">返回</a></h2>
    <h1>大图模式</h1>
    <form id="form">
        <div>
            <label for="username">用户名:</label>
            <input class="inp" id="username" type="text" value="用户名">
        </div>
        <br>
        <div>
            <label for="password">密码:</label>
            <input class="inp" id="password" type="password" value="123456">
        </div>
        <br>
        <div>
            <label>完成验证:</label>
            <div id="captcha">
                <div id="text">
                    行为验证™ 安全组件加载中
                </div>
                <div id="wait" class="show">
                    <div class="loading">
                        <div class="loading-dot"></div>
                        <div class="loading-dot"></div>
                        <div class="loading-dot"></div>
                        <div class="loading-dot"></div>
                    </div>
                </div>
            </div>
        </div>
        <br>
        <div id="btn" class="btn">提交</div>
    </form>
    
    <!-- 注意,验证码本身是不需要 jquery 库,此处使用 jquery 仅为了在 demo 中使用,减少代码量 -->
    <script src="./js/jquery.js"></script>
    <!-- 引入 gt.js,既可以使用其中提供的 initGeetest 初始化函数。为防劫持,强烈建议将此文件放在客户服务器!!!-->
    <script src="js/gt.js"></script>
    <script>
    
    
        var handler = function (captchaObj) {
            captchaObj.appendTo('#captcha');
            captchaObj.onReady(function () {
                $("#wait").hide();
            });
            $('#btn').click(function () {
                var result = captchaObj.getValidate();
                if (!result) {
                    return alert('请完成验证');
                }
                $.ajax({
                    url: 'gt/validate-click',
                    type: 'POST',
                    dataType: 'json',
                    data: {
                        username: $('#username2').val(),
                        password: $('#password2').val(),
                        geetest_challenge: result.geetest_challenge,
                        geetest_validate: result.geetest_validate,
                        geetest_seccode: result.geetest_seccode
                    },
                    success: function (data) {
                        if (data.status === 'success') {
                            alert('登录成功');
                        } else if (data.status === 'fail') {
                            alert('登录失败,请完成验证');
                            captchaObj.reset();
                        }
                    }
                });
            })
            // 更多前端接口说明请参见:http://docs.geetest.com/install/client/web-front/
        };
        // 引入 gt.js  发送ajax 去配置 滑动验证码 
        $.ajax({
            url: "http://www.geetest.com/demo/gt/register-click?t=" + (new Date()).getTime(), // 加随机数防止缓存
            type: "get",
            dataType: "json",
            success: function (data) {
                $('#text').hide();
                $('#wait').show();
    
                // 调用 initGeetest 进行初始化
                // 参数1:配置参数
                // 参数2:回调,回调的第一个参数验证码对象,之后可以使用它调用相应的接口
                initGeetest({
                    // 以下 4 个配置参数为必须,不能缺少
                    gt: data.gt,
                    challenge: data.challenge,
                    offline: !data.success, // 表示用户后台检测极验服务器是否宕机
                    new_captcha: data.new_captcha, // 用于宕机时表示是新验证码的宕机
    
                    product: "popup", // 产品形式,包括:float,popup
                     "300px",
                    https: true
    
                    // 更多前端配置参数说明请参见:http://docs.geetest.com/install/client/web-front/
                }, handler);
            }
        });
    
    </script>
    </body>
    </html>
    View Code

    es5与ES6中的class语法

      // 构造函数
      // function Person(){
      //     this.name='建林'
      //     this.age=18
      //     this.say=function(){
      //       console.log('person的say')
      //     }
      // }
      // let p1=new Person()
      // console.log(p1.name)
      // p1.say()
      // class 新es6语法  就是 构造函数的 另一种新写法 语法糖
      class Person{
          constructor(){
             this.name='建林'
             this.age=18
          }
    
          say() {
            console.log('person的say')
          }
      }
      // let p2=new Person()
      // console.log(p2.name)
      // p2.say()
      // class 子 extends 父 {
    
      // }
      class Teacher extends Person{
        // // 复杂写法 
        // constructor(){
        //     //constructor 在this之前 一定要写super()
        //     super();// 调用 父亲的 constructor
        //     this.name='思聪'
        //     this.score=10000
        // }
        // 简单写法
        name='思聪'
    
        score=10000
    
        hello(){
            console.log('hello')
        }
        abc(){
              console.log('abc')
        }
    
      }
      let t1=new Teacher()
      console.log(t1.name)
      t1.say()
    View Code

    对async-await的理解

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
      <script src="./js/jquery.js"></script>
    
    </head>
    <body>
      <button id="btn">点击发送ajax</button>
      <script>
          // 1  同步  代码从上往下执行 遇见 同步 就会一直等 等到完成 才会继续走
          //    异步   代码从上往下执行 遇见异步 就先走了  异步的代码后面执行
          // 2  说ajax 问个题  
          // 哪些是异步  1 定时器 2 ajax 3 事件处理(绑定的onclick等) 4 nodejs 读取文件也有异步
          // console.log(1)
          // $.ajax({
          //   url:"./php/ok.php",
          //   success:function(res){
          //     // console.log('ajax结果',res)
          //     console.log(2)
          //   }
          // })
          // console.log(3)
    
              // 要求 第一个ajax 成功之后 在 第二个发送ajax  再来第三个....
              // 这样写 不一定谁先谁后
              // 如果一直嵌套就是 地狱回调
              // $.ajax({
              //   url:"./php/ok.php",
              //   success:function(res){
              //     console.log('ajax结果111',res)
              //         $.ajax({
              //           url:"./php/ok.php",
              //           success:function(res){
              //             console.log('ajax结果2222',res)
              //             $.ajax({
              //               url:"./php/ok.php",
              //               success:function(res){
              //                 console.log('ajax结果2222',res)
              //                 $.ajax({
              //                     url:"./php/ok.php",
              //                     success:function(res){
              //                       console.log('ajax结果2222',res)
              //                     }
              //                   })
              //               }
              //             })
              //           }
              //         })
              //   }
              // })
    
              // 可以使用promise 解决地狱回调
              // let p1=new Promise(function(resolve,reject) {
              //     // resolve 是成功的函数
              //     // reject  是失败的函数
              // })
              // p1 是new的 promise 实例  他有固定写噶
              // p1.then(成功的函数resolve,失败的函数reject)
              // p1.then(function(){},function(){})
              // let p1=new Promise(function(resolve,reject) {
              //     //   let resolve=function(data){
              //     //     console.log('成功',data)
              //     // }
              //     // resolve 是成功的函数 // reject  是失败的函数
              //     resolve(1)
              // })
    
              // p1.then(function(data){
              //     console.log('成功',data)
              // })
    
    
              
              let p1=new Promise(function(resolve,reject) {
                  $.ajax({
                      url:"./php/ok.php",
                      success:function(res){
                        // console.log('ajax结果',res)
                        // console.log(2)
                        // 成功 调用resolve
                        resolve(res)
                      }
                  })
              })
              // p1.then
    
              // Promise.all(数组,第二个参数函数)
    
              // Primose.all([p1,p2,p3...],function)
              // Primose.all 必须数组里面的所有的 promise执行完毕 才成功 
              // 用在 要同时 有很多 结果一起成功的 情况
    
              // Primose.race([p1,p2,p3...],function)
              // Primose.race  只要 数组里面的 任何一个 成功 整个race就 执行了
    
    
    
    
              // 好处 就是没有那么多嵌套关系 是 一个链式编程的结果 
              function axios(){
                  let p1=new Promise(function(resolve,reject) {
                      $.ajax({
                          url:"./php/ok.php",
                          success:function(res){
                            // console.log('ajax结果',res)
                            // console.log(2)
                            // 成功 调用resolve
                            resolve(res)
                          }
                      })
                  })
                  return p1
                  // axios返回一个 promise
              }
    
              // axios() 调用axios函数 得到 p1  new的promise
              // axios 就是 把 发送ajax 用promise封装了一下
              // axios().then(function(res){
              //   console.log('结果',res)
              // })
              // 点击 发送ajax
              // async  await 最简单的使用 就是 可以省略掉then 简单快捷
              //  代码看起来清晰
              document.getElementById("btn").onclick= async ()=>{
                // 使用axios
                // axios().then(function(res){
                //   console.log('结果',res)
                // })
                let res=await axios();// 这里会等待成功 才执行下面
    
                let res=await axios();// 这里会等待成功 才执行下面
                console.log('结果',res)
              }
              
              // p1
              // .then(function(res){
              //     console.log('成功的结果',res)
              //     let p2=new Promise(function(resolve,reject) {
              //     $.ajax({
              //         url:"./php/ok.php",
              //         success:function(res){
              //           // console.log('ajax结果',res)
              //           // console.log(2)
              //           // 成功 调用resolve
              //           resolve(res)
              //         }
              //     })
              // })
              //     return p2
              // })
              // .then(function(res){
              //     console.log('成功的结果',res)
        
              // })
    
         
    
    
    
          
    
    
    
    
          // 3 ajax +promise  解决地狱回调 顺便简单封装axios  
          // 4 async  await  async/await使得异步代码看起来像同步代码,这正是它的魔力所在
          // 5 async +await 原理  generate+yield 
          // async 函数是什么?一句话,它就是 Generator 函数的语法糖。
          // Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同。本章详细介绍 Generator 函数的语法和 API,它的异步编程应用请看《Generator 函数的异步应用》一章。
          // Generator 函数有多种理解角度。语法上,首先可以把它理解成,Generator 函数是一个状态机,封装了多个内部状态。
          // 执行 Generator 函数会返回一个遍历器对象,也就是说,Generator 函数除了状态机,还是一个遍历器对象生成函数。返回的遍历器对象,可以依次遍历 Generator 函数内部的每一个状态。
          // 形式上,Generator 函数是一个普通函数,
          // 但是有两个特征。一是,function关键字与函数名之间有一个星号;二是,函数体内部使用yield表达式,定义不同的内部状态(yield在英语里的意思就是“产出”)。
         
          // 11:15 上课 
          // 重点 就一点 async +await 原理 是 generate + yield  的语法糖 
          //  async +await 其实就是 generate + yield  的 写法
          // 为什么要有 async +await 因为方便 看起来代码清晰
    
          // Generator方式的函数 里面的代码是 分段执行 看到yield 就给你分一段
          function* helloWorldGenerator() {
            yield 'hello'; // yield 类似 暂停标记
            yield 'world';
            return 'ending';
          }
    
          var hw = helloWorldGenerator();//hw 返回一个
          // console.log(hw);// 这个函数的结果 是 ending吗?不是 因为代码是暂停的 是一个暂停标记 指向hello
          console.log(hw.next()) ;//next 表示 拿出这个暂停的值
          console.log(hw.next())
          console.log(hw.next())
          console.log(hw.next())
    
    
    
          // 上面代码定义了一个 Generator 函数helloWorldGenerator,它内部有两个yield表达式(hello和world),即该函数有三个状态:hello,world 和 return 语句(结束执行)。
    
          // 然后,Generator 函数的调用方法与普通函数一样,也是在函数名后面加上一对圆括号。不同的是,调用 Generator 函数后,
          // 该函数并不执行,返回的也不是函数运行结果,而是一个指向内部状态的指针对象,也就是遍历器对象(Iterator Object)。
    
          // 下一步,必须调用遍历器对象的next方法,使得指针移向下一个状态。
          // 也就是说,每次调用next方法,内部指针就从函数头部或上一次停下来的地方开始执行,
          // 直到遇到下一个yield表达式(或return语句)为止。
          // 换言之,Generator 函数是分段执行的,yield表达式是暂停执行的标记,而next方法可以恢复执行。
          // 由于 Generator 函数返回的遍历器对象,只有调用next方法才会遍历下一个内部状态,所以其实提供了一种可以暂停执行的函数。yield表达式就是暂停标志。
    
          // Iterator遍历器对象的next方法的运行逻辑如下
          // Generator 函数可以返回一系列的值,因为可以有任意多个yield。
          // 从另一个角度看,也可以说 Generator 生成了一系列的值,这也就是它的名称的来历(英语中,generator 这个词是“生成器”的意思)。
          
          // console.log(hw.next())
          // // { value: 'hello', done: false }
    
          // hw.next()
          // // { value: 'world', done: false }
    
          // hw.next()
          // // { value: 'ending', done: true }
    
          // hw.next()
          // // { value: undefined, done: true }
          /* 
          const fs = require('fs');
    
          const readFile = function (fileName) {
            return new Promise(function (resolve, reject) {
              fs.readFile(fileName, function(error, data) {
                if (error) return reject(error);
                resolve(data);
              });
            });
          };
    
          const gen = function* () {
            const f1 = yield readFile('/etc/fstab');
            const f2 = yield readFile('/etc/shells');
            console.log(f1.toString());
            console.log(f2.toString());
          };
          改造
    
          const asyncReadFile = async function () {
          const f1 = await readFile('/etc/fstab');
          const f2 = await readFile('/etc/shells');
          console.log(f1.toString());
          console.log(f2.toString());
        };
          
          
          */
    
      </script>
    </body>
    </html>
    View Code

    Promise  Genarator函数 和async await 的区分以及用法

    const fs=require('fs');
    
    //Promise 用法
    const getFile=(fileName)=>{
        return new Promise((resolve,reject)=>{
            fs.readFile(fileName,(err,data)=>{
                if(err){
                    reject(err)
                    return 
                }else{
                    resolve(data)
                }
            })
        })
    }
    
    
    /*
    //generator*函数  yield 暂停的意思
    function* gen(){
        let f1=yield getFile('./server/project1/index.js')
        let f2=yield getFile('./server/project1/package.json')
    }
    
    //生成 遍历器对象 next() 方法遍历 一次只执行玩当前的这个yield 到下一个yield暂停
    let hw=gen();
    hw.next().value.then((data)=>{
        console.log(data.toString())
    })
    hw.next().value.then((data)=>{
        console.log(data.toString())
    })
    */
    
    
    //用async 和await 写法  (是ganarator函数的语法糖)
    async function gen(){
        let f1=await getFile('./server/project1/index.js')
        let f2=await getFile('./server/project1/package.json')
        console.log(f1.toString())
        console.log(f2.toString())
    }
    gen()
    View Code

    JS事件循环

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
    </head>
    
    <body>
      <script>
        // 凡是 异步代码和定时代码 都会等待 主程序执行完毕 再开始
        // 哪些是异步操作 1 定时器延时器 2 ajax 3 绑定的onclick事件函数.. 4 
        // console.log(1)
        // setTimeout(function () {
        //   console.log(2);
        // },0)
        // console.log(3)
        // 注意 new promise 会立刻执行  而 .then 是需要异步的
        // console.log(1)
        // new Promise(function(resolve,reject){
        //     console.log('2')
        //     resolve()
        // }).then(function(){
        //   console.log(3)
        // })
        // console.log(4)
    
      //  宏任务 : 定时器延时器   微任务:promise
      // 先同步 再取出第一个宏任务执行 所有的相关微任务总会在下一个宏任务之前全部执行完毕   
      // 如果遇见 就  先微后宏
        // console.log(1)
        // setTimeout(function () {
        //   console.log(2);
        // },0)
        // new Promise(function (resolve) {
        //   console.log('3');
        //   resolve();
        // }).then(function () {
        //   console.log('4')
        // })
    
        console.log('1');
        // 延时器 放到事件队列里面   宏任务
        setTimeout(function () {
          console.log('2');
          new Promise(function (resolve) {
            console.log('3');
            resolve();
          }).then(function () {
            console.log('4')
          })
        },0)
        // promise new promise立刻执行 但是 then 会放到事件队列 微任务
        new Promise(function (resolve) {
          console.log('5');
          resolve();
        }).then(function () {
          console.log('6')
        })
        // 延时器 放到事件队列里面   宏任务
        setTimeout(function () {
          console.log('7');
          new Promise(function (resolve) {
            console.log('8');
            resolve();
          }).then(function () {
            console.log('9')
          })
          console.log('10')
        },0)
       
        console.log('11')
        // 1  5 11 6 2 3  4 7 8  10 9
        //1 此时事件队列代码 有一个 then 6 两个 延时器setTimeout
        //2 先微后宏 执行 then 6 
        //3 剩下 两个 延时器setTimeout  先上面 再下面
        //4 上面的setTimeout  2 3 虽然里面有 then 4 但是记住一个宏任务里面必须会执行完微任务
        //5 下面的setTimeout
    
    
    
    
    
        // 1 5 11 6 2 3 4 7 8 10 9
        // 第一个setTimeout宏任务结束之后,会去检查队列中是否有微任务存在,如果有的话先执行微任务。(微任务优先级高)
      
    
        // setTimeout(function () {
        //   console.log('7');
        //   new Promise(function (resolve) {
        //     console.log('8');
        //     resolve();
        //   }).then(function () {
        //     console.log('9')
        //   })
        //   console.log('10')
        // },0)
      </script>
    </body>
    
    </html>
    View Code

    cookie

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
    </head>
    <body>
      <script>
      //  console.log('开始',document.cookie) 
    
      //  document.cookie='username=ljc'
      //  document.cookie='password=123'
      //  console.log('设置') 
    
      //  console.log('获取',document.cookie)
    
      //  document.cookie="键=值; expires=过期时间"
        // cookie 后端会操作 但是 前端也可以操作的
       document.cookie="username=zs"
      // 写一次 就多一个cookie
      document.cookie="age=18"
    
      //  获取
       console.log( document.cookie )
      //  取出来 是一个字符串形式  username=zs; age=18
      // 就需要split拆分处理字符串 获取 username  或者age 
    
      // locastorage sessionstorage  cookie
      // cookie 
      //   1 存的数据量小 2 默认浏览器关掉就过期了 但是可以自己设置过期时间 3 不太安全(每次请求头会带上)
      // locastorage 1 存的数据量大 2 不过期 除非你删掉
    
      // cookie是很久以前的技术 那时候用来存储用户登录 现在 locastorage 存token来操作
      // 注意:cookie 跨域有问题 现在都是 用 locastorage 存token 统一
    
    
      </script>
    </body>
    </html>
    View Code

     ios和安卓判断

        // 就涉及到 怎么 判断是 ios还是安卓
        // window.navigator.userAgent 原生js 可以拿到 是什么手机系统
        // if(是ios){
        //   // 做ios的 兼容代码
        // }esle if(是安卓){
        //   //  做安卓的代码
        // }
    
        //获取浏览器的userAgent,并转化为小写
        var ua = window.navigator.userAgent.toLowerCase();
        /* 
        "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Mobile Safari/537.36"
        */
        //判断是否是苹果手机,是则是true
        // 在字符串里面找到 iphone 或者ipad 就是 ios手机
        var isIos = (ua.indexOf('iphone') != -1) || (ua.indexOf('ipad') != -1);
        if(isIos){
          // 做苹果手机兼容
          console.log('做苹果是','欢迎您 ios 用户')
        }else{
          // 做安卓
          console.log('欢迎您 安卓 用户')
        }
    View Code

    websocket实现聊天室

    <!DOCTYPE html>
    <html>
    <head>
        <title>简易聊天Demo</title>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width,initial-scale=1, maximum-scale=1, user-scalable=no">
        <link href="https://cdn.bootcss.com/bootstrap/3.3.2/css/bootstrap.min.css" rel="stylesheet">
        <style type="text/css">
            html, body {
                min-height: 100%;
            }
    
            body {
                margin: 0;
                padding: 0;
                 100%;
                font-family: "Microsoft Yahei", sans-serif, Arial;
            }
    
            .container {
                text-align: center;
            }
    
            .title {
                font-size: 16px;
                color: rgba(0, 0, 0, 0.3);
                position: fixed;
                line-height: 30px;
                height: 30px;
                left: 0px;
                right: 0px;
                background-color: white;
            }
    
            .content {
                background-color: #f1f1f1;
                border-top-left-radius: 6px;
                border-top-right-radius: 6px;
                margin-top: 30px;
            }
    
            .content .show-area {
                text-align: left;
                padding-top: 8px;
                padding-bottom: 168px;
            }
    
            .content .show-area .message {
                 70%;
                padding: 5px;
                word-wrap: break-word;
                word-break: normal;
            }
    
            .content .write-area {
                position: fixed;
                bottom: 0px;
                right: 0px;
                left: 0px;
                background-color: #f1f1f1;
                z-index: 10;
                 100%;
                height: 160px;
                border-top: 1px solid #d8d8d8;
            }
    
            .content .write-area .send {
                position: relative;
                top: -28px;
                height: 28px;
                border-top-left-radius: 55px;
                border-top-right-radius: 55px;
            }
    
            .content .write-area #name {
                position: relative;
                top: -20px;
                line-height: 28px;
                font-size: 13px;
            }
        </style>
    </head>
    <body>
    <div class="container">
        <div class="title">简易聊天demo</div>
        <div class="content">
            <div class="show-area"></div>
            <div class="write-area">
                <div>
                    <button class="btn btn-default send">发送</button>
                </div>
                <div><input name="name" id="name" type="text" placeholder="input your name"></div>
                <div>
                    <textarea name="message" id="message" cols="38" rows="4" placeholder="input your message..."></textarea>
                </div>
            </div>
        </div>
    </div>
    
    <script src="http://libs.baidu.com/jquery/1.9.1/jquery.min.js"></script>
    <script src="https://cdn.bootcss.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
    <script>
        $(function () {
            // var wsurl = 'ws://127.0.0.1:3000';
            var websocket;
            var i = 0;
            if (window.WebSocket) {
              // 原生js就支持的  
              // WebSocket 建立链接后 就不会在断  相当于打电话 只要不挂断就一直可以通讯
              // 1 前端必须按照步骤写上链接WebSocket 2 后台也需要对应链接上WebSocket
              // 对应我们来说 有人封装了 一个 sockect.io 他就是封装 WebSocket
              // 1 new WebSocket
                websocket = new WebSocket('ws://127.0.0.1:3000');
    
                //2 连接建立 websocket.onopen
                websocket.onopen = function (evevt) {
                    console.log("WebSocket 链接上了");
                    $('.show-area').append('<p class="bg-info message"><i class="glyphicon glyphicon-info-sign"></i>Connected to WebSocket server!</p>');
                }
                //3 收到后台发来消息就会执行 websocket.onmessage 
                websocket.onmessage = function (event) {
                  // 在这里就 解析判断 后台返回什么数据 对应操作
                    var msg = JSON.parse(event.data); //解析收到的json消息数据
    
                    var type = msg.type; // 消息类型
                    var umsg = msg.message; //消息文本
                    var uname = msg.name; //发送人
                    i++;
                    if (type == 'usermsg') {
                        $('.show-area').append('<p class="bg-success message"><i class="glyphicon glyphicon-user"></i><a name="' + i + '"></a><span class="label label-primary">' + uname + ' : </span>' + umsg + '</p>');
                    }
                    if (type == 'system') {
                        $('.show-area').append('<p class="bg-warning message"><a name="' + i + '"></a><i class="glyphicon glyphicon-info-sign"></i>' + umsg + '</p>');
                    }
    
                    $('#message').val('');
                    window.location.hash = '#' + i;
                }
    
                //发生错误 链接出错
                websocket.onerror = function (event) {
                    i++;
                    console.log("Connected to WebSocket server error");
                    $('.show-area').append('<p class="bg-danger message"><a name="' + i + '"></a><i class="glyphicon glyphicon-info-sign"></i>Connect to WebSocket server error.</p>');
                    window.location.hash = '#' + i;
                }
    
                //连接关闭 关闭链接
                websocket.onclose = function (event) {
                    i++;
                    console.log('websocket Connection Closed. ');
                    $('.show-area').append('<p class="bg-warning message"><a name="' + i + '"></a><i class="glyphicon glyphicon-info-sign"></i>websocket Connection Closed.</p>');
                    window.location.hash = '#' + i;
                }
    
                function send() {
                    var name = $('#name').val();
                    var message = $('#message').val();
                    if (!name) {
                        alert('请输入用户名!');
                        return false;
                    }
                    if (!message) {
                        alert('发送消息不能为空!');
                        return false;
                    }
                    var msg = {
                        message: message,
                        name: name
                    };
                    try {
                        websocket.send(JSON.stringify(msg));
                    } catch (ex) {
                        console.log(ex);
                    }
                }
    
                //按下enter键发送消息
                $(window).keydown(function (event) {
                    if (event.keyCode == 13) {
                        console.log('user enter');
                        send();
                    }
                });
    
                //点发送按钮发送消息
                $('.send').bind('click', function () {
                    send();
                });
    
            }
            else {
                alert('该浏览器不支持web socket');
            }
    
        });
    </script>
    </body>
    </html>
    View Code

    用封装过后的socket.io()实现

  • 相关阅读:
    Web前端笔记和简历模板
    三种 Loading 制作方案
    注册中心之健康检测机制
    HTTPS与加密
    多线程-JUC
    date日期类型
    spring配置文件约束
    Tomcat web.xml 中的listener、 filter、servlet 加载顺序
    java 日志框架总结
    mysql常用命令
  • 原文地址:https://www.cnblogs.com/lvlisn/p/14952615.html
Copyright © 2011-2022 走看看