gpt4 book ai didi

javascript - Chrome 问题 - 聊天行多次返回

转载 作者:太空狗 更新时间:2023-10-29 13:16:45 25 4
gpt4 key购买 nike

我写了一个小的聊天插件,我需要在我的网站上使用它。它使用 HTML 中的简单结构,如下所示:

<div id="div_chat">
<ul id="ul_chat">
</ul>
</div>

<div id="div_inputchatline">
<input type="text" id="input_chatline" name="input_chatline" value="">
<span id="span_sendchatline">Send</span>
</div>

当然,在该 Span 元素上有一个“点击”绑定(bind)事件。然后,当用户插入一条消息并单击“发送”span 元素时,会出现一个调用 Ajax 事件的 Javascript 函数,该函数将消息插入 MySQL 数据库:

function function_write_newchatline()
{
var chatline = $('#input_chatline').val();

$.ajax
({
type: "POST",
url: "ajax-chat-writenewline.php", //1: ok, 0: errore
data: ({'chat_line': chatline}),
dataType: "text",
cache: false,
success: function(ajax_result)
{
function_get_newchatlines();
}
});
}

并且,如果消息成功插入到数据库中,它会调用一个函数来读取新行并将它们放入我之前发布的 HTML 结构中:

function function_get_newchatlines()
{
$.ajax
({
type: "POST",
url: "ajax-chat-loadnewlines.php", //1: ok, 0: errore
data: '',
dataType: "text",
cache: false,
success: function(ajax_result) //example of returned string: 'message1>+<message2>+<message3'
{
//explode new chat lines from returned string
var chat_rows = ajax_result.split('>+<');
for (id_row in chat_rows)
{
//insert row into html
$('#ul_chat').prepend('<li>' + chat_rows[id_row] + '</li>');
}
$('#span_sendchatline').html('Send');
}
});
}

注意:“ajax_result”仅包含 html 实体,不包含特殊字符,因此即使消息包含“>+<”,在从此 JS 函数处理之前,它也会由使用 Ajax 调用的 php 脚本编码。

现在,出现了奇怪的行为:当发布新消息时,Opera、Firefox 甚至 IE8 都能正常工作,就像这样:

A screen taken from Firefox

但是,当我打开 Chrome 窗口时,我看到了这个:

A screen taken from Chrome

如您所见,在 Chrome 中,消息会显示多次(每次都会增加数量,每条消息最多显示 8 行)。我检查了内部调试查看器,似乎没有多次调用“读取新行”函数,所以它应该与 Jquery 事件有关,或者其他。

希望我的解释很清楚,如果您需要任何其他信息,请告诉我:)

谢谢,艾瑞诺。

编辑

正如 Shusl 所指出的,我忘了提及函数 function_get_newchatlines()setInterval(function_get_newchatlines, 2000) 定期调用到 Javascript 中。

EDIT2

这是 Ajax 调用的 PHP 文件中的一段代码,用于获取新的聊天行(我认为这里不需要“session_start()”或 mysql 连接之类的东西)

//check if there's a value for "last_line", otherwise put current time (usually the first time a user logs into chat)
if (!isset($_SESSION['prove_chat']['time_last_line']) || !is_numeric($_SESSION['prove_chat']['time_last_line']) || ($_SESSION['prove_chat']['time_last_line'] <= 0))
{
$_SESSION['prove_chat']['time_last_line'] = microtime(true);
}

//get new chat lines
$result = mysql_query("select * from chat_module_lines where line_senttime > {$_SESSION['prove_chat']['time_last_line']} order by line_senttime asc; ", $conn['user']);
if(!$result || (mysql_num_rows($result) <= 0))
{
mysql_close($conn['user']); die('2-No new lines');
}
//php stuff to create the string
//....
die($string_with_chat_lines_to_be_used_into_Javascript);

无论如何,我认为,如果问题是这个 PHP 脚本,我也会在其他浏览器中遇到类似的错误:)

EDIT4

下面是将点击事件绑定(bind)到“发送”span 元素的代码:

$('#span_sendchatline').on('click', function()
{
//check if there's already a message being sent
if ($('#span_sendchatline').html() == 'Send')
{
//change html content of the span element (will be changed back to "send"
//when the Ajax request completes)
$('#span_sendchatline').html('Wait..');
//write new line
function_write_newchatline();
}
//else do nothing
});

(感谢 f_puras 添加了缺失的标签 :)

最佳答案

我会执行以下操作之一:

选项 1:

在 function_write_newchatline() 中调用 ajax 之前停止计时器,并在 ajax 调用返回时启动计时器。

function function_write_newchatline()
{
var chatline = $('#input_chatline').val();

stop_the_timer();
$.ajax
({
type: "POST",
url: "ajax-chat-writenewline.php", //1: ok, 0: errore
data: ({'chat_line': chatline}),
dataType: "text",
cache: false,
success: function(ajax_result)
{
function_get_newchatlines();
},
complete: function() {
start_the_timer();
}
});
}

选项 2:

在 ajax 调用的成功事件中根本不调用 function_get_newchatlines()。只让计时器检索聊天条目。

function function_write_newchatline()
{
var chatline = $('#input_chatline').val();

$.ajax
({
type: "POST",
url: "ajax-chat-writenewline.php", //1: ok, 0: errore
data: ({'chat_line': chatline}),
dataType: "text",
cache: false,
success: function(ajax_result)
{
// do nothing
}
});
}

我认为在用户添加聊天条目后调用的 function_get_newchatlines() 与计时器定期调用 function_get_newchatlines() 之间存在某种竞争条件。

选项 3:

使用 setTimeout 而不是 setInterval。当浏览器繁忙时,setInterval 会把事情搞砸。所以在setTimeout函数结束时再次调用setTimeout。

关于javascript - Chrome 问题 - 聊天行多次返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12799379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com