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

文章目录

  • 前文提要
  • 代码实现
    • 主要参考
    • 服务器渲染实现逻辑
    • 网页呈现效果
  • 代码分段讲解
    • 提要
    • 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>

至此,结束。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数字化转型过程中面临最大的问题是什么?如何借助数字化工具实现快速转型?

在科技快速发展的时代&#xff0c;数字化转型已经成为企业的重要战略。当企业努力适应数字化时代并取得成功时&#xff0c;他们可能会面临各种必须有效应对的挑战。   数字化转型不仅仅是将新技术应用到企业的运营中&#xff0c;还需要对企业的运营方式、与客户的互动方式和价…

多篇论文介绍-可变形卷积

01 具有双层路由注意力的 YOLOv8 道路场景目标检测方法 01 摘要: 随着机动车的数量不断增加&#xff0c;道路交通环境变得更复杂&#xff0c;尤其是光照变化以及复杂背景都会干扰目标检测算法的准确性和精度&#xff0c;同时道路场景下多变形态的目标也会给检测任务造成干扰&am…

计算机视觉的应用19-基于pytorch框架搭建卷积神经网络CNN的卫星地图分类问题实战应用

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下计算机视觉的应用19-基于pytorch框架搭建卷积神经网络CNN的卫星地图分类问题实战应用。随着遥感技术和卫星图像获取能力的快速发展&#xff0c;卫星图像分类任务成为了计算机视觉研究中一个重要的挑战。为了促进这一…

使用Python的turtle模块创建一幅哆啦A梦

1.1引言&#xff1a; 在Python中&#xff0c;turtle模块是一个非常有趣且强大的工具&#xff0c;它允许我们以一个可视化和互动的方式学习编程。通过调用各种命令&#xff0c;我们可以引导turtle画出一个指定的图形。在本博客中&#xff0c;我们将使用turtle模块来绘制一幅哆啦…

UML建模图文详解教程01——Enterprise Architect安装与使用

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Enterprise Architect概述 官方网站&#xff1a;https://www.sparxsystems.cn/products/ea/&#xff1b;图示如下&#xff1a; Enterprise Architect是一个全功能的、基于…

IDEA中注释快捷键及模板

单行注释 将光标放置于要注释所在行&#xff0c;使用 Ctrl /&#xff0c; 添加行注释&#xff0c;再次使用&#xff0c;去掉行注释 若需要将多行进行单行注释&#xff0c;只需要选中要注释的多行&#xff0c;然后使用 Ctrl /&#xff0c; 添加行注释&#xff0c;再次使用&a…

【Linux】权限理解【文件权限以及目录权限详解、以及umsk程序掩码知识详解】

权限理解 一、Linux权限的概念二、su [用户名] &#xff1a; 切换用户三、Linux权限管理文件&#xff08;一&#xff09;文件访问者的分类&#xff08;人&#xff09;&#xff08;二&#xff09;文件类型和访问权限&#xff08;事物属性&#xff09;&#xff08;1&#xff09;第…

【开源】基于JAVA的在线课程教学系统

项目编号&#xff1a; S 014 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S014&#xff0c;文末获取源码。} 项目编号&#xff1a;S014&#xff0c;文末获取源码。 目录 一、摘要1.1 系统介绍1.2 项目录屏 二、研究内容2.1 课程类型管理模块2.2 课程管理模块2…

tp8 使用rabbitMQ

php8.0 使用 rabbitmq 要使用 3.6版本以上的&#xff0c; 并且还要开启 php.ini中的 socket 扩展 php think make:command SimpleMQProduce //创建一个生产者命令行 php think make:command SimpleMQConsumer //创建一个消费者命令行 生产者代码 <?php declare (strict_ty…

SpringBoot:异步任务基础与源码剖析

官网文档&#xff1a;How To Do Async in Spring | Baeldung。 Async注解 Spring框架基于Async注解提供了对异步执行流程的支持。 最简单的例子是&#xff1a;使用Async注解修饰一个方法&#xff0c;那么这个方法将在一个单独的线程中被执行&#xff0c;即&#xff1a;从同步执…

【无标题】文本超过一行隐藏,鼠标经过显示提示框

创建一个组件专门用来出来文字的 <template><div class"tooltip-wrap"><el-tooltipref"tlp":content"text"effect"dark":disabled"!tooltipFlag":placement"placement"popper-class"tooltip…

centos查看空间使用情况

查看磁盘使用空间 df -h 查看该目录下其他目录的大小 du -sh *

基于Python实现的一个命令行文本计数统计程序,可统计纯英文txt文本中的字符数,单词数,句子数,Python文件行数

项目简介 这是一个用 Python 编写的命令行文本计数统计程序。 基础功能&#xff1a;能正确统计导入的 纯英文txt文本 中的 字符数&#xff0c;单词数&#xff0c;句子数。扩展功能&#xff1a;能正确统计导入的 Python 文件中的代码行数&#xff0c;注释行数&#xff0c;空白…

pip安装python包到指定python版本下

python -m pip install 包名1.命令行进入到指定python安装目录。比如我电脑上有python3.8也有python3.9。准备给python3.9安装指定的包

nginx国密ssl测试

文章目录 文件准备编译部署nginx申请国密数字证书配置证书并测试 文件准备 下载文件并上传到服务器&#xff0c;这里使用centos 7.8 本文涉及的程序文件已打包可以直接下载。 点击下载 下载国密版openssl https://www.gmssl.cn/gmssl/index.jsp 下载稳定版nginx http://n…

【Python】tensorboard实时查看模型训练过程的方法示例

本文对tensorboard实时查看模型训练过程的方法进行实例详解&#xff0c;以帮助大家理解和使用。 步骤1&#xff1a;查看训练过程保存的文件中是否有这个文件&#xff0c;红框内的。 步骤2&#xff1a;如果有&#xff0c;则打开终端&#xff0c;激活安装过tensorboard的环境。…

20231122给RK3399的挖掘机开发板适配Android12

20231122给RK3399的挖掘机开发板适配Android12 2023/11/22 9:30 主要步骤&#xff1a; rootrootrootroot-X99-Turbo:~$ tar --use-compress-programpigz -xvpf rk356x_android12_220722.tgz rootrootrootroot-X99-Turbo:~$ cd rk_android12_220722/ rootrootrootroot-X99-Tur…

C++ 标准模板库:容器

1. list 容器 1.1 初始化&#xff0c;获取读取 #include <iostream> #include<list>using namespace std;void printList(const list<int>&L){for(list<int>::const_iterator it L.begin(); it ! L.end(); it){cout << *it <<"…

让国内AI模型解题:滑动窗口中找出最大值,文心一言,通义千问错误率100%,讯飞星火略胜一筹

最近&#xff0c;一些大厂陆续放出了自己的AI模型&#xff0c;处于日常的使用和准确度&#xff0c;我通过一道试题来看一下文心一言、讯飞星火和通义千万的回答结果 本道题是一道很经典的算法题&#xff0c;请在滑动窗口中找出最大值 文心一言 第一次给出答案 package main…

Cypress-浏览器操作篇

Cypress-浏览器操作篇 页面的前进与后退 后退 cy.go(back); cy.go(-1);前进 cy.go(forward); cy.go(1);页面刷新 cy.reload() cy.reload(forceReload) cy.reload(options) cy.reload(forceReload, options)**options&#xff1a;**只有 timeout 和 log forceReload 是否…