我正在尝试制作一个类似聊天室的网站。但我遇到了一个与 AJAX 相关的大问题。
我在主页中有一个空的 div,在其中我使用
XMLHttpRequest
加载在数据库中找到的所有消息。到目前为止,一切都很好,我设法让它运作良好。但后来我想将事情提升到一个新的水平,并创建一个管理员帐户,该帐户能够删除任何包含不当内容的帖子。我在表中添加了一个额外的行,其中包含一个带有隐藏文本输入的表单,其中包含所选行的 ID。我有一个可以单击的按钮,我会调用一个文件,该文件的作用是从数据库中删除相应的条目,
我尝试在表单内使用常规 POST 方法提交表单,而不使用 AJAX,只是为了检查它是否在数据库上运行良好。而且它工作得很好,所以我的 mysql 程序文件没有问题。但它刷新了网页,我想避免这种情况,所以 AJAX 是我唯一的希望,但当我尝试使用 AJAX 时,它就行不通。我相信这主要是因为我用来删除帖子的表单位于另一个文件中,而不是我网站的主体中。
我尝试了一些不同的方法,但似乎没有任何效果。 我注意到关于我面临的问题没有太多资源,我明白了,我想要的有点不常见,因为 AJAX 最常用于提交由用户填写的文本/文本区域输入一个文件。我自己已经这样做了,在主页中我有一个文本区域表单,我可以使用 AJAX 提交它而无需刷新页面,所以我有点了解它是如何工作的。但对于我现在面临的问题,网络上没有任何资源被证明是有用的。该线程最接近我正在寻找的内容:Submiting a form that is inside a div with AJAX但它不提供任何解决方案。
所以我将在这里发布我的代码: 网站的主体在文件
Chatroom.php
中,这里我有XHR请求:
<!DOCTYPE html>
<html>
<body>
function table2(){
const xhttp = new XMLHttpRequest();
xhttp.onload = function(){
document.getElementById("scrollchat").innerHTML = this.responseText;
}
xhttp.open("GET", "load_chat.php");
xhttp.send();
}
setInterval(function(){
table2();
}, 500);
<div id="scrollchat">
</div>
这没什么奇特的,只是运行得很好的经典代码,我填充的 div 是:
<div id="scrollchat"> \</div>
然后在
load_chat.php
中,我从数据库中读取内容,我有一个表单,其中包含每条消息的 ID,如下所示:
<?php
session_start();
//echo '12345';
$con = mysqli_connect('localhost', 'root', '');
mysqli_select_db($con, 'chatroom');
//echo $_SESSION['username1'];
$onlinevalue = 1;
$count = "SELECT * FROM mainchat";
$rows = mysqli_query($con, $count);
$number = mysqli_num_rows($rows);
?>
<table>
<?php
foreach($rows as $row) : ?>
<td>
$currentuser = $row["Username"];
echo $currentuser;
</td>
<td>
<form action="" id="deletepostform">
<input type="hidden" name="MessagedeleteID" value="<?php echo $row["ID"]; ?>" />
<button type="submit"> <b><span style="color:red">X</span></b></button>
</form>
</td>
<?php endforeach; ?>
</table>
允许我提交该函数返回的表单的最佳 AJAX 函数是什么?
回到我的主页
Chatroom.php
我尝试了很多类型的AJAX调用。我上次尝试的是以下代码:
document.getElementById('deletepostform').addEventListener('submit', function(event) { event.preventDefault(); // Prevent the default form submission
let xhr = new XMLHttpRequest();
let url = 'deletepost.php'; // Replace with your server endpoint
xhr.open('POST', url, true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
// Collect form data
let formData = new FormData(this);
let params = new URLSearchParams(formData).toString();
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
console.log(xhr.responseText); // Handle the response
}
};
xhr.send(params); // Send the request with the form data
});
使用此代码我收到错误
类型错误:无法读取 null 的属性(读取“addEventListener”)
在控制台中。我认为这种情况可能会发生,因为它在主页中找不到该表单。
我尝试的任何内容都无法提交,因为它在页面本身中找不到实际的表单,因为它是从其他地方加载的
您尝试处理表单提交时遇到几个问题:
正如您正确计算的那样,JavaScript 无法找到您的表单以将提交事件绑定到它。这是因为当 JS 代码运行时,您的表单还不存在 - 它尚未从 AJAX 请求加载。
即使它可以检测到它,您也可以使用循环来生成多个表单(每一行一个)。因此,使用
id
来标识表单是没有意义的,因为 ID 必须准确标识一个元素(就像任何行业中的 ID 必须唯一标识某物一样)。因此,您的 JS 脚本只会找到具有该 ID 的表单的第一个实例。
解决方法如下:
使用事件委托创建“提交”处理程序。从技术上讲,这将事件处理程序附加到 DOM 层次结构的更高层 - 您甚至可以只使用 HTML 文档的根 - 它将始终出现在页面中。然后在处理程序中编写代码,仅当单击的真实项目(在本例中是您的表单之一)与您用于识别它的选择器匹配时才处理该事件。
使用类而不是 ID 来标识表单。类可以合法地附加到任意数量的元素,并且在代码中使用类选择器与 ID 选择器一样容易。
这是一个演示:
document.addEventListener('submit', function(event) {
if (event.target.matches('.deletepostform')) {
event.preventDefault(); //prevent normal postback
alert("Form submit event detected");
//your ajax code goes here
}
});
<table>
<tr>
<td>
<form action="" class="deletepostform">
<input type="hidden" name="MessagedeleteID" value="1" />
<button type="submit"> <b><span style="color:red">X</span></b></button>
</form>
</td>
</tr>
<tr>
<td>
<form action="" class="deletepostform">
<input type="hidden" name="MessagedeleteID" value="2" />
<button type="submit"> <b><span style="color:red">X</span></b></button>
</form>
</td>
</tr>
<tr>
<td>
<form action="" class="deletepostform">
<input type="hidden" name="MessagedeleteID" value="3" />
<button type="submit"> <b><span style="color:red">X</span></b></button>
</form>
</td>
</tr>
<tr>
<td>
<form action="" class="deletepostform">
<input type="hidden" name="MessagedeleteID" value="4" />
<button type="submit"> <b><span style="color:red">X</span></b></button>
</form>
</td>
</tr>
</table>