使用原生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')//测试// 发送ajaxvar 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数据类型,会输出undefinedfor (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.hqwc.cn/news/210643.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

交通管理中的利器:揭秘交通监控大屏的优势和应用场景

交通监控大屏是一种用于监控交通情况的大屏展示方式&#xff0c;能够实时展示交通状况、车流量、车速等数据&#xff0c;为交通管理提供数据支持和决策参考。本文将介绍交通监控大屏的优势、应用场景和未来发展趋势。 一、交通监控大屏的优势 交通监控大屏的主要优势包括&…

【python海洋专题四十七】风速的风羽图

【python海洋专题四十七】风速的风羽图 图片 往期推荐 图片 【python海洋专题一】查看数据nc文件的属性并输出属性到txt文件 【python海洋专题二】读取水深nc文件并水深地形图 【python海洋专题三】图像修饰之画布和坐标轴 【Python海洋专题四】之水深地图图像修饰 【Pyth…

Cookie与Session

文章目录 Cookie的介绍Cookie的由来什么是CookieCookie原理Cookie覆盖浏览器查看Cookie 在Django中操作Cookie设置Cookie查询浏览器携带的Cookie删除Cookie Cookie校验登录sessionSession的由来Session设置查看、更新Session值删除Session值Seesion的其他方法Session的其他配置…

JAVA爬虫2 - Jsoup解析、对接MySQL、多线程爬虫、json库使用

官网:https://jsoup.org/download Jsoup是一款基于Java的HTML解析器,它可以方便地从网页中抓取和解析数据。它的主要作用是帮助开 发者处理HTML文档,提取所需的数据或信息。下面介绍几个常用的API: 选择器(Selector)API:用于根据CSS选择器语法选择HTML元素。 属性(Attribute…

PTA-使用函数求最大公约数

本题要求实现一个计算两个数的最大公约数的简单函数。 函数接口定义&#xff1a; int gcd( int x, int y ); 其中x和y是两个正整数&#xff0c;函数gcd应返回这两个数的最大公约数。 裁判测试程序样例&#xff1a; #include <stdio.h> int gcd( int x, int y ); i…

海外媒体推广发稿平台这8种方法助你一臂之力-华媒舍

在全球经济一体化和信息技术快速进步的背景下&#xff0c;海外市场的开拓对于企业的发展至关重要。要在海外市场上取得成果并非易事&#xff0c;因此我们需要借助一些方法来帮助我们取得成功。其中&#xff0c;海外媒体推广发稿平台是非常有效的工具之一。本文将介绍8种方法&am…

使用 css 实现文字单行居右, 换行居左展示

给外层盒子设置居右展示, 子盒子设置居左。 原理是&#xff0c;如果子盒子没有换行&#xff0c;那么子盒子的长度就是内容的长度&#xff0c;它根本没有空间将字体移动居左&#xff0c;父盒子的居左样式就会生效&#xff0c;子盒子就会居左展示。 当子盒子里面的文字换行了&…

【RtpRtcp】3: webrtc m79:video 相关创建及切片、发送

m79 的 客户端代码流程。 对于视频帧: CreateRtpStreamSenders 管理一组RtpStreamSender ,每一个RtpStreamSender 都进行rtp包的发送: 具体发送是RTPSenderVideo 处理,RTPSenderVideo 对收到的h264 帧,进行帧分片rtp,然后一组包一起使用LogAndSendToNetwork 发送的。 Rtp…

Linux:虚拟机安装Ubuntu系统

一、下载Ubuntu 地址&#xff1a;https://cn.ubuntu.com/download/desktop 二、安装 以上配置完成后&#xff0c;点击完成按钮&#xff0c;接下来就是一段较长时间的等待安装过程。 安装完成后&#xff0c;还有一些系统性配置。 系统配置非常简单&#xff0c;全部next即可。…

安卓手机好用的清单软件有哪些?

生活中每个人都有丢三落四的习惯&#xff0c;伴随着生活节奏的加快&#xff0c;人们常忘事的情况会更加频繁的出现&#xff0c;这时候很多人就开始选择手机上记录清单类的软件&#xff0c;安卓手机在手机市场中占有很大的分量&#xff0c;在安卓手机上好用的记录清单的软件有哪…

如何通过类似于Android adb install apk 命令安装三方Harmony Hap包

安装命令 hdc install xxx.hapOpenHarmony设备安装Hap应用的五种方式 https://www.51cto.com/article/762223.htmlhttps://www.51cto.com/article/762223.html DevEco Studio 3.1为例新建个项目&#xff0c;点击File->Project Structure 进入签名页面然后点击Sign in登录华…

linux删除oracle数据库:如何在Linux系统中删除Oracle数据库

停止Oracle数据库服务&#xff1a;# su - oracle 1. 停止Oracle数据库服务&#xff1a; # su - oracle $ sqlplus / as sysdba SQL> SHUTDOWN IMMEDIATE; 2. 删除oracle安装目录&#xff1a; # rm -rf /u01/app/oracle 3. 删除oracle用户和组&#xff1a; # userdel…