You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅在用户点击按钮时在HTML中加载socket.io脚本?

实现点击按钮时动态加载Socket.io并建立连接

要实现仅在用户点击按钮时才加载Socket.io脚本并建立连接,你可以通过动态创建script元素的方式来实现,这样就能避免页面初始化时自动加载脚本。下面是修改后的完整代码和关键逻辑说明:

修改后的client.html代码

<html>
<head>
    <meta charset="utf-8" />
    <title>Socket.io</title>
</head>
<body>
    <h1>Communicating with socket .io!</h1>
    <div>
        <form>
            <input id="wawa" type="text" name="firstname" value="">
            <button onclick="get_data(event)">Send data to server</button>
        </form>
    </div>
    <script>
        // 全局变量标记socket连接状态,避免重复加载和连接
        let socket = null;

        function get_data(event) {
            // 阻止表单默认提交行为,避免页面刷新
            event.preventDefault();
            
            // 如果已经建立连接,直接发送输入框的数据
            if (socket) {
                const inputValue = document.getElementById('wawa').value;
                socket.emit('wawa', inputValue);
                console.log('数据已发送:', inputValue);
                return;
            }

            // 动态创建script元素,按需加载socket.io脚本
            const script = document.createElement('script');
            script.src = 'socket-io.js'; // 替换为你的socket.io脚本实际路径
            script.onload = function() {
                // 脚本加载完成后,初始化socket连接
                socket = io.connect('http://localhost:5000');
                
                // 监听连接成功事件
                socket.on('connect', function() {
                    console.log('Connected to the server');
                    // 连接成功后立即发送当前输入框的数据
                    const inputValue = document.getElementById('wawa').value;
                    socket.emit('wawa', inputValue);
                    console.log('数据已发送:', inputValue);
                });

                // 可选:监听断开连接事件,重置状态以便后续重新连接
                socket.on('disconnect', function() {
                    console.log('Disconnected from server');
                    socket = null;
                });
            };

            // 将动态创建的script元素添加到页面头部
            document.head.appendChild(script);
        }
    </script>
</body>
</html>

关键逻辑说明

  1. 移除初始脚本引用:删掉了原来页面中的<script src="socket-io.js"></script>,这样页面加载时不会自动加载Socket.io脚本。
  2. 动态加载脚本:在按钮点击事件中,通过document.createElement('script')创建脚本元素,设置好路径后添加到页面,只有点击按钮时才会触发加载。
  3. 连接状态管理:用全局变量socket标记是否已建立连接,避免用户多次点击按钮导致重复加载脚本和创建连接;断开连接时重置状态,方便后续重新发起连接。
  4. 优化用户体验:不管是首次加载连接还是已连接状态,点击按钮都能直接发送数据,无需用户等待连接后再操作。

补充:修复server.js的语法问题

你的server.js代码缺少闭合大括号,补充完整后如下:

let io = require('socket.io').listen(process.env.port||5000);
io.on('connection', function(socket) {
    console.log('New client connected');
    socket.on('wawa',function (data) {
        console.log(`data received is '${data}'`);
    });
}); // 补充这个闭合括号

内容的提问来源于stack exchange,提问作者wawa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:22:29