使用 localStorage (客户端计数)

这是最简单的方法,计数器数据存储在用户的浏览器本地,优点是无需服务器,缺点是用户更换浏览器或清除缓存后,计数会重置。

javascript 网页访问计数器
(图片来源网络,侵删)

实现原理

  1. 在页面加载时,尝试从 localStorage 读取当前的计数值。
  2. 如果不存在(比如是第一次访问),则初始化计数值为 0。
  3. 将计数值加 1。
  4. 将新的计数值存回 localStorage
  5. 在页面上显示这个计数值。

代码实现

HTML (index.html)

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">JavaScript 访问计数器 (localStorage)</title>
    <style>
        body {
            font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            margin: 0;
            background-color: #f0f2f5;
        }
        .counter-container {
            text-align: center;
            background-color: white;
            padding: 40px;
            border-radius: 10px;
            box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
        }
        h1 {
            color: #333;
        }
        #visit-count {
            font-size: 3em;
            font-weight: bold;
            color: #007bff;
            margin: 20px 0;
        }
    </style>
</head>
<body>
    <div class="counter-container">
        <h1>欢迎访问!</h1>
        <p>您是本站的第 <span id="visit-count">0</span> 位访客</p>
    </div>
    <script src="counter.js"></script>
</body>
</html>

JavaScript (counter.js)

// 1. 获取显示计数的 <span> 元素
const countElement = document.getElementById('visit-count');
// 2. 从 localStorage 中获取当前计数值
// 如果没有找到,则默认为 0
let count = parseInt(localStorage.getItem('visitCount')) || 0;
// 3. 计数器加 1
count++;
// 4. 将新的计数值保存回 localStorage
localStorage.setItem('visitCount', count);
// 5. 在页面上更新显示
countElement.textContent = count;
// (可选) 为了演示效果,可以打印到控制台
console.log(`当前访问次数: ${count}`);

如何使用

  1. 将上面的 HTML 代码保存为 index.html
  2. 将上面的 JavaScript 代码保存为 counter.js,并与 index.html 放在同一个文件夹下。
  3. 用浏览器打开 index.html,你会看到计数显示为 1。刷新页面,计数会变成 2,3,4... 这是因为 localStorage 是按域名存储的,只要你不关闭浏览器或清除数据,它就会一直存在。

使用服务器端 (Node.js + Express) (真实计数)

如果你想记录所有用户的访问次数,而不是单个用户的访问次数,就必须使用服务器,这里我们使用 Node.js 和 Express 框架来演示。

javascript 网页访问计数器
(图片来源网络,侵删)

实现原理

  1. 创建一个 Node.js 服务器。
  2. 服务器上有一个文件(如 count.txt)或一个数据库(如 SQLite)来存储计数值。
  3. 当用户访问网页时,网页会通过 AJAX 请求服务器,请求获取并更新计数。
  4. 服务器收到请求后,读取当前计数值,加 1,然后写回文件/数据库,并将新值返回给客户端。
  5. 客户端接收到新值后,更新页面显示。

步骤 1: 项目初始化

# 创建一个新文件夹并进入
mkdir server-counter
cd server-counter
# 初始化 Node.js 项目
npm init -y
# 安装 Express 框架
npm install express

步骤 2: 创建服务器文件 (server.js)

const express = require('express');
const fs = require('fs').promises; // 使用 Promise 版本的 fs
const path = require('path');
const app = express();
const port = 3000;
// 用于存储计数的文件路径
const countFilePath = path.join(__dirname, 'count.txt');
// 一个中间件,用于提供静态文件(如你的 HTML、CSS、JS)
app.use(express.static(__dirname));
// API 端点:处理计数请求
app.get('/api/count', async (req, res) => {
    try {
        // 尝试读取当前计数值
        let count;
        try {
            const data = await fs.readFile(countFilePath, 'utf-8');
            count = parseInt(data, 10);
        } catch (error) {
            // 如果文件不存在或读取失败,说明是第一次,从 0 开始
            if (error.code === 'ENOENT') {
                count = 0;
            } else {
                throw error; // 其他错误则抛出
            }
        }
        // 计数器加 1
        count++;
        // 将新的计数值写回文件
        await fs.writeFile(countFilePath, count.toString(), 'utf-8');
        // 将新计数返回给客户端
        res.json({ count });
    } catch (error) {
        console.error('Error updating count:', error);
        res.status(500).json({ error: 'Failed to update count' });
    }
});
app.listen(port, () => {
    console.log(`Server is running at http://localhost:${port}`);
});

步骤 3: 修改前端 HTML (index.html)

我们将使用 fetch API 来从服务器获取计数。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">JavaScript 访问计数器 (服务器端)</title>
    <!-- CSS 样式可以复用上面的 -->
    <style>
        body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background-color: #f0f2f5; }
        .counter-container { text-align: center; background-color: white; padding: 40px; border-radius: 10px; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); }
        h1 { color: #333; }
        #visit-count { font-size: 3em; font-weight: bold; color: #28a745; margin: 20px 0; }
    </style>
</head>
<body>
    <div class="counter-container">
        <h1>欢迎访问!(服务器版)</h1>
        <p>本站总访问次数: <span id="visit-count">加载中...</span></p>
    </div>
    <script>
        const countElement = document.getElementById('visit-count');
        // 使用 fetch API 从服务器获取计数
        fetch('/api/count')
            .then(response => {
                if (!response.ok) {
                    throw new Error('Network response was not ok');
                }
                return response.json();
            })
            .then(data => {
                // 从服务器返回的数据中获取 count 并显示
                countElement.textContent = data.count;
            })
            .catch(error => {
                console.error('Error fetching count:', error);
                countElement.textContent = '获取失败';
            });
    </script>
</body>
</html>

步骤 4: 运行项目

  1. 确保你的文件夹中有 server.jsindex.html
  2. 在终端中运行:
    node server.js
  3. 打开浏览器,访问 http://localhost:3000
  4. 每次刷新页面或在新的浏览器标签页中打开,计数都会增加,这代表的是所有访问者的总次数。

使用第三方服务 (FreeCounters.net)

如果你不想自己搭建服务器,可以使用免费的第三方计数器服务,这是一种非常省事的方法。

实现原理

  1. 注册一个免费计数器服务账号(FreeCounters.net)。
  2. 按照服务指引,获取一段 HTML 或 JavaScript 代码。
  3. 将这段代码直接粘贴到你的 HTML 网页中即可。

优点

  • 无需维护:服务器、数据存储、安全等所有问题都由服务商处理。
  • 功能丰富:通常提供详细的数据统计、图表、IP来源分析等。
  • 简单快捷:几行代码就能搞定。

缺点

  • 依赖第三方:服务商可能倒闭或停止服务。
  • 可能带有广告:一些免费服务会在计数器旁显示广告。
  • 自定义性差:样式和功能受服务商限制。

总结与对比

特性 方法一: localStorage 方法二: 服务器端 方法三: 第三方服务
实现难度 非常简单 中等 (需要 Node.js 知识) 非常简单
数据存储 用户本地浏览器 服务器文件/数据库 第三方服务器
计数范围 单个用户的访问次数 所有用户的总访问次数 所有用户的总访问次数
真实有效性 低 (用户可重置)
是否需要服务器
适用场景 个人练习、临时展示、单页应用体验 个人博客、小型网站、需要真实统计的项目 对技术不熟悉的个人、快速搭建

如何选择?

  • 只是想学 JS 或做个简单的演示:用 方法一
  • 想在自己的网站上展示真实的访问量:用 方法二 (学习 Node.js 的好机会) 或 方法三 (省时省力)。
javascript 网页访问计数器
(图片来源网络,侵删)