node.js第四天--ajax在项目中的应用

简介: node.js第四天--ajax在项目中的应用


  1. 瀑布流无限加载

         使用瀑布流无限加载技术取消了分页按钮,当用户浏览完当前的页面数据之后,会自动加载数据,无缝链接,给用户良好的体验,尤其是在移动端,更是随处可见

         代码示例:

 

  1. 表单验证
<!DOCTYPE html>
<html>
<head>
  <title>瀑布流</title>
  <meta charset="utf-8">
  <style type="text/css">
    *{
      margin: 0;padding: 0px;border: 0px;
    }
    img{
      width: 200px;
      display: block;
      position: absolute;
      transition: 0.5s;
    }
  </style>
  <!-- <script type="text/javascript" src="/myAjax-minni.js"></script> -->
</head>
<body>
  <img src="./images/1.jpg" width="200">
  <img src="./images/2.jpg" width="200">
  <img src="./images/3.jpg" width="200">
  <img src="./images/4.jpg" width="200">
  <img src="./images/5.jpg" width="200">
  <img src="./images/6.jpg" width="200">
  <img src="./images/7.jpg" width="200">
  <img src="./images/8.jpg" width="200">
  <img src="./images/9.jpg" width="200">
  <img src="./images/10.jpg" width="200">
</body>
</html>
<script type="text/javascript">
  //封装ajax对象
function Ajax(dataType,async){
    var ajax = new Object();
    // 处理数据类型
    ajax.dataType = dataType ? dataType.toUpperCase() : 'HTML';
 
    // 处理同步异步
    if(typeof(bool) == "undefined"){
      ajax.async = true;
    }else{
      ajax.async = async;
    }
    //创建XMLHTTPRequest对象
  ajax.createXMLHttpRequest = function(){
      // 定义空的xmlRequest对象
      var xmlRequest = false;
      if(window.XMLHttpRequest){
          // 主流
          xmlHttpRequest = new XMLHttpRequest();
      }else{
          // IE5,IE6
          xmlRequest = new ActiveXObject("Microsoft.XMLHTTP");
      }
      return xmlRequest;
  }
  ajax.xmlRequest = ajax.createXMLHttpRequest();
     // onreadystatechange事件
    ajax.changeFunction = function(){
        if(ajax.xmlRequest.readyState == 4 && ajax.xmlRequest.status == 200){
            if(ajax.dataType == 'HTML'){
                ajax.callback(ajax.xmlRequest.responseText);
            }else if(ajax.dataType == 'JSON'){
                // 处理json格式数据
                ajax.callback(JSON.parse(ajax.xmlRequest.responseText));
            }else if(ajax.dataType == 'XML'){
                ajax.callback(ajax.xmlRequest.responseXML);
            }
        }
    }
 
    // get方法
  ajax.get = function(url,callback){
      if(callback != null){
          // 便于使用onreadystatechange事件函数使用
          ajax.callback = callback;
          // 调用onreadystatechange事件函数,把服务器返回的数据给回调函数
          ajax.xmlRequest.onreadystatechange = ajax.changeFunction;
      }
      // 然后初始化GET请求
      ajax.xmlRequest.open("GET",url,ajax.async);
      // 发送请求
      ajax.xmlRequest.send();
  }
  //post方法
  /** Ajax中post请求方法
    url请求的url
    endstring post请求携带的参数 字符串或json
    callback 用来接收服务器返回的回调函数
  */
  ajax.post = function(url,sendString,callback){
      // 处理要向服务器提交的参数为xml支持的格式
      if(typeof(sendString == 'boject')){
          // 如果是json对象,转化成字符串
          var str = '';
          // 循环遍历这个对象
          for(var key in sendString){
                  // 把json对象转化成name=Tom&age=19的形式
              str += key + '=' + sendString[key] + '&';
          }
          // 删除字符串最后一个‘&’
          sendString = str.substr(0,str.length-1);
      }
      // 判断是否有回调函数,有回调函数的话调用onreadystatechange事件函数
      if(callback != null){
          // 把传递过来的回调函数给ajax的一个属性
          // 便于onreadystatechange函数调用
          ajax.callback = callback;
          // 调用onreadystatechange事件函数,把服务器返回的数据给回调函数
          ajax.xmlRequest.onreadystatechange = ajax.changeFunition;
      }
      
      // 然后初始化post请求
      ajax.xmlRequest.open("POST",url,ajax.async);
      // 设置post请求头信息
      ajax.xmlRequestHeader('Content-Type','application/x-www-form-urlencoded');
      ajax.xmlRequest.send(sendString);
  }
      
    return ajax;
}
  // 頁面一加载就调用layout对页面进行布局
  window.onload = layout;
  // 窗口改变也调用函数
  window.onresize = function(){
    layout();
  }
 
  // 这个函数用来布局页面中的img排列方式
  function layout(){
    // 获取所有的img标签
    var allImg = document.getElementsByTagName('img');
    // 窗口视图的宽度
    var windowWidth = document.documentElement.clientWidth;
    // 一行能容纳多少个img,并向下取整
    var n = Math.floor(windowWidth/220);
    // 如果页面没有标签则直接返回,不用布局
    if(n<=0){return;}
    // 计算页面两端有多少空白
    var center = (windowWidth - n*220)/2;
    // 定义一个数组存放img的高度
    var arrH = [];
    for(var i = 0;i<allImg.length;i++){
      // 用来计算是第几个img,用于给数组做索引
      // 保证数组长度始终是等于每行的数n
      var j = i%n;
      // 一行排满n个后到下一行
      // 下一行开始,从高度最低的开始排
      if(arrH.length == n){
        // 从高度最低的开始
        var min = getMin(arrH);
        // 左右定位,开始一个20px的间距
        allImg[i].style.left = center + min*220 + 'px';
        // 上下定位并且给一个20px的定位
        allImg[i].style.top = arrH[min] + 20 + "px";
        // 把高度最低的img的高度放进数字,并给一个20px的间距
        arrH[min] += allImg[i].offsetHeight + 20;
      }else{
        // 这个是用来排列第一行的
        // 把img的高度放入数组
        arrH[j] = allImg[i].offsetHeight;
        // 左右定位,居住空白加
        allImg[i].style.left = center + 220*j + 'px';
        allImg[i].style.top = 0;
      }
    };
  }
 
  // 找出高度最小的那个索引并返回
  function getMin(arr){
    var m = 0; // 初始化一个用户比较的索引变量
    for(var i = 0;i<arr.length;i++){
      // 进行比较,每次都返回最小的那个
      m = Math.min(arr[m],arr[i]) == arr[m] ? m : i;
    }
    return m;
  }
 
  // 当滚动条变化时触发这个函数,到一定值是触发ajax请求
  window.onscroll = function(){
    // 可视区域高度
    var windowHeight = document.documentElement.clientHeight;
    // 滚动条的高度
    var srcollTop = document.documentElement.srcollTop || document.body.srcollTop;
    var srcollH = document.body.srcollHeight;
    // alert(srcollH)
    if(srcollTop+windowHeight >= srcollH-20){
      // 发送ajax请求,同步方式
      Ajax('JSON',false).get('http://127.0.0.1:3000/getData',function(data){
        // 拿到数据之后创建节点,多个数据用循环
        for(var i=0;i<data.length;i++){
          // 创建标签
          var img = document.createElement('img');
          // 绑定url
          img.src = data[i].url;
          // 放到页面中显示
          document.body.appendChild(img);
        }
        // 追加新的节点之后重新布局页面
        layout();
      });
    }
  }
</script>

表单验证

表单中常用到的事件

表单中常用到的事件有onsubmit表单提交事件,onfocus失去焦点事件,onblur失去焦点事件

表单验证实例

<!DOCTYPE html>
<html>
<head>
  <title>表单验证</title>
  <meta charset="utf-8">
  <script type="text/javascript" src="/myAjax.js"></script>
</head>
<body>
  <form action="http://127.0.0.1:3000/reqRes" method="post" onsubmit="return checkForm()">
    用户名:<input type="text" name="username"><span></span><br>
    密  码:<input type="password" name="pass"><span></span><br><br>
    确认密码:<input type="password" name="repass"><span></span><br><br>
    邮  箱:<input type="text" name="repass"><span></span><br><br>
    手  机:<input type="text" name="phone"><span></span><br><br>
    <input type="submit" value="提交" name="">
    <input type="reset" value="重写
    " name="">
  </form>
  <script type="text/javascript">
    // 定义标志,所有标志为1才能提交
    var flag_user = flag_pass = flag_repass = flag_email = flag_phone = 0;
    // 获取所有input节点
    var inputs = document.getElementsByTagName('input');
    // 获取所有的span标签,用于给出提示信息
    var spans = document.getElementsByTagName('span');
    // 遍历所有的span标签,用于给出提示信息
    var spans = document.getElementsByTagName('span');
    // 遍历input节点,给出不同的input的绑定不同的事件
    for(var i = 0;i<inputs.length;i++){
      if(inputs[i].name === 'username'){
        // 匹配到用户名
        var index_u = i; // 保存i的值,作为下标
        // 绑定获得焦点事件,获得焦点清空输入框
        inputs[index_u].onfocus = function(){
          // 获取焦点事件提示用户输入正确格式
          spans[index_u].innerHTML = '用户名为6-16为英文,数字和下划线组成';
          this.value = '';
        }
 
        //绑定失去焦点的事件,失去焦点进行验证
        inputs[index_u].onblur = function(){
          // 失去焦点事件,失去焦点进行验证,
          // 符合要求才发送ajax到服务器验证是否存在
          var reg = /^[a-zA-Z\d_]\w{6,16}$/; // 正则表达式
          console.log(this);
          if(reg.test(this.value)){
            //验证成功,Ajax远程请求服务器进行用户名验证
            Ajax('json',false).post('http://localhost:3000/checkReg',{username:this.value},function(data){
              //判断结果,执行不同的操作
              if(data.flag == 0){ //该用户不存在于数据库,可以注册
                flag_user = 1;
                spans[index_u].innerHTML = data.message;
              }else{
                flag_user = 0;
                spans[index_u].innerHTML = data.message;
              }
            });
          }else{
            spans[index_u].innerHTML = '用户名格式不正确';
          }
        }
      }else if(inputs[i].name == 'pass'){
        // 匹配到密码框
 
      }
    }
  </script>
</body>
</html>

服务器端:

// 表单提交
app.get('/reg',function(req,res){
  res.render('reg');
});
//表单提交
app.post('/checkReg',function(req,res){
  console.log(req);
  // 模拟数据库已存在的数据
  var users = [
    {username:'ab','password':'2019'},
    {username:'ab1','password':'20191'},
    {username:'ab11','password':'201911'},
  ];
  // 判断用户提交的用户名是否已经存在
  for(var i = 0;i<users.length;i++){
    if(req.body.username === users[i].username){
      // 已存在值,请换一个
      res.json({flag:1,message:'用户名存在,换一个试试'});
    }
  }
  // 用户名不存在,可以注册
  res.json({flag:0,message:'用户名不存在,可以注册'});
});

// 完整js代码

<!DOCTYPE html>
<html lang='zh-CN'>
<head>
  <title>注册验证</title>
  <meta charset='utf-8'>
  <script src='myAjax.js'></script>
</head>
<body>
<form action='http://127.0.0.1:3000/reqRes' method='post' onsubmit='return checkForm()'>
  用户名:<input type='text' name='username'><span></span><br><br>
  密&nbsp;&nbsp;码:<input type='password' name='pass'><span></span><br><br>
  确认密码:<input type='password' name='repass'><span></span><br><br>
  邮&nbsp;&nbsp;箱:<input type='text' name='email' ><span></span><br><br>
  手&nbsp;&nbsp;机:<input type='text' name='phone' ><span></span><br><br>
  &nbsp;&nbsp;<input type='submit' value='提交' name=''>
  <input type='reset' value='重写' name=''>
</form>
</body>
<script>
//定义标志,所有标志为1才能提交注册
var flag_user = flag_pass = flag_repass = flag_email = flag_phone = 0;
//获取所有input节点
var inputs = document.getElementsByTagName('input');
console.log(inputs);
//获取所有的span标签,用于给出提示信息
var spans = document.getElementsByTagName('span');
//遍历input节点,给不同的input的绑定不同的事件
for(var i = 0; i < inputs.length; i++){
  if(inputs[i].name == 'username'){   // 匹配到用户名,进行验证
    var index_u = i;        //保存i的值,作为下标
    //绑定获得焦点事件,获得焦点清空输入框
    inputs[index_u].onfocus = function(){
      //获取焦点事件提示用户输入正确格式
      spans[index_u].innerHTML = '用户名为6-16为英文、数字和下划线组成';
      this.value = '';      //  清空输入框
    }
    //绑定失去焦点事件,失去焦点进行验证
    inputs[index_u].onblur = function(){
      //失去焦点先进行用户名的格式验证,
      //符合要求才发送Ajax到服务器验证是否存在
      var reg = /^[a-zA-Z\d_]\w{6,16}$/;//正则表达式
      if(reg.test(this.value)){
        //验证成功,Ajax远程请求服务器进行用户名验证
        Ajax('json',false).post('http://127.0.0.1:3000/checkReg',{username:this.value},function(data){
          //判断结果,执行不同的操作
          if(data.flag == 0){ //该用户不存在于数据库,可以注册
            flag_user = 1;
            spans[index_u].innerHTML = data.message;
          }else{
            flag_user = 0;
            spans[index_u].innerHTML = data.message;
          }
        });
      }else{            //验证失败,提示用户
        spans[index_u].innerHTML = '用户名格式不正确'; //提示用户
      }
    }
  } else if(inputs[i].name == 'pass'){//密码只进行格式验证
    var index_p = i;
    var reg_p = /^[a-zA-Z\d]{6,16}$/;   //正则匹配
    //绑定获得焦点事件,获取焦点清空输入框
    inputs[index_p].onfocus = function(){
      //获得焦点事件提示用户输入正确格式
      spans[index_p].innerHTML = '密码为6-16为英文、数字组成';
      //清空输入框的值;
      this.value = '';
    };
    //失去焦点事件,失去焦点
    inputs[index_p].onblur = function(){
      if(reg_p.test(this.value)){
        flag_pass = 1;
        spans[index_p].innerHTML = '密码格式正确';
      }else{
        flag_pass = 0;
        spans[index_p].innerHTML = '密码格式不正确';
      }
    }
  } else if(inputs[i].name == 'repass'){
    var index_r = i;
    //绑定获得焦点事件,获取焦点清空输入框
    inputs[index_r].onfocus = function(){
      //获得焦点事件提示用户输入正确格式
      spans[index_r].innerHTML = '请输入重复密码进行比对';
      //清空输入框的值;
      this.value = '';
    };
    //失去焦点事件,失去焦点
    inputs[index_r].onblur = function(){
      if(inputs[index_p].value == inputs[index_r].value){
        flag_repass = 1;
        spans[index_r].innerHTML = '重复密码正确';
      }else{
        flag_repass = 0;
        spans[index_r].innerHTML = '密码不一致';
      }
    }
  } else if(inputs[i].name == 'email'){
    var index_e = i;
    //正则验证邮箱
    var reg_e = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/;
    //绑定获得焦点事件,获取焦点清空输入框
    inputs[index_e].onfocus = function(){
      //获得焦点事件提示用户输入正确格式
      spans[index_e].innerHTML = '请输入正确的邮箱格式';
      //清空输入框的值;
      this.value = '';
    };
    //失去焦点事件,失去焦点
    inputs[index_e].onblur = function(){
      if(reg_e.test(this.value)){
        flag_email = 1;
        spans[index_e].innerHTML = '邮箱格式正确';
      }else{
        flag_email = 0;
        spans[index_e].innerHTML = '邮箱格式不正确';
      }
    }
  } else if(inputs[i].name == 'phone'){
    var index_ph = i;
    //正则验证
    var reg_ph = /^1[3|4|5|8]\d{9}$/;
    //绑定获得焦点事件,获取焦点清空输入框
    inputs[index_ph].onfocus = function(){
      //获得焦点事件提示用户输入正确格式
      spans[index_ph].innerHTML = '请输入正确的手机号';
      //清空输入框的值;
      this.value = '';
    };
    //失去焦点事件,失去焦点
    inputs[index_ph].onblur = function(){
      if(reg_ph.test(this.value)){
        flag_phone = 1;
        spans[index_ph].innerHTML = '手机格式正确';
      }else{
        flag_phone = 0;
        spans[index_ph].innerHTML = '手机格式不正确';
      }
    }
  }
}
//当所有的表单都验证通过了之后才能提交发送
function checkForm(){
  if(flag_user == 1 && flag_pass == 1 && flag_repass == 1 && flag_email == 1 && flag_phone == 1 ){
    //所有验证都通过返回true,允许表单提交
    return true;
  }else{        
    //条件不通过返回false,阻止表单提交
    return false;
  }
}
</script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
</html>
 


目录
相关文章
|
23天前
|
前端开发 机器人 API
前端大模型入门(一):用 js+langchain 构建基于 LLM 的应用
本文介绍了大语言模型(LLM)的HTTP API流式调用机制及其在前端的实现方法。通过流式调用,服务器可以逐步发送生成的文本内容,前端则实时处理并展示这些数据块,从而提升用户体验和实时性。文章详细讲解了如何使用`fetch`发起流式请求、处理响应流数据、逐步更新界面、处理中断和错误,以及优化用户交互。流式调用特别适用于聊天机器人、搜索建议等应用场景,能够显著减少用户的等待时间,增强交互性。
171 2
|
9天前
|
数据可视化 JavaScript 前端开发
数据可视化进阶:D3.js在复杂数据可视化中的应用
【10月更文挑战第26天】数据可视化是将数据以图形、图表等形式呈现的过程,帮助我们理解数据和揭示趋势。D3.js(Data-Driven Documents)是一个基于JavaScript的库,使用HTML、SVG和CSS创建动态、交互式的数据可视化。它通过数据驱动文档的方式,将数据与DOM元素关联,提供高度的灵活性和定制性,适用于复杂数据的可视化任务。 示例代码展示了如何使用D3.js创建一个简单的柱状图,展示了其基本用法。D3.js的链式调用和回调函数机制使代码简洁易懂,支持复杂的布局和交互逻辑。
25 3
|
17天前
|
JavaScript 测试技术 API
跟随通义灵码一步步升级vue2(js)项目到vue3版本
Vue 3 相较于 Vue 2 在性能、特性和开发体验上都有显著提升。本文介绍了如何利用通义灵码逐步将 Vue 2 项目升级到 Vue 3,包括备份项目、了解新特性、选择升级方式、升级依赖、迁移组件和全局 API、调整测试代码等步骤,并提供了注意事项和常见问题的解决方案。
|
14天前
|
JavaScript 前端开发 开发者
探索JavaScript原型链:深入理解与实战应用
【10月更文挑战第21天】探索JavaScript原型链:深入理解与实战应用
25 1
|
18天前
|
SQL JavaScript 关系型数据库
node博客小项目:接口开发、连接mysql数据库
【10月更文挑战第14天】node博客小项目:接口开发、连接mysql数据库
|
21天前
|
JavaScript 前端开发 测试技术
JavaScript与TypeScript:为何TypeScript成为大型项目的首选
JavaScript与TypeScript:为何TypeScript成为大型项目的首选
25 1
|
21天前
|
人工智能 JavaScript 网络安全
ToB项目身份认证AD集成(三完):利用ldap.js实现与windows AD对接实现用户搜索、认证、密码修改等功能 - 以及针对中文转义问题的补丁方法
本文详细介绍了如何使用 `ldapjs` 库在 Node.js 中实现与 Windows AD 的交互,包括用户搜索、身份验证、密码修改和重置等功能。通过创建 `LdapService` 类,提供了与 AD 服务器通信的完整解决方案,同时解决了中文字段在 LDAP 操作中被转义的问题。
|
6天前
|
前端开发 JavaScript
JavaScript新纪元:ES6+特性深度解析与实战应用
【10月更文挑战第29天】本文深入解析ES6+的核心特性,包括箭头函数、模板字符串、解构赋值、Promise、模块化和类等,结合实战应用,展示如何利用这些新特性编写更加高效和优雅的代码。
18 0
|
21天前
|
运维 JavaScript Linux
容器内的Nodejs应用如何获取宿主机的基础信息-系统、内存、cpu、启动时间,以及一个df -h的坑
本文介绍了如何在Docker容器内的Node.js应用中获取宿主机的基础信息,包括系统信息、内存使用情况、磁盘空间和启动时间等。核心思路是将宿主机的根目录挂载到容器,但需注意权限和安全问题。文章还提到了使用`df -P`替代`df -h`以获得一致性输出,避免解析错误。
|
23天前
|
自然语言处理 JavaScript 前端开发
深入理解JavaScript中的闭包:原理、应用与代码演示
【10月更文挑战第12天】深入理解JavaScript中的闭包:原理、应用与代码演示
下一篇
无影云桌面