jsAPI

環境準備

1 安裝nvm

nvm 即 (node version manager),好處是方便切換 node.js 版本

安裝注意事項

  1. 要卸載掉現有的 nodejs
  2. 提示選擇 nvm 和 nodejs 目錄時,一定要避免目錄中出現空格
  3. 選用【以管理員身份運行】cmd 程序來執行 nvm 命令
  4. 首次運行前設置好國內鏡像地址
nvm npm_mirror https://npmmirror.com/mirrors/npm/
nvm node_mirror https://npmmirror.com/mirrors/node/

首先查看有哪些可用版本

nvm list available

建議安裝 LTS(長期支持版)

nvm install 16.16.0
nvm install 14.20.0

執行 nvm list 會列出已安裝版本
切換到 16.16.0

nvm use 16.16.0

安裝后 nvm 自己的環境變量會自動添加,但可能需要手工添加 nodejs 的 PATH 環境變量

2 檢查npm

npm 是 js 的包管理器,就類似于 java 界的 maven,要確保它使用的是國內鏡像
檢查鏡像

npm get registry

3 搭建前端服務器

新建一個保存項目的 client 文件夾,進入文件夾執行

npm install express --save-dev

修改 package.json 文件

{"type": "module","devDependencies": {"express": "^4.18.1"}
}
  • 其中 devDependencies 是 npm install --save-dev 添加的

編寫 main.js 代碼

import express from 'express'
const app = express()app.use(express.static('./'))
app.listen(7070)

執行 js 代碼(運行前端服務器)

node main.js

前端案例

在這里插入圖片描述

  • 前端只有靜態頁面,使用 Express 服務器
  • 后端使用 Tomcat 服務器,通過 SpringBoot、MyBatis 等框架獲取數據庫數據

1 查找元素

  • document.getElementById - 根據 id 值查找一個元素
  • [document|元素].querySelector - 根據選擇器查找第一個匹配元素
  • [document|元素].querySelectorAll - 根據選擇器查找所有匹配元素

例如,有下面的 html 代碼

<div><div class="title">學生列表</div><div class="thead"><div class="row bold"><div class="col">編號</div><div class="col">姓名</div><div class="col">性別</div><div class="col">年齡</div></div></div><div class="tbody"><div class="row"><div class="col">1</div><div class="col">張三</div><div class="col"></div><div class="col">18</div></div></div>
</div>

執行

document.querySelector('.title'); // 找到 <div class="title">學生列表</div>

執行

document.querySelector('.col'); // 找到 <div class="col">編號</div>

執行

document.querySelectorAll('.col');/*找到的是一個集合<div class="col">編號</div><div class="col">姓名</div><div class="col">性別</div><div class="col">年齡</div><div class="col">1</div><div class="col">張三</div><div class="col">男</div><div class="col">18</div>
*/

執行

const thead = document.querySelector('.thead');// 只在 thead 元素范圍內找
thead.querySelectorAll('.col');/*找到的是一個集合<div class="col">編號</div><div class="col">姓名</div><div class="col">性別</div><div class="col">年齡</div>
*/

根據 id 屬性查找既可以用

document.getElementById("id值")

也可以用

document.querySelector("#id值")
2) 修改元素內容
  • 元素.innerHTML
  • 元素.textContent

例如

document.querySelector('.title').innerHTML = '俠客列表'

innerHTML 會解析內容中的標簽
在這里插入圖片描述

textContext 不會解析內容中的標簽
在這里插入圖片描述

給 innerHTML 或 textContent 賦值空串,可以實現清空標簽內容的效果

3 利用模版

<div><div class="title">學生列表</div><div class="thead"><div class="row bold"><div class="col">編號</div><div class="col">姓名</div><div class="col">性別</div><div class="col">年齡</div></div></div><div class="tbody"></div>
</div><template id="tp"><div class="row"><div class="col">xx</div><div class="col">xx</div><div class="col">xx</div><div class="col">xx</div></div>
</template><script>// 將來這些數據從 java 端返回let array = [{ id: 1, name: '張三', sex: '男', age: 18 },{ id: 2, name: '李四', sex: '女', age: 17 }];const tp = document.getElementById("tp");const row = tp.content;const [c1,c2,c3,c4] = row.querySelectorAll(".col");const tbody = document.querySelector('.tbody');for(const {id,name,sex,age} of array) {c1.textContent = id;c2.textContent = name;c3.textContent = sex;c4.textContent = age;// 復制元素const newRow = document.importNode(row, true);// 建立父子關系,左邊父,右邊子tbody.appendChild(newRow);}
</script>

4 Fetch API

Fetch API 可以用來獲取遠程數據,它有兩種方式接收結果,同步方式與異步方式

格式

fetch(url, options) // 返回 Promise

同步方式

const 結果 = await Promise
// 后續代碼
  • await 關鍵字必須在一個標記了 async 的 function 內來使用
  • 后續代碼不會在結果返回前執行

異步方式

Promise.then(結果 => { ... })
// 后續代碼                 
  • 后續代碼不必等待結果返回就可以執行

例:

在 express 服務器上有 students.json 文件

[{ "id": 1, "name": "張三", "sex": "男", "age": 18 },{ "id": 2, "name": "李四", "sex": "女", "age": 17 }
]

現在用 fetch api 獲取這些數據,并展示

同步方式

<script>async function findStudents() {try {// 獲取響應對象const resp = await fetch('students.json')// 獲取響應體, 按json格式轉換為js數組const array = await resp.json();// 顯示數據const tp = document.getElementById("tp");const row = tp.content;const [c1,c2,c3,c4] = row.querySelectorAll(".col");const tbody = document.querySelector('.tbody');for(const {id,name,sex,age} of array) {c1.textContent = id;c2.textContent = name;c3.textContent = sex;c4.textContent = age;// 復制元素const newRow = document.importNode(row, true);// 建立父子關系tbody.appendChild(newRow);}} catch (e) {console.log(e);}}findStudents()
</script>
  • fetch(‘students.json’) 內部會發送請求,但響應結果不能立刻返回,因此 await 就是等待響應結果返回
  • 其中 resp.json() 也不是立刻能返回結果,它返回的也是 Promise 對象,也要配合 await 取結果

異步方式

<script>fetch('students.json').then( resp => resp.json() ).then( array => {// 顯示數據const tp = document.getElementById("tp");const row = tp.content;const [c1,c2,c3,c4] = row.querySelectorAll(".col");const tbody = document.querySelector('.tbody');for(const {id,name,sex,age} of array) {c1.textContent = id;c2.textContent = name;c3.textContent = sex;c4.textContent = age;// 復制元素const newRow = document.importNode(row, true);// 建立父子關系tbody.appendChild(newRow);}}).catch( e => console.log(e) )</script>
  • 第一個 then 是在響應返回后,才會調用它里面的箭頭函數,箭頭函數參數即 resp 響應對象
  • 第二個 then 是在 json 解析完成后,才會調用它里面的箭頭函數,箭頭函數參數即解析結果(本例是 array 數組)
  • 上一個 then 返回的是 Promise 對象時,才能鏈式調用下一個 then

跨域問題

  • 只要協議、主機、端口之一不同,就不同源,例如
    • http://localhost:7070/a 和 https://localhost:7070/b 就不同源
  • 同源檢查是瀏覽器的行為,而且只針對 fetch、xhr 請求
    • 如果是其它客戶端,例如 java http client,postman,它們是不做同源檢查的
    • 通過表單提交、瀏覽器直接輸入 url 地址這些方式發送的請求,也不會做同源檢查

請求響應頭解決
在這里插入圖片描述

  • fetch 請求跨域,會攜帶一個 Origin 頭,代表【發請求的資源源自何處】,目標通過它就能辨別是否發生跨域
    • 我們的例子中:student.html 發送 fetch 請求,告訴 tomcat,我源自 localhost:7070
  • 目標資源通過返回 Access-Control-Allow-Origin 頭,告訴瀏覽器【允許哪些源使用此響應】
    • 我們的例子中:tomcat 返回 fetch 響應,告訴瀏覽器,這個響應允許源自 localhost:7070 的資源使用

代理解決
在這里插入圖片描述

npm install http-proxy-middleware --save-dev

在 express 服務器啟動代碼中加入

import {createProxyMiddleware} from 'http-proxy-middleware'// ...app.use('/api', createProxyMiddleware({ target: 'http://localhost:8080', changeOrigin: true }));

fetch 代碼改為

const resp = await fetch('http://localhost:7070/api/students')

const resp = await fetch('/api/students')

5 模塊化

單個導出 const、let、function

export const a = 10;
export let b = 20;
export function c() {console.log('c');
}

一齊導出

const a = 10;
let b = 20;
function c() {console.log('c')
}export {a,b,c}

導出 default,只能有一個

export const a = 10;
export let b = 20;
export function c() {console.log('c')
}export default b;

import 語法

<script type="module">import 語句
</script>
  • import 需要遵循同源策略

整個導入

import * as module from '/1.js'
console.log(module.a)		// 輸出10
console.log(module.b)		// 輸出20
module.c()					// 輸出c

單個導入

import {a,c} from '/1.js'
console.log(a)				// 輸出10
c()							// 輸出c

導入默認

import x from '/1.js'
console.log(x)				// 輸出20

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/80470.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/80470.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/80470.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SCDN是什么?

SCDN是安全內容分發網絡的簡稱&#xff0c;它在傳統內容分發網絡&#xff08;CDN&#xff09;的基礎上&#xff0c;集成了安全防護能力&#xff0c;旨在同時提升內容傳輸速度和網絡安全性。 SCDN的核心功能有&#xff1a; DDoS防御&#xff1a;識別并抵御大規模分布式拒絕服務…

Qt/C++開發監控GB28181系統/實時視頻預覽/視頻點播/rtp解包解碼顯示

一、前言 通過gb28181做實時視頻預覽&#xff0c;也就是視頻點播功能&#xff0c;是最重要的功能了&#xff0c;絕對是整個系統排第一重要的&#xff0c;這就是核心功能&#xff0c;什么設備注冊、獲取通道等都是為了實時預覽做準備的&#xff0c;當然這個功能也是最難的&…

找銀子 題解(c++)

題目 思路 首先&#xff0c;這道題乍一看&#xff0c;應該可以用搜索來做。 但是&#xff0c;搜索會不會超時間限制呢&#xff1f; 為了防止時間超限,我們可以換一種做法。 先創立兩個二維數組&#xff0c;一個是輸入的數組a&#xff0c;一個是數組b。 假設 i 行 j 列的數…

子集樹算法文檔

1.算法概述 子集樹是一種 回溯算法&#xff0c;用于生成一個集合的所有子集。給定一個數組 arr&#xff0c;該算法遞歸地遍歷所有可能的子集&#xff0c;并通過一個輔助數組 x 標記當前元素是否被選中。 2.算法特點 時間復雜度&#xff1a;O(2n)&#xff08;因為一個包含 n 個…

HTTP/1.1 host虛擬主機詳解

一、核心需求&#xff1a;為什么需要虛擬主機&#xff1f; 在互聯網上&#xff0c;我們常常希望在一臺物理服務器&#xff08;它通常只有一個公網 IP 地址&#xff09;上運行多個獨立的網站&#xff0c;每個網站都有自己獨特的域名&#xff08;例如 www.a-site.com?, www.b-s…

amass:深入攻擊面映射和資產發現工具!全參數詳細教程!Kali Linux教程!

簡介 OWASP Amass 項目使用開源信息收集和主動偵察技術執行攻擊面網絡映射和外部資產發現。 此軟件包包含一個工具&#xff0c;可幫助信息安全專業人員使用開源信息收集和主動偵察技術執行攻擊面網絡映射并執行外部資產發現。 使用的信息收集技術 技術數據來源APIs&#xf…

Spring Web MVC響應

返回靜態頁面 第一步 創建html時&#xff0c;要注意創建的路徑&#xff0c;要在static下面 第二步 把需要寫的內容寫到body內 第三步 直接訪問路徑就可以 返回數據ResponseBody RestController Controller ResponseBody Controller&#xff1a;返回視圖 ResponseBody&…

?鴻蒙PC正式發布:國產操作系統實現全場景生態突破

鴻蒙PC正式發布&#xff1a;國產操作系統實現全場景生態突破? 2025年5月8日&#xff0c;華為在深圳舉辦發布會&#xff0c;正式推出搭載鴻蒙操作系統的個人電腦&#xff08;PC&#xff09;&#xff0c;標志著國產操作系統在核心技術與生態布局上實現歷史性跨越。此次發布的鴻蒙…

【計算機視覺】OpenCV實戰項目:Text-Extraction-Table-Image:基于OpenCV與OCR的表格圖像文本提取系統深度解析

Text-Extraction-Table-Image&#xff1a;基于OpenCV與OCR的表格圖像文本提取系統深度解析 1. 項目概述2. 技術原理與算法設計2.1 圖像預處理流水線2.2 表格結構檢測算法2.3 OCR優化策略 3. 實戰部署指南3.1 環境配置3.2 核心代碼解析3.3 執行流程示例 4. 常見問題與解決方案4.…

Redis BigKey 問題是什么

BigKey 問題是什么 BigKey 的具體表現是 redis 中的 key 對應的 value 很大&#xff0c;占用的 redis 空間比較大&#xff0c;本質上是大 value 問題。 BigKey怎么找 redis-cli --bigkeysscanBig Key 產生的原因 1.redis數據結構使用不恰當 2.未及時清理垃圾數據 3.對業務預…

go-gin

前置 gin是go的一個web框架&#xff0c;我們簡單介紹一下gin的使用 導入gin &#xff1a;"github.com/gin-gonic/gin" 我們使用import導入gin的包 簡單示例&#xff1a; package mainimport ("github.com/gin-gonic/gin" )func main() {r : gin.Default(…

C# NX二次開發:判斷兩個體是否干涉和獲取系統日志的UFUN函數

大家好&#xff0c;今天要講關于如何判斷兩個體是否干涉和獲取系統日志的UFUN函數。 &#xff08;1&#xff09;UF_MODL_check_interference&#xff1a;這個函數的定義為根據單個目標體檢查每個指定的工具體是否有干擾。 Defined in: uf_modl.h Overview Checks each sp…

如何解決 Linux 系統文件描述符耗盡的問題

在Linux系統中&#xff0c;文件描述符&#xff08;File Descriptor, FD&#xff09;是操作系統管理打開文件、套接字、管道等資源的抽象標識。當進程或系統耗盡文件描述符時&#xff0c;會導致服務崩潰、連接失敗等嚴重問題。以下是詳細的排查和解決方案&#xff1a; --- ###…

LVGL簡易計算器實戰

文章目錄 &#x1f4c1; 文件結構建議&#x1f539; eval.h 表達式求值頭文件&#x1f539; eval.c 表達式求值實現文件&#xff08;帶詳細注釋&#xff09;&#x1f539; ui.h 界面頭文件&#x1f539; ui.c 界面實現文件&#x1f539; main.c 主函數入口? 總結 項目效果&…

使用countDownLatch導致的線程安全問題,線程不安全的List-ArrayList,線程安全的List-CopyOnWriteArrayList

示例代碼 package com.example.demo.service;import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;public class UnSafeCDTest {Executor…

ALLinSSL:一站式SSL證書管理解決方案

引言 在當今互聯網安全日益重要的背景下,SSL證書已成為保護網站安全的必備工具。然而,管理多個SSL證書常常是一項繁瑣且容易出錯的任務。ALLinSSL應運而生,它提供了一個一站式的SSL證書管理解決方案,大大簡化了證書的申請、安裝和更新過程。本文將深入介紹ALLinSSL的特性、…

嵌入式通信協議總覽篇:萬物互聯的基石

嵌入式系統的世界,是靠協議“說話”的世界。 在你設計一個智能設備、構建一個工業控制系統、開發一款 IoT 網關時,一個核心問題始終繞不開:**這些設備之間如何“對話”?**答案就是——通信協議。 本篇作為系列第一章,將帶你全面理解嵌入式通信協議的全貌,為后續深入學習…

【數據結構】紅黑樹(C++)

目錄 一、紅黑樹的概念 二、紅黑樹的性質 三、紅黑樹結點定義 四、紅黑樹的操作 1. 插入操作 1.1 插入過程 1.2 調整過程 1.2.1 叔叔節點存在且為紅色 1.2.2 叔叔節點存在且為黑色 1.2.3 叔叔節點不存在 2. 查找操作 2.1 查找邏輯 2.2 算法流程圖 2.3 使用示例 …

Oracle數據庫DBF文件收縮

這兩天新部署了一套系統&#xff0c;數據庫結構保持不變&#xff0c;牽扯導出表結構還有函數&#xff0c;圖省事就直接新建用戶&#xff0c;還原數據庫了。然后咔咔咔&#xff0c;一頓刪除delete&#xff0c;truncate&#xff0c;發現要不就是表刪了&#xff0c;還有num_rows&a…