Ajax------免刷新地前后端交互

本文略帶PHP代碼需要在PHP環境下使用

介紹

????????AJAX (Asynchronous JavaScript and XML) 是一種創建快速動態網頁應用的開發技術,它允許網頁在不重新加載整個頁面的情況下,與服務器交換數據并更新部分網頁內容。例如,在我們做爬蟲的時候發現有些頁面可以打開圖片、視頻等資源,但是無論我們怎么查找都無法查到資源的url到底在哪里,這就說明網頁很有可能把資源的url藏在了javascript的代碼中,通過XMLHttpRequest 對象向后端發送請求,在前端篩選處理信息并呈現出來。

XMLHttpRequest 對象

????????所有現代瀏覽器均支持 XMLHttpRequest 對象。XMLHttpRequest 用于在后臺與服務器交換數據。這意味著可以在不重新加載整個網頁的情況下,對網頁的某部分進行更新。

? ? ? ? 在這個html的代碼中,我們設置了一個按鈕,點擊這個按鈕就會觸發函數ajax(),在ajax函數中,我們首先創建了一個XMLHttpRequest對象,接下來使用我們創建的對象向指定的url發送get請求,在加載完畢后(onreadystatechange)以后就會觸發匿名函數,把請求的內容放到id為aj的標簽里面。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>ajax</title><script>function ajax() {var xhr = new XMLHttpRequest();xhr.onreadystatechange = function() {if (xhr.readyState == 4 && xhr.status == 200) {document.getElementById("aj").innerHTML = xhr.responseText;}}xhr.open("GET", "http://127.0.0.1:8000/a", true);xhr.send();}</script>
</head>
<body><button onclick="ajax()">click me</button><div id="aj"></div>
</body>
</html>

? ? ? ? 我們創建了一個服務器監聽8000端口,并且設置這個網頁的url為……/a,但是我們使用瀏覽器打開html文件以后發現,怎么點擊按鈕都打不開。

? ? ? ? 在束手無策的時候,我們不得已打開抓包工具,然后查看console(終端)發現它給我們的提示是:

? ? ? ? 這個報錯給我們的提示大概內容是不允許我們的內容跨站加載(瀏覽器的同源策略),于是要想訪問127.0.0.1:8000我們現在要做的就是把這個html文件也放到對應的url上。為了更快加載這些資源,我們這次選擇php語言做服務端。

<?php$request_url = $_SERVER['REQUEST_URI'];$request_url = rtrim($request_url, '/');$request_url = ltrim($request_url, '/') ;switch($request_url){case 'a':echo "Hello from A";break;case 'b':if(file_exists("1.html")){include("1.html");                }else{echo "not found file 1.html";}break;default:echo "404 Not Found";break;}
?>

????????這個代碼的大致思路是通過$_SERVER['REQUEST_URL']獲得我們輸入的url,在接下來的rtrim和ltrim函數中,我們把獲得的url前后的'/'去掉,接下來通過switch根據不同的url向客戶端返回不同的網頁。之后我們在終端輸入php -S 127.0.0.1:8000 filename.php這樣我們的服務器就會運行在指定的端口。

? ? ? ? 再在終端打開測試即可。

? ? ? ? 接下來我們點擊按鈕后發現,瀏覽器沒有刷新頁面就給我們加載出來了想要的信息。

onkeyup

? ? ? ? 在上面的代碼中,我們每次點擊按鈕都會給我們進行一次請求,但是這樣使用起來顯然有點麻煩,我們如果輸入某些驗證類的東西,每次都要重新點擊會加重我們的負擔,那么在html標簽中給我們準備了onkeyup,讓我們可以改變輸入的值以后就會被瀏覽器檢測到,進而讓我們不再需要點擊,而是直接輸入改變值就可以和后端對接。

????????onkeyup 是一個HTML事件屬性,用于在用戶釋放鍵盤上的某個鍵時觸發指定的 JavaScript 函數或代碼。這個事件通常用于捕獲用戶在輸入框中輸入的內容,并在用戶停止輸入時執行某些操作,例如實時搜索、驗證輸入或動態更新頁面內容。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>sub</title><script>function showHint(str) {if (str.length == 0) {document.getElementById("hint").innerHTML = "";return;} else {var xmlhttp = new XMLHttpRequest();xmlhttp.onreadystatechange = function() {if (this.readyState == 4 && this.status == 200) {document.getElementById("hint").innerHTML = this.responseText;}};xmlhttp.open("GET", "http://127.0.0.1:8000/sub?id=" + str, true);xmlhttp.send();}}</script>
</head>
<body><input type="text" onkeyup="showHint(this.value)"><div id = "hint"></div>
</body>
</html>

? ? ? ? 在測試的過程中,我做了這樣的一個前端代碼,有一個文本輸入的input我們每次輸入數據都可以觸發函數showHint()。接下來我們看一下服務端怎么構造。

<?php$request_url = $_SERVER['REQUEST_URI'];$request_url = rtrim($request_url, '/');$parsed_url = parse_url($request_url);$path = $parsed_url['path'] ?? '';$query = $parsed_url['query'] ?? '';$path = ltrim($path, '/');switch($path){case 'a':echo "Hello from A";break;case 'b':if(file_exists("1.html")){include("1.html");                }else{echo "not found file 1.html";}break;case 'sub':parse_str($query, $query_params);$id = $query_params['id'] ?? '';if(!isset($id) || empty($id)){include("2.html");}else if($id === '1'){echo "這是1";}else if($id === '2'){echo "這是2";}else{echo "not found";}break;default:echo "404 Not Found";break;}
?>

????????在這個代碼中,我們輸入的url為……/sub時就會呈現html文件,里面是一個輸入框。我們可以傳入參數,html文件會給我們的服務端發送帶著id參數的請求,而不同的id則會觸發不同的提示。

fetch函數

????????Fetch API 是一種現代的、功能強大的網絡請求工具,它允許你通過 JavaScript 異步地請求資源,而不需要使用傳統的 XMLHttpRequest 對象。Fetch API 可以簡潔地發起 HTTP 請求,并處理服務器的響應。Fetch API 基于 Promise 設計,使得異步操作更加簡潔和易于理解。

? ? ? ? fetch函數的使用會讓你的代碼更加易讀,使用它處理url會讓代碼更加優雅。它的基本使用方法是:

fetch(url).then(response => response.json()) // 解析 JSON 數據.then(data => console.log(data))   // 處理數據.catch(error => console.error('Error:', error)); // 錯誤處理

我們按照這種方法修改一下2.html的代碼。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>sub</title><script>function showHint(str) {if (str.length == 0) {document.getElementById("hint").innerHTML = "";return;} else {fetch("http://127.0.0.1:8000/sub?id=" + str).then(response => response.json()).then(data => {document.getElementById("hint").innerHTML = data.result;}).catch(error => console.log(error));}}</script>
</head>
<body><input type="text" onkeyup="showHint(this.value)"><div id = "hint"></div>
</body>
</html>

? ? ? ? 注意:一定要按照1.加載數據2.處理數據3.捕獲異常的順序,1和2不能合并在一起,因為js沒有多線程的編程方法,這就導致了它的異步工作處理非常發達,如果1和2寫在一起,就會導致,數據還沒有從服務器發過來就被開始處理,這通常會導致報錯。

? ? ? ? 測試后發現和之前相同,能正常使用

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

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

相關文章

Android 中支持舊版 API 的方法(API 30)

Android 中最新依賴庫的版本支持 API 31 及以上版本&#xff0c;若要支持 API30&#xff0c;則對應的依賴庫的版本就需要使用舊版本。 可通過修改模塊級 build.gradle 文件來進行適配。 1、android 標簽的 targetSdk 和 compileSdk 版本號 根據實際目標設備的 android 版本來…

JDBC注入無外網(上):從HertzBeat聊聊SnakeYAML反序列化

上周日聯合Ar3h 師傅一起&#xff0c;在【代碼審計知識星球】里發布了一個Springboot的小挑戰&#xff1a;https://t.zsxq.com/tSBBZ&#xff0c;這個小挑戰的核心目標是在無法連接外網的情況下&#xff0c;如何利用PSQL JDBC注入漏洞。我會分兩篇文章來講講Java安全的不出網利…

QTreeWidget 手動設置選中項后不高亮的問題

當使用Qt編程QTreeWidget setCurrentItem() 方法設置 QTreeWidget 的當前項時&#xff0c;如果發現選中項顯示為灰色而不是高亮狀態&#xff0c;這通常是由以下幾個原因導致的&#xff1a; 方法1. 焦點問題 ? 確保 QTreeWidget 有焦點 ? 解決方案&#xff1a; cpp treeWidge…

javaSE學習(前端基礎知識)

文章目錄 前言一、HTML1、< th >、< tr > 和 < td >標簽&#xff1a;2、< button > 標簽&#xff1a;3、< input type"text" >&#xff1a;4、< br >&#xff1a; 二、CSS1、選擇器2、聲明塊3、常用屬性及值 三、JS1、Vue 實例對…

c# 數據結構 鏈表篇 有關單鏈表的一切

本人能力有限,本文僅作學習交流與參考,如有不足還請斧正 目錄 0.單鏈表好處 0.5.單鏈表分類 1.無虛擬頭節點情況 圖示: 代碼: 頭插/尾插 刪除 搜索 遍歷全部 測試代碼: 全部代碼 2.有尾指針情況 尾插 全部代碼 3.有虛擬頭節點情況 全部代碼 4.循環單鏈表 幾個…

藍橋杯C++組算法知識點整理 · 考前突擊(上)【小白適用】

【背景說明】本文的作者是一名算法競賽小白&#xff0c;在第一次參加藍橋杯之前希望整理一下自己會了哪些算法&#xff0c;于是有了本文的誕生。分享在這里也希望與眾多學子共勉。如果時間允許的話&#xff0c;這一系列會分為上中下三部分和大家見面&#xff0c;祝大家競賽順利…

pipe匿名管道實操(Linux)

管道相關函數 1 pipe 是 Unix/Linux 系統中的一個系統調用&#xff0c;用于創建一個匿名管道 #include <unistd.h> int pipe(int pipefd[2]); 參數說明&#xff1a; pipefd[2]&#xff1a;一個包含兩個整數的數組&#xff0c;用于存儲管道的文件描述符&#xff1a; pi…

centos-stream-9上安裝nvidia驅動和cuda-toolkit

這里寫目錄標題 驅動安裝1. 更新系統2. NVIDIA GPU安裝檢查系統是否安裝了 NVIDIA GPU2.1 首先&#xff0c;使用以下命令更新 DNF 軟件包存儲庫緩存&#xff1a;2.2 安裝編譯 NVIDIA 內核模塊所需的依賴項和構建工具2.3 在 CentOS Stream 9 上添加官方 NVIDIA CUDA 軟件包存儲庫…

LDAP高效數據同步:Syncrepl復制模式實戰指南

#作者&#xff1a;朱雷 文章目錄 一、Syncrepl 復制簡介1.1. 什么是復制模式1.2. 什么是 syncrepl同步復制 二、Ldap環境部署三、配置復制類型3.1. 提供者端配置3.2. 消費者端配置3.3.啟動服務3.4.測試同步是否生效 四、總結 一、Syncrepl 復制簡介 1.1. 什么是復制模式 Ope…

Linux 內核網絡協議棧中的 struct packet_type:以 ip_packet_type 為例

在 Linux 內核的網絡協議棧中,struct packet_type 是一個核心數據結構,用于注冊特定協議類型的數據包處理邏輯。它定義了如何處理特定協議的數據包,并通過協議類型匹配機制實現協議分發。本文將通過分析 ip_packet_type 的定義和作用,深入探討其在網絡協議棧中的重要性。 …

QT Sqlite數據庫-教程001 創建數據庫和表-下

【1】創建帶名稱的數據庫 #include <QtSql/QSqlDatabase> #include <QtSql/QSqlQuery> #include <QtSql/QSqlRecord> QString path QDir::currentPath(); QApplication::addLibraryPath(pathQString("/release/plugins")); QPluginLoader loader…

Cannot find module ‘vue‘ or its corresponding type declarations

在使用vue3vite創建新的工程時&#xff0c;在新增.vue文件時會出現Cannot find module vue這個錯誤。 只需要我們在項目中的.d.ts文件中添加以下代碼即可 declare module *.vue {import { defineComponent } from vue;const component: ReturnType<typeof defineComponent&…

SSRF打靶總結

文章目錄 一. PortSwigger1、本地服務器的基本SSRF2、基本的目標不是漏洞機3、Referer標頭的外帶SSRF4、簡單黑名單的SSRF黑名單繞過思路&#xff1a; 5、重定向的SSRF6. 簡單的白名單SSRF白名單繞過思路&#xff1a; 二、BWAPP1. SSRF 文件包含漏洞 | 內網探測2. XXE -> S…

STL-函數對象

1.函數對象 1.1 概念 重載函數調用操作符的類&#xff0c;其對象被稱為函數對象 函數對象使用重載的&#xff08;&#xff09;時&#xff0c;行為類似函數調用&#xff0c;也成為仿函數 本質&#xff1a;函數對象&#xff08;仿函數&#xff09;是一個類&#xff0c;不是一…

多線程(Java)

注&#xff1a;本文為本人學習過程中的筆記 1.導入 1.進程和線程 我們希望我們的程序可以并發執行以提升效率&#xff0c;此時引入了多進程編程。可是創建進程等操作開銷太大&#xff0c;于是就將進程進一步拆分成線程&#xff0c;減少開銷。進程與進程之間所涉及到的資源是…

在 Dev-C++中編譯運行GUI 程序介紹(三)有趣示例一組

在 Dev-C中編譯運行GUI程序介紹&#xff08;三&#xff09;有趣示例一組 前期見 在 Dev-C中編譯運行GUI 程序介紹&#xff08;一&#xff09;基礎 https://blog.csdn.net/cnds123/article/details/147019078 在 Dev-C中編譯運行GUI 程序介紹&#xff08;二&#xff09;示例&a…

【高校主辦】2025年第四屆信息與通信工程國際會議(JCICE 2025)

重要信息 會議網址&#xff1a;www.jcice.org 會議時間&#xff1a;2025年7月25-27日 召開地點&#xff1a;哈爾濱 截稿時間&#xff1a;2025年6月15日 錄用通知&#xff1a;投稿后2周內 收錄檢索&#xff1a;EI,Scopus 會議簡介 JCICE 2022、JCICE 2023、JCICE 2…

【Linux】Linux 操作系統 - 03 ,初步指令結尾 + shell 理解

文章目錄 前言一、打包和壓縮二、有關體系結構 (考)面試題 三、重要的熱鍵四、shell 命令及運行原理初步理解五、本節命令總結總結 前言 本篇文章 , 筆者記錄的筆記內容包含 : 基礎指令 、重要熱鍵 、shell 初步理解 、權限用戶的部分問題 。 內容皆是重要知識點 , 需要認真理…

Python: sqlite3.OperationalError: no such table: ***解析

出現該錯誤說明數據庫中沒有成功創建 reviews 表。以下是完整的解決方案: 步驟 1:創建數據庫表 在插入數據前,必須先執行建表語句。請通過以下任一方式創建表: 方式一:使用 SQLite 命令行 bash 復制 # 進入 SQLite 命令行 sqlite3 reviews.db# 執行建表語句 CREATE T…

VSCode CLine 插件自定義配置使用 Claude 3.7 模型進行 AI 開發

一個互聯網技術玩家&#xff0c;一個愛聊技術的家伙。在工作和學習中不斷思考&#xff0c;把這些思考總結出來&#xff0c;并分享&#xff0c;和大家一起交流進步。 本文介紹如何在 Visual Studio Code (VSCode) 中安裝和自定義配置 CLine 插件&#xff0c;并使用 Claude 3.7 模…