我已经用ajax创建了一个聊天,但我仍然有一些无法识别的问题。当加载页面时,php加载所有打开的聊天和相对mex,然后有一个addmex-ajax函数:当用户点击enter时,它被称为传递this.value和cod_chat。ajax函数将这些数据发送到php,php将它们插入数据库并将最后一个mex添加到聊天中。每隔X秒就会调用一个更新功能来更新聊天。它一直工作到addmex函数:php工作,因为它将mex添加到数据库中,但出于某种原因,它刷新了页面。我可以使用RTMP吗?
这是表单的代码:
<input type='text' class='chat_input' value='write something' onkeydown='if (event.keyCode == 13){addmex(this.value); this.value='';}'/>
这是ajax函数的代码(不要担心php变量,因为这个函数是由echo加载的):
function addmex(mex)
{
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open("GET","addmex.php?cod_contatto="+' . $cod_contatto . '+"&mex="+mex,false);
xmlhttp.send();
document.getElementById("messaggi_' . $cod_contatto . '").innerHTML+=xmlhttp.responseText;
}
我将Async设置为false,因为它的响应速度很慢,如果我将其设置为true,则只能处理一些让服务器部分完成的警报。知道吗?
我用mysql制作了一个迷你项目脚本,它非常完美!您不需要HTTPS来隐藏ajax文件。试试这个。这100%有效
MYSQL代码:
SET FOREIGN_KEY_CHECKS=0;
DROP TABLE IF EXISTS `ajax_sessions`;
CREATE TABLE `ajax_sessions` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`sid` text NOT NULL,
`sip` varchar(18) NOT NULL,
`open` int(1) NOT NULL,
PRIMARY KEY (`id`)
)
ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
创建名为security.php的文件,并将其像index.php一样包含在主页中插入并保存此代码
// INCLUDE YOUR MYSQL CONNECT FILE
require '/engine/config/mysql.php';
// SESSION IP ADDRESS
$sip = $_SERVER['REMOTE_ADDR'];
// COUNT IF TABLE FOR THIS IP ADDRESS EXISTS
$count = mysql_fetch_array(mysql_query("SELECT COUNT(*) FROM ajax_sessions WHERE sip = '".$sip."'"));
// COUNT VAR
$count = $count['COUNT(*)'];
// GENERATE RANDOM SESSION ID
$sid = substr(str_shuffle("_-0123456789-_-abcdefghijklmnopqrstuvwxyz-_-ABCDEFGHIJKLMNOPQRSTUVWXYZ-_"), 0, 50);
// YOUR AJAX / XMLHTTP / (LOAD) CALL
echo '
<script>
$("button").click(function() {
$(".container").load("/ajax/request.php?sid='.$sid.'");
});
// CHEC IF CODE WORKS
console.log("Ajax - Session control is activated.");
</script>';
// IF TABLE FOR THIS IP ADDRESS NOT EXISTS INSERT IP,SESSION AND OPEN SESSION.
if($count<1) {mysql_query("INSERT INTO ajax_sessions (sid,sip,open) VALUES ('".$sid."','".$sip."','1')");
} else {
// IF THIS IP ALREADY EXISTS INTO TABLE JUST UPDATE IT AND INSERT SESSION ID.
mysql_query("UPDATE ajax_sessions SET sid = '".$sid."', sip = '".$sip."', open = '1'");
}
将此PHP代码放入AJAX文件
// IF GET sid ( SESSION ID )
if($_GET) {
// CHECK IF SESSION ID IS SET
if(isset($_GET['sid']) && $_GET['sid'] == $_GET['sid'] && !empty($_GET['sid'])) {
// SESSION REMOTE IP ADDRESS
$sip = $_SERVER['REMOTE_ADDR'];
// GET SESSION ID WE GOT
$sid = $_GET['sid'];
// COUNT IF THIS SESSION EXISTS IN MYSQL BASE
$fetch = mysql_fetch_array(mysql_query("SELECT COUNT(*) FROM ajax_sessions WHERE sid = '".$sid."' AND sip = '".$sip."' AND open = '1'"));
// COUNT SESSION
if($fetch['COUNT(*)'] == 1) {
// IF SESSION EXISTS CATCH IP ADDRESS AND CLEAR SESSION ID FOR THIS IP AND CLOSE IT, BUT NOT REMOVE
mysql_query("UPDATE ajax_sessions SET sid = NULL, sip = '".$sip."', open = '0'");
} else {
// DIE IF SESSION NOT EXISTS AND DO NOT SHOW CODE
die;
}
// IF IT WORKS OPEN JS CONSOLE LOG WITH F12 FOR GOOGLE CHROME
echo '<script>console.log("Session unseted !")</script>';
}
// AJAX POST CONTENT. IF POST
} else if($_POST) {
echo 'Call request';
}
我知道这很难理解,但它确实有效,我正在使用它。
插入字段是如何实现的?如果它是一个HTML表单,当你点击回车键时,它会发送表单。因此,如果给定此选项,则需要阻止默认的输入操作以阻止页面刷新:只需获取js事件(onkeydown),执行需要执行的操作,就会返回false。
编辑
您可以以不同的方式分配处理程序:给输入一个ID,这样就可以工作了:
document.getElementById(yourID).onkeydown = function(event) {
if(event.keyCode == 13){addmex(this.value); this.value='';}
return false;
}
编辑2
您的第一个代码有语法错误,应该是:
.... this.value="";}'/></form>
不能在内部字符串中使用相同的引号:"类似于两个字符串,而"是另一个字符串中的一个字符串。
解决方案对于那些碰巧读到这篇文章的人
表单标记是不必要的,并导致页面刷新(有时阻止默认值不起作用?!)。
最后,缺少了通过ajax进行刷新的功能。只需使用该函数执行setInterval(),它就会正常工作。
也许您可以尝试ArcusNode或Cumulus。我建议ArcusNode继续。这是一个OpenRTMFP协议。