解决前端监听事件绑定多次导致执行多次的情况

问题描述:因自己在做一个websocket的web程序时候需要重新刷新websoket的信息,我采用重新初始化,绑定事件也同时执行了多次,导致在接收消息websocket.onmessage时候,多次触发执行的情况

登录成功后会刷新websocket 初始化信息会绑定第二次

我的代码

new Vue({
        el: '#vueMonthId',
        data: {
           websocket: null,
        }, mounted() {
            var that = this;
           that.webSocketinit()
        },
        methods: {
        loginFun: function (formName) {
                var that = this;
               $.ajax({
                            url: '${path}/login/logCheck',
                            data: {
                                userCode: that.trim(that.loginForm.userCode),
                                passWord: that.trim(that.loginForm.passWord)
                            },
                            dataType: 'json',
                            type: 'post',
                            success: function (data) {
                                if (data.status == 200) {
                                    that.loginDialogFlag = false;
                                    that.ensureInfoDialogFlag = true;
                                    that.$message({
                                        message: '登录成功',
                                        type: 'success'
                                    });
                                    //刷新socket
                                    that.webSocketinit();
                                } else {
                                    that.$message.error(data.message);
                                }
                            }
                        })
            },webSocketinit() {
                var that = this;
                var url = that.host + "${path}/board/webSocket"
                //判断当前浏览器是否支持WebSocket
                if ('WebSocket' in window) {
                    // 浏览器支持Websocket
                    that.websocket = new WebSocket('ws://' + url + '/' + 11 + "?path=${path}");
                } else {
                    // 浏览器 Not support websocket
                }
                
                    that.websocketBind=false;
                    //WebSocket连接发生错误的回调方法
                    that.websocket.onerror = function (res) {
                        that.setMegHtml("WebSocket连接发生错误");
                    };
                    //WebSocket连接成功建立的回调方法
                    that.websocket.onopen = function () {
                        //that.setMegHtml("WebSocket连接成功");
                    };
                    //接收到消息的回调方法
                    that.websocket.onmessage = function (event) {
                        that.setMegHtml($.parseJSON(event.data));
                    };
                    window.onbeforeunload = function () {
                        closeWebSocket();
                    };
                    //关闭WebSocket连接
                    function closeWebSocket() {
                        that.websocket.close();
                    }
                    //连接关闭的回调方法
                    that.websocket.onclose = function () {
                        that.setMegHtml("WebSocket连接关闭");
                        console.log("WebSocket连接关闭")
                    };
            }
    })

解决方案:保证websocket这个对象只绑定一次,加了一个标识符 websocketBind 变量 判断保证绑定代码只执行一次

new Vue({
        el: '#vueMonthId',
        data: {
           websocket: null,
            websocketBind:true
        }, mounted() {
            var that = this;
           that.webSocketinit()
        },
        methods: {
        loginFun: function (formName) {
                var that = this;
               $.ajax({
                            url: '${path}/login/logCheck',
                            data: {
                                userCode: that.trim(that.loginForm.userCode),
                                passWord: that.trim(that.loginForm.passWord)
                            },
                            dataType: 'json',
                            type: 'post',
                            success: function (data) {
                                if (data.status == 200) {
                                    that.loginDialogFlag = false;
                                    that.ensureInfoDialogFlag = true;
                                    that.$message({
                                        message: '登录成功',
                                        type: 'success'
                                    });
                                    //刷新socket
                                    that.webSocketinit();
                                } else {
                                    that.$message.error(data.message);
                                }
                            }
                        })
            },webSocketinit() {
                var that = this;
                var url = that.host + "${path}/board/webSocket"
                //判断当前浏览器是否支持WebSocket
                if ('WebSocket' in window) {
                    // 浏览器支持Websocket
                    that.websocket = new WebSocket('ws://' + url + '/' + 11 + "?path=${path}");
                } else {
                    // 浏览器 Not support websocket
                }
                if(websocketBind){
                    //只绑定一次
                    that.websocketBind=false;
                    //WebSocket连接发生错误的回调方法
                    that.websocket.onerror = function (res) {
                        that.setMegHtml("WebSocket连接发生错误");
                    };
                    //WebSocket连接成功建立的回调方法
                    that.websocket.onopen = function () {
                        //that.setMegHtml("WebSocket连接成功");
                    };
                    //接收到消息的回调方法
                    that.websocket.onmessage = function (event) {
                        that.setMegHtml($.parseJSON(event.data));
                    };
                    window.onbeforeunload = function () {
                        closeWebSocket();
                    };
                    //关闭WebSocket连接
                    function closeWebSocket() {
                        that.websocket.close();
                    }
                    //连接关闭的回调方法
                    that.websocket.onclose = function () {
                        that.setMegHtml("WebSocket连接关闭");
                        console.log("WebSocket连接关闭")
                    };
                }
            }
    })

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果要实现前端一次性上传多个文件,并且这些文件需要到一个类中,可以按以下步骤进行: 1. 在前端构建一个表单,表单中包含一个文件选择器和一个提交按钮。 2. 通过 JavaScript 监听文件选择器的 change 事件,获取用户选择的文件列表。 3. 将文件列表封装成一个 FormData 对象,并以 POST 方法发送给后端。 4. 后端接收到请求后,解析 FormData 对象,从中获取多个文件,并将这些文件到一个类中。 下面是一个示例代码: 前端代码: ```html <form id="myForm"> <input type="file" name="files" multiple> <button type="submit">Upload</button> </form> <script> const form = document.getElementById('myForm'); form.addEventListener('submit', (event) => { event.preventDefault(); const formData = new FormData(form); fetch('/upload', { method: 'POST', body: formData }); }); </script> ``` 后端代码(使用 Spring MVC): ```java @PostMapping("/upload") public void upload(@RequestParam("files") MultipartFile[] files) { // 将文件到一个类中 // ... } ``` 在后端中,可以将多个文件到一个类中,例如: ```java public class MyFileClass { private List<MultipartFile> files; // ... } ``` 然后在上传方法中使用 `@ModelAttribute` 注解,将表单数据到 MyFileClass 对象中: ```java @PostMapping("/upload") public void upload(@ModelAttribute MyFileClass myFile) { List<MultipartFile> files = myFile.getFiles(); // ... } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值