使用原生js通过ajax实现服务器渲染的简单代码和个人改进

news2024/11/18 15:49:10

文章目录

  • 前文提要
  • 代码实现
    • 主要参考
    • 服务器渲染实现逻辑
    • 网页呈现效果
  • 代码分段讲解
    • 提要
    • html的body部分
    • css部分
    • js部分
    • xhr.open函数
    • AJAX-onreadystatechange事件
    • function函数简写方法
    • 附件功能:选中行 高亮
  • 代码全文


前文提要

本文仅做个人学习记录,如有错误,请包涵。

ES6是什么

function简写方法:笔记:ES6新特性-函数的简写(箭头函数)


代码实现

主要参考

主要参考视频:零基础入门前端|经典案例之原生js获取服务器数据并渲染到页面中|JavaScript教程
本文的主要代码也是来自这个主要参考视频。
次要学习视频:Ajax 是什么? 如何创建一个 Ajax? - JavaScript前端Web工程师
可以通过第二个视频尝试一些新的改进方法。

服务器渲染实现逻辑

使用按钮触发点击事件,使用原生js通过ajax访问服务器,通过返回的状态码判断数据是否在服务器端全部具备,而后直接在服务器端渲染好html文件返回到浏览器端。

网页呈现效果

点击“获取数据”按钮之前:
在这里插入图片描述

点击“获取数据”按钮之后:
在这里插入图片描述

代码分段讲解

提要

ps:本文提供的代码没有html、css、js分离,如果能将代码分离成三部分,即做到结构、样式、脚本的分离,则更有利于项目的维护和代码的重用。

html的body部分

创建按钮提供“数据获取”事件的触发,创建表格提供表头,留下<tbody><\tbody>标签给js做数据补充。

  <button>
    获取数据
  </button>
  
  <table>
    <tr>
      <td>编号</td>
      <td>Login</td>
      <td>头像</td>
      <td>备注</td>
    </tr>
    <tbody id="myTbody">

    </tbody>
  </table>

css部分

css部分的代码都已经写好了注释,不再做讲解。

    /* 先选择所有元素,将margin和padding 置零*/
    * {
      margin: 0;
      padding: 0;
    }

    /* 设置table元素中的宽度,填充和,相邻单元格边框合并 */
    table {
      width: 700px;
      margin: 50px auto;
      border-collapse: collapse;
    }

    /* 设置每行的高度限制 */
    tr {
      height: 30px;
    }

    /* 设置单元格框线颜色-黑色、文本字体大小-20像素、文本格式-居中 */
    td {
      border: 1px solid #000;
      font-size: 20px;
      text-align: center;
    }

    /* 限制每张图片的高度,从而约束每行的大小 */
    img {
      height: 100px;
    }

js部分

下面做js部分的代码记录:

var btn = document.querySelector('button');
var myTbody = document.getElementById("myTbody");

分别通过选择器和id操作DOM获取元素
接着通过,浏览器内置的函数来和服务器进行网络通讯

var xhr = new XMLHttpRequest();//new 是小写

大体框架需要先写成这样,若是只写了open,但是缺少send函数,则获取不到数据,在console中不会看见返回的数据,也无法获取返回的状态码。

var xhr = new XMLHttpRequest();//new 是小写      
xhr.open('GET', 'https://api.github.com/users',true);//true是选择异步,false是同步
      //open 可以写成本地文件 'text.txt'代替'https://api.github.com/users'即可
xhr.send();//缺失该代码会导致获取不到数据

xhr.open函数

open函数是生成一个准备发送的请求,第一个参数是选择’get’方式还是’post’,第二个参数是请求面向的地址,第三个参数是选择异步还是同步方式
关于xhr.open的理解链接:AJAX - 向服务器发送请求
异步不需要等待响应就可以发送下一条请求,填表时填完一行出现这行的数据符不符合标准也是使用的异步方式,否则要全填完才能检查是否出错,出错后全部都得重填。
同步、异步方式:什么是同步请求和异步请求?
当状态码发生改变的时候会触发事件,我们需要为这一事件附加函数,也就是下面的function。4代表数据完全接收,200这个状态码代表

 xhr.onreadystatechange = function () {
        if (xhr.readyState == 4 && xhr.status == 200) {
          console.log(xhr.responseText);//拿到了数据,是字符串数据类型
          }
}

AJAX-onreadystatechange事件

概念解析图片,上文的xhr.readyState == 4 && xhr.status == 200这么写也是如此
在这里插入图片描述
学习链接:AJAX - onreadystatechange 事件

function函数简写方法

上述代码,在ES6中还可以改写为

 xhr.onreadystatechange =  ()=>{
        if (xhr.readyState == 4 && xhr.status == 200) {
          console.log(xhr.responseText);//拿到了数据,是字符串数据类型
          }
}

但不推荐使用这种写法,因为SE6还没有被大规模应用(说不定就有一些老古董用不了)

var data = xhr.responseText;
data = JSON.parse(data);
// console.log(data);//变成了字符串数组
var html = '';//不写空串则是,undefined数据类型,会输出undefined
for (var i = 0; i < data.length; i++) {
  var result = data[i];
  html += "<tr>";
  //此处可以使用es6的模版字符串的方式进行改写,`${}`
  html += "<td>" + result.id + "</td><td>" + result.login + "</td><td><img src=' " + result.avatar_url + "'/></td><td>" + result.site_admin + "</td>"
  html += "</tr>";
}
myTbody.innerHTML = html;

将服务器返回的字符串数据转换成json对象,然后再塞入html文件中

附件功能:选中行 高亮

下述代码则是附加功能,当鼠标悬浮在改行的时候显示高亮,离开的时候恢复到原来的颜色:

var trs = document.querySelectorAll('tr');
  for (var i = 0; i < trs.length; i++) {
  trs[i].onmouseover = function () {
    //逐行清除背景颜色
    for (var i = 0; i < trs.length; i++) {
      trs[i].style.backgroundColor = "";
    }
    //给当前行的元素添加高亮的背景颜色
    this.style.backgroundColor = "#eee";
  }
}

代码全文

代码(无实现图片渲染):

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>原生js服务器渲染</title>
  <style type="text/css">
    /* 先选择所有元素,将margin和padding 置零*/
    * {
      margin: 0;
      padding: 0;
    }

    /* 设置table元素中的宽度,填充和,相邻单元格边框合并 */
    table {
      width: 700px;
      margin: 50px auto;
      border-collapse: collapse;
    }

    /* 设置每行的高度限制 */
    tr {
      height: 30px;
    }

    /* 设置单元格框线颜色-黑色、文本字体大小-20像素、文本格式-居中 */
    td {
      border: 1px solid #000;
      font-size: 20px;
      text-align: center;
    }

    /* 限制每张图片的高度,从而约束每行的大小 */
    img {
      height: 100px;
    }
  </style>
</head>

<body>
  <button>
    获取数据
  </button>
  <table>
    <tr>
      <td>编号</td>
      <td>Login</td>
      <td>头像</td>
      <td>备注</td>
    </tr>
    <tbody id="myTbody">

    </tbody>
  </table>
  <script type="text/javascript">
    var btn = document.querySelector('button');
    var myTbody = document.getElementById("myTbody");
    btn.onclick = function () {
      // alert('ok')//测试
      // 发送ajax
      var xhr = new XMLHttpRequest();//new 是小写
      xhr.open('GET', 'https://api.github.com/users',true);//true是选择异步,false是同步
      //open 可以写成本地文件 'text.txt'代替'https://api.github.com/users'即可
      xhr.onreadystatechange = function () {
        if (xhr.readyState == 4 && xhr.status == 200) {
          console.log(xhr.responseText);//拿到了数据,是字符串数据类型
          //需要将字符串转为js对象
          var data = xhr.responseText;
          data = JSON.parse(data);
          // console.log(data);//变成了字符串数组
          var html = '';//不写空串则是,undefined数据类型,会输出undefined
          for (var i = 0; i < data.length; i++) {
            var result = data[i];
            html += "<tr>";
            //此处可以使用es6的模版字符串的方式进行改写,`${}`
            html += "<td>" + result.id + "</td><td>" + result.login + "</td><td><img src=' " + result.avatar_url + "'/></td><td>" + result.site_admin + "</td>"
            html += "</tr>";
          }
          myTbody.innerHTML = html;
          var trs = document.querySelectorAll('tr');
          for (var i = 0; i < trs.length; i++) {
            trs[i].onmouseover = function () {
              //逐行清除背景颜色
              for (var i = 0; i < trs.length; i++) {
                trs[i].style.backgroundColor = "";
              }
              //给当前行的元素添加高亮的背景颜色
              this.style.backgroundColor = "#eee";
            }
          }
        }
        /*
        可以将 function(a,b)改为(a,b)=>
        */
      }//readystatement发生改变的时候触发事件,激活函数
      xhr.send();//缺失该代码会导致获取不到数据
    }
  </script>

</body>

</html>

至此,结束。

如果你觉得这篇文章写的不错,多多点赞~收藏吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1241926.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Apache服务Rwrite功能使用

Rewrite也称为规则重写&#xff0c;主要功能是实现浏览器访问时&#xff0c;URL的跳转。其正则表达式是基于Perl语言。要使用rewrite功能&#xff0c;Apache服务器需要添加rewrite模块。如果使用源码编译安装&#xff0c;–enable-rewrite。有了rewrite模块后&#xff0c;需要在…

怎么快速卸载office365

怎么快速卸载office365 根据官网提供的两种解决方案即点即用或MSIMicrosoft Store 根据官网提供的两种解决方案 官网地址&#xff1a;https://support.microsoft.com/zh-cn/office/%E4%BB%8E-pc-%E5%8D%B8%E8%BD%BD-office-9dd49b83-264a-477a-8fcc-2fdf5dbf61d8#OfficeVersio…

visionOS空间计算实战开发教程Day 6 拖拽和点击

在之前的学习中我们在空间中添加了3D模型&#xff0c;但在初始摆放后就无法再对其进行移动或做出修改。本节我们在​​Day 5​​显示和隐藏的基础上让我们模型可以实现拖拽效果&#xff0c;同时对纯色的立方体实现点击随机换色的功能。 首先是入口文件&#xff0c;无需做出改变…

单元测试-java.lang.NullPointerException

报错信息 java.lang.NullPointerException 空指针异常 空对象引用 来源 对Controller层进行单元测试&#xff0c;解决完Spring上下文报错后继续报错。 解决 在测试方法执行前要为字段完成对象的注入&#xff0c;否则就报空指针异常。 测试例子 public class SysUserContr…

若依框架参数验证

文章目录 一、前端触发参数校验异常1.前端页面2.前端代码 二、后端触发参数校验异常1.前端页面2.后端报错 三、后端自定义参数验证1.添加注解2.触发后端校验 一、前端触发参数校验异常 1.前端页面 输入不符合校验规则的值来触发 2.前端代码 校验规则数组 表单的元素 修…

RTT打印在分区跳转后无法打印问题

场景&#xff1a; RTT打印仅占用JLINK的带宽&#xff0c;比串口传输更快更简洁&#xff0c;同时RTT可以使用jscope对代码里面的变量实时绘图显示波形&#xff0c;而采用串口打印波形无法实时打印。同时可以保存原始数据到本地进行分析&#xff0c;RTT在各方面完胜串口。 问题描…

【深度学习】Transformer简介

近年来&#xff0c;Transformer模型在自然语言处理&#xff08;NLP&#xff09;领域中横扫千军&#xff0c;以BERT、GPT为代表的模型屡屡屠榜&#xff0c;目前已经成为了该领域的标准模型。同时&#xff0c;在计算机视觉等领域中&#xff0c;Transformer模型也逐渐得到了重视&a…

CVE-2023-27524:Apache Superset未授权访问漏洞复现

文章目录 ​Apache Superset 未授权访问漏洞(CVE-2023-27524)复现0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.漏洞复现 0x06 修复建议 ​Apache Superset 未授权访问漏洞(CVE-2023-27524)复现 0x01 前言 免责声明&#xff1a;请勿利用文…

【追求卓越04】数据结构--栈与队列

引导 今天我们开始学习栈与队列的内容&#xff0c;我觉得栈并不难&#xff0c;所以篇幅也就不会那么多了。在虚拟空间中&#xff0c;栈是用户空间中的一种数据结构&#xff0c;它主要用于保存局部变量。那么问题来了&#xff0c;为什么用栈来保存局部变量&#xff0c;不用别的数…

【数据结构(四)】前缀、中缀、后缀表达式(逆波兰表达式)和逆波兰计算器的代码实现(2)

文章目录 1. 前缀表达式(波兰表达式)1.1. 前缀表达式的计算机求值 2. 中缀表达式3. 后缀表达式(逆波兰表达式)3.1. 后缀表达式的计算机求值3.2. 逆波兰计算器的实现 4. 中缀表达式 转 后缀表达式4.1. 思路分析4.2. 代码实现 5. 逆波兰计算器的完整版 1. 前缀表达式(波兰表达式)…

如何搭建Zblog网站并通过内网穿透将个人博客发布到公网

文章目录 1. 前言2. Z-blog网站搭建2.1 XAMPP环境设置2.2 Z-blog安装2.3 Z-blog网页测试2.4 Cpolar安装和注册 3. 本地网页发布3.1. Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 想要成为一个合格的技术宅或程序员&#xff0c;自己搭建网站制作网页是绕…

紫光展锐V8821荣获“中国芯”重大创新突破产品奖

近日&#xff0c;“中国芯”优秀产品评选落下帷幕&#xff0c;紫光展锐首颗5G IoT-NTN卫星通信SoC芯片V8821凭借在卫星通信前沿领域的技术创新&#xff0c;从285家芯片企业、398款芯片产品中脱颖而出&#xff0c;荣获第十八届“中国芯”年度重大创新突破产品奖。 “中国芯”优…

SeaTunnel及SeaTunnel Web部署指南(小白版)

现在你能搜索到的SeaTunnel的安装。部署基本都有坑&#xff0c;官网的文档也是见到到相当于没有&#xff0c;基本很难找到一个适合新手小白第一次上手就能成功安装部署的版本&#xff0c;于是就有了这个部署指南的分享&#xff0c;小主已经把可能遇到的坑都填过了&#xff0c;希…

代码随想录算法训练营Day 60 || 84.柱状图中最大的矩形

84.柱状图中最大的矩形 力扣题目链接(opens new window) 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 1 < heights.length <10^50 < hei…

2014年12月10日 Go生态洞察:Go 1.4版本发布

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Vue弹窗的使用与传值

使用element-UI中的Dialog 对话框 vue组件结合实现~~~~ 定义html <div click"MyAnalyze()">我的区划</div><el-dialog title"" :visible.sync"dialogBiomeVisible"><NationalBiome :closeValue"TypeBiome" cl…

【计算思维】蓝桥杯STEMA 科技素养考试真题及解析 6

1、明明买了一个扫地机器人&#xff0c;可以通过以下指令控制机器人运动: F:向前走 10 个单位长度 L:原地左转 90 度 R:原地右转 90 度 机器人初始方向向右&#xff0c;需要按顺序执行以下那条指令&#xff0c;才能打扫完下图中的道路 A、F-L-F-R-F-F-R-F-L-F B、F-R-F-L-F-F…

重磅!2023年两院院士增选名单公布

中国科学院 关于公布2023年中国科学院院士增选当选院士名单的公告 根据《中国科学院院士章程》《中国科学院院士增选工作实施办法&#xff08;试行&#xff09;》等规定&#xff0c;2023年中国科学院选举产生了59名中国科学院院士。 现予公布。 中国科学院 2023年11月22日…

YOLOv7独家改进: Inner-IoU基于辅助边框的IoU损失,高效结合 GIoU, DIoU, CIoU,SIoU 等 | 2023.11

💡💡💡本文独家改进:Inner-IoU引入尺度因子 ratio 控制辅助边框的尺度大小用于计算损失,并与现有的基于 IoU ( GIoU, DIoU, CIoU,SIoU )损失进行有效结合 推荐指数:5颗星 新颖指数:5颗星 收录: YOLOv7高阶自研专栏介绍: http://t.csdnimg.cn/tYI0c …

运动型蓝牙耳机什么牌子好?运动蓝牙耳机品牌推荐

​在运动时&#xff0c;一款好的运动耳机不仅可以让你享受高质量的音乐&#xff0c;还可以提供舒适的佩戴体验和稳定的连接。今天我就来向大家推荐几款备受好评的运动耳机&#xff0c;它们都拥有出色的音质和耐用的设计&#xff0c;是你运动时的绝佳伴侣。 NO1&#xff1a;南卡…