普通视图

发现新文章,点击刷新页面。
昨天 — 2025年7月1日首页

AJAX:前后端通信的桥梁

2025年7月1日 14:45

AJAX前后端连接的桥梁,每次点击按钮、提交表单,都伴随着整个页面的闪烁刷新。用户需要等待服务器返回完整的HTML页面,体验被切割成碎片化的等待过程。这种"点击-等待-刷新"的交互模式,不仅效率低下,更破坏了用户体验的连贯性。直到AJAX技术横空出世,这场静默革命彻底改写了Web交互的规则。它让浏览器能够在后台悄悄与服务器对话动态更新页面局部内容

一、AJAX工作机制解析

  • AJAX的全称为Asyncronous JavaScript And XML,即异步的JavaScript和XML,是浏览器与服务器之间进行交互的一种方式,前后端重要的机制,它允许浏览器向服务器发送请求,并接收服务器返回的数据,而无需重新加载整个页面。 AJAX的核心在于异步数据交换,其工作流程如下:
  1. 事件触发:用户交互(点击/输入等)触发JavaScript函数
  2. 创建请求:通过XMLHttpRequestfetch()创建HTTP请求
  3. 发送请求:向服务器发送请求而不阻塞页面
  4. 处理响应:接收服务器数据后更新特定DOM元素
// 现代fetch API示例
document.getElementById("btn").addEventListener("click", () => {
  fetch("http://localhost:3000/login?username=admin&password=123")
    .then(response => response.json())
    .then(data => console.log("响应数据:", data));
});

二、关键演进:从XHR到Fetch

早期AJAX依赖XMLHttpRequest对象:

const xhr = new XMLHttpRequest();
xhr.open("GET", "/api/data");
xhr.onload = () => console.log(xhr.responseText);
xhr.send();

现代开发更倾向使用Fetch API

  • 基于Promise的链式调用
  • 更简洁的语法
  • 内置JSON解析等实用功能
  • 支持async/await异步模式

三、真实案例:登录系统实现

结合您提供的代码示例,我们实现了一个完整的登录流程:

前端实现(HTML+JavaScript)

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div>
    <input type="text" placeholder="Add a task">
   
    </input>
    <input type="password" placeholder="Add a task">
   
    </input>
     <button id="btn">Add</button>
  </div>
  <script>
      let btn = document.getElementById("btn");
      btn.addEventListener("click", function () {
        console.log("clicked");
        fetch(
          "http://localhost:3000/login?username=admin&password=123",
          {
            method: "GET",
          }
        )
          .then((response) => {
            return response.json();
          })
          .then((data) => {
            console.log(data);
          });
      });
  </script>
</body>
</html>

image.png 实现界面如下:虽然只有add有用,点击add触发回调

JavaScript功能部分

  • 获取按钮元素let btn = document.getElementById("btn");

    • 通过ID选择器获取按钮DOM元素
  • 添加点击事件监听btn.addEventListener("click", function () { ... });

    • 当用户点击按钮时触发回调函数
  • 发送AJAX请求

    • 使用fetch() API发送HTTP请求

    • 请求URL:http://localhost:3000/login?username=admin&password=123

      • 目标服务器:本地3000端口
      • 请求路径:/login
      • 查询参数:username=admin 和 password=123(硬编码)
    • 请求方法:GET

  • 处理响应

    • .then((response) => { return response.json(); })

      • 将服务器响应解析为JSON格式
    • .then((data) => { console.log(data); });

      • 将解析后的数据输出到控制台 后端实现(Node.js HTTP服务器)
const http = require("http");
const port = 3000;

const server = http.createServer((req, res) => {
  res.setHeader("Access-Control-Allow-Origin", "*");

  if (req.url.startsWith("/login")) {
    const username = req.url.split("?")[1].split("=")[1].split("&")[0];
    const password = req.url.split("&")[1].split("=")[1];

    console.log(`当前登录账号为:${username}, 密码为:${password}`);

    res.end("login success");
  }
});

server.listen(port, () => {
  console.log(`Server running at http://localhost:${port}/`);
});

image.png

%E5%B1%8F%E5%B9%95%E5%BD%95%E5%88%B6%202025-07-01%20143202_converted.gif 成功运行js代码后得到上图,再点击html代码的按钮

image.png

控制台显示:

image.png

结语

如果你也学习前端的小白,不妨来试试ajax,感受前后端联调的魅力吧

昨天以前首页

图片寻宝:用trae生成一个找图片小游戏

2025年6月28日 16:50

我用trae帮我生成了一个小游戏,以下是全部过程

图片寻宝游戏 - AI可读完整实现指南

以下是提示词:

游戏核心规则

游戏名称: "图片寻宝" 目标: 在倒计时结束前点击与中央目标相同的emoji 难度系统: 简单: 初始时间: 60秒 初始卡片: 3张(1正确+2干扰) 每关增加卡片: 2张 每关加分: 2分 增加正确图片间隔: 每9关 一般: 初始时间: 45秒 初始卡片: 3张 每关增加卡片: 2张 每关加分: 3分 增加正确图片间隔: 每5关 困难: 初始时间: 30秒 初始卡片: 5张 每关增加卡片: 2张 每关加分: 4分 增加正确图片间隔: 每2关 胜负判定: 正确点击: 进入下一关 + 加分 错误点击: 时间减少1秒 倒计时结束: 游戏结束


## 界面设计规范

/* 文字样式 */
标题: 
  字体: "华文新魏"
  大小: 3em
  颜色: 黄金渐变(#d4af37#ffd700)
  效果: 柔光文本阴影

正文:
  颜色: #5d4037 (深咖啡色)
  效果: 柔光文本阴影

/* 容器 */
初始尺寸: 1200px × 800px
最大尺寸: 2000px × 1500px
扩展动画: 300ms缓动
扩展提示: "地图正在展开...发现更多隐藏区域!"

## 游戏体验优化

// 连续正确奖励
function handleCorrectSelection() {
  gameState.score += DIFFICULTY_SETTINGS[gameState.difficulty].scoreIncrement;
  gameState.consecutiveCorrect++;
  
  // 连续3次正确奖励
  if (gameState.consecutiveCorrect >= 3) {
    gameState.timeLeft += 5; // 奖励5秒
    showBonusMessage("连续正确奖励 +5秒!");
    gameState.consecutiveCorrect = 0;
  }
  
  // 进入下一关
  gameState.level++;
  generateNewLevel();
}

// 时间奖励(游戏结束时)
function calculateFinalScore() {
  const timeBonus = Math.floor(gameState.timeLeft * 0.1);
  return gameState.score + timeBonus;
}

// 数据统计
function collectGameStats() {
  return {
    totalTime: (Date.now() - gameStartTime) / 1000,
    averageLevelTime: ((Date.now() - gameStartTime) / 1000) / gameState.level,
    correctRatio: (correctClicks / (correctClicks + wrongClicks)) * 100
  };
}

资源管理系统

Emoji库: 数量: 100种 获取方式: 使用扩展库或重复现有20种

排行榜系统

实现说明

  1. 正确卡片数量计算

    • 使用公式:正确卡片数量 = 1 + Math.floor((level - 1) / interval)
    • interval 值根据难度不同:简单=9,一般=5,困难=2
  2. 动态扩容系统

    • 初始尺寸:1200×800px
    • 每次扩容:宽+200px,高+150px
    • 最大尺寸:2000×1500px
    • 达到最大尺寸时触发通关
  3. 反馈系统

    • 正确点击:绿色闪光+粒子效果+奖励消息
    • 错误点击:红色震动+惩罚消息
    • 连续正确:特殊奖励+提示消息
  4. 数据统计

    • 游戏时长:从开始到结束的总时间
    • 平均每关耗时:总时间/关卡数
    • 正确率:正确点击次数/总点击次数
  5. 分数计算

    • 基础分数:每关根据难度加分
    • 时间奖励:结束时的剩余时间×0.1
    • 最终分数 = 基础分数 + 时间奖励

这个设计规范完整实现了所有需求,包括动态扩容系统、难度分级、反馈机制和视觉设计。AI可以根据这些提示词直接实现游戏功能。

以上是用deeseek模型为我生成的关于游戏的ai提示词,需要自己不断完善提示词

后续将提示词交给trae,来实现。

QQ截图20250628164351.png

生成的代码:

<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>图片寻宝</title>
    <link rel="stylesheet" href="style.css" />
  </head>
  <body>
    <div id="start-screen">
      <h1>图片寻宝</h1>
      <div class="game-rules">
        <h3>游戏规则</h3>
        <ol>
          <li>选择难度级别开始游戏</li>
          <li>在倒计时结束前点击与中央目标图片相同的emoji表情</li>
          <li>点击正确 → 进入下一关(难度升级)</li>
          <li>点击错误 → 继续游戏(无惩罚)</li>
          <li>倒计时结束 → 游戏结束,显示最终关卡数得分</li>
        </ol>
        <h4>难度说明</h4>
        <ul>
          <li><strong>简单模式</strong>:首关3张图/30秒,每关+2图/-2秒</li>
          <li><strong>一般模式</strong>:首关3张图/30秒,每关+2图/-5秒</li>
          <li><strong>困难模式</strong>:首关5张图/25秒,每关+2图/-5秒</li>
        </ul>
      </div>
      <div class="difficulty-select">
        <button data-difficulty="easy">简单模式</button>
        <button data-difficulty="normal" class="active">一般模式</button>
        <button data-difficulty="hard">困难模式</button>
      </div>
      <button id="start-btn">开始游戏</button>
      <div class="music-control">
        <label for="music-toggle">背景音乐</label>
        <input type="checkbox" id="music-toggle" checked />
      </div>
      <div class="leaderboard">
        <h3>排行榜</h3>
        <div id="scores"></div>
      </div>
    </div>

    <div id="game-screen" class="hidden">
      <div id="expansion-message">地图正在展开...发现更多隐藏区域!</div>
      <div id="completion-message">恭喜你通关了,你太棒了!</div>
      <div class="header">
        <div id="target-emoji"></div>
        <div id="timer">30</div>
      </div>
      <div id="emoji-container"></div>
      <div id="feedback-message"></div>
      <div class="footer">
        <span id="level">关卡: 1</span>
        <span id="difficulty-label"></span>
        <button id="music-btn">音乐</button>
      </div>
    </div>

    <div id="end-screen" class="hidden">
      <h2>游戏结束!</h2>
      <p>你的得分: <span id="final-score">0</span></p>
      <p>最高记录: <span id="high-score">0</span></p>
      <button id="restart-btn">再玩一次</button>
      <button id="home-btn">返回首页</button>
    </div>

    <audio id="bg-music" loop></audio>
    <audio id="correct-sound"></audio>
    <audio id="wrong-sound"></audio>
    <audio id="gameover-sound"></audio>
    <audio id="start-sound"></audio>
    <audio id="levelup-sound"></audio>

    <script src="script.js"></script>
  </body>
</html>

最后的结果图为:

image.png

❌
❌