我在成功合并后设置了socket.emit事件。但是当我绑定sockets.on事件时会出现问题。它被多次开除。
$(document).on('click', '#comment_button', function() {
$.ajax({
// upon success
success: function (response) {
if (response) {
socket.emit('postcomment');
socket.on('refresh', function () {
console.log('refresh');
//This console.log('refresh') is coming multiple times. I mean its occurance increases with every successful ajax response.
});
}
});
});
这是我的server.js
socket.on('postcomment', function () {
io.sockets.emit("refresh");
});
我已经验证在我的server.js socket.on
函数中只调用了一次。
我不确定ajax中socket.on('refresh', function () {}
的问题是什么。
任何帮助都会很棒。
已经进行了P.S套接字连接。没问题。
编辑:我纠正了这个错误。如果有人将来读这个。 正如杰森和尼兰詹所说,socket.on{}
事件在成功回应时具有约束力。 简单来说: 每次调用单击处理程序时,它都会将其他事件侦听器附加到套接字。您在之前点击时附加的听众仍然有效。
所以我对之前的代码进行了以下更改
$(document).on('click', '#comment_button', function() {
$.ajax({
// upon success
success: function (response) {
if (response) {
socket.emit('postcomment');
}
});
});
socket.on('refresh', function () {
console.log('refresh');
});
快乐的编码。
答案 0 :(得分:4)
我对之前的代码进行了以下更改。 有效。
$(document).on('click', '#comment_button', function() {
$.ajax({
// upon success
success: function (response) {
if (response) {
socket.emit('postcomment');
}
});
});
socket.on('refresh', function () {
console.log('refresh');
});
socket.on {}事件在成功响应后自行绑定。至 很简单:每次调用click处理程序时,它都会附加 套接字的其他事件监听器。你附加的听众 以前的点击仍然有效。
答案 1 :(得分:2)
我觉得,插座工作正常。可能是,ajax()
被多次调用。
例如,您在点击某个内容时调用了ajax()
。成功socket.on('refresh')
被执行。所以现在,如果用户在按钮上多次单击,则会多次调用ajax。这导致sockets()
所以请确保,你不要多次调用ajax。
您的问题已解决:)
答案 2 :(得分:1)
每次socket.on
请求成功时,您都会在refresh
ajax
函数中附加匿名函数的另一个副本。
我做了这个测试。如果我单击ajax按钮然后单击"单击我"按钮,我得到一个"你好"在控制台中。如果我再次单击ajax按钮,然后单击"单击我",我得到"你好"两次。再次点击ajax,"点击我"打印"你好"三次,等等。
<!DOCTYPE html>
<html>
<script src="jquery-2.1.4.min.js"></script>
<script>
function send_ajax_request() {
$.ajax("http://localhost/test.html").done(function() {
console.log("ajax done");
$("#clicker").click(function() {
console.log("howdy");
});
});
}
</script>
</head>
<body>
<input type="button" value="ajax request" onclick="send_ajax_request()">
<input type="button" value="click me" id="clicker">
</body>
</html>
编辑:
因此,如果您的目标仅仅是为socket.on
refresh
事件设置一些行为,那么解决方案就是将该行为分配到ajax
函数之外以及任何可能的函数之外多次打电话。