javascript - Ajax Javascript 在不刷新页面的情况下不会改变样式
问题描述
我必须创建一个网页,允许收件人保留可用的餐点或删除它们(如果它们以前被保留),如果餐点被保留,那么它的样式必须改变。
但是我一直面临这个问题,除非我刷新页面,否则(餐点名称)的样式不会改变。另外,当我单击保留时,数据库会更新并显示删除按钮,但它会被禁用,除非我刷新页面,否则我无法再单击它。
这是收件人主页的 Ajax Javascript 部分:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js" > </script>
<script>
$(document).ready(function(){
//when remove button is clicked
$(".rmvJQ").click(function(){
var classIdValue = this.value;
var toResvBtn = "#" + classIdValue +"toResvBtn";
var ToRmv = "#" + classIdValue +"ToRmv";
// var styleM = "#" + classIdValue +"toStyle";
$.get("rmov.php", {classID : classIdValue},
function(response){
var opeartion = "success";
if(response == opeartion){
alert("The remove operation was failed");
}else{
// alert(classIdValue);
}
$("#RemovedSt").css("background-color");
$(toResvBtn).html("<button class ='rsvJQ' value ="+classIdValue+" >Reserve</button>");
$(ToRmv).html("");
});
});
//when reserve button is clicked
$(".rsvJQ").click(function(){
var classIdValue = this.value;
var toResevededString = "#" +classIdValue + "toResevededString";
var tormovBtn = "#" + classIdValue + "tormovBtn";
var ReservedSt = "#" + classIdValue + "ReservedSt";
$.get("rsv.php", {classID : classIdValue},
function(response){
var opeartion = "success";
if(response == opeartion){
alert("The reseve operation was failed");
}else{
alert("The reseve operation was successful!");
}
$(ReservedSt).css({"background-color": "yellow", "font-size": "200%"});
$(toResevededString).html("Reserved");
$(tormovBtn).html("<button class ='rmvJQ' value = '"+classIdValue+"' >Remove</button>");
});
});
});
</script>
这是同一页面的 php/html 部分
<?php
$error= mysqli_connect_errno();
if($error!=null){
echo "<p>unable to connect with db</p>";
exit($output);
}
else
{
$sql="SELECT * FROM restaurant";
$res=mysqli_query($con,$sql);
while($row=mysqli_fetch_assoc($res)){
$restaurantID=$row['id'];
$sql="SELECT * FROM meal WHERE restaurant_id=".$restaurantID;
$meals=mysqli_query($con,$sql);
$check = mysqli_num_rows($meals);
if($check>0){
//list of meals for each restaurant
echo '<table id= "mealsList">';
echo '<thead>';
echo '<tr>';
echo "<caption>".$row['name']."</caption>" ;
echo "<tr ><th > Meals </th>"
. "<th colspan='2' > Status </th>"
."<br><br></tr>";
echo'</thead>';
//each meal
echo'<tbody>';
$resv=array(); //reserved meals
$remv=array(); //removed meals
while($row=mysqli_fetch_assoc($meals)){
$sql4="SELECT * FROM reservation WHERE meal_id=".$row['id']." AND recipient_id=".$_SESSION['recipient_id'];
$res4=mysqli_query($con,$sql4);
$row4=mysqli_fetch_assoc($res4);
if($row4){
$resv[]=$row;
}
else{
$remv[]= $row;
}
}
$i=0;
while($i<count($resv) ){
echo '<tr >';
echo '<td id="'.$resv[$i]['id'].'ReservedSt" ><a style="background-color:#00ff00" href="MealInfo.php?mealID='.$resv[$i]['id'].'">'.$resv[$i]['name'].''.'</a> </td>';
echo '<td id="'.$resv[$i]['id'].'toResvBtn">Reserved</td>';
echo '<td id="'.$resv[$i]['id'].'ToRmv"><button class = "rmvJQ" value = "'.$resv[$i]['id'].'" >Remove</button></td>';
echo '</tr>';
$i++;
}
$i=0;
while($i<count($remv)){
$checkZero = mysqli_query($con,"SELECT qty FROM meal WHERE id =".$remv[$i]['id']);
$checkZ=mysqli_fetch_assoc($checkZero);
if($checkZ['qty']>0){
echo '<tr id="RemovedSt" style="background-color:white" >'
. '<td ><a href="MealInfo.php?mealID='.$remv[$i]['id'].'">'.$remv[$i]['name'].'</a></td>' //<a href="enroll.php?classID='.$row['id'].'">Enroll</a>
. '<td id= "'.$remv[$i]['id'].'toResevededString"> <button class = "rsvJQ" value = "'.$remv[$i]['id'].'" >Reseve</button> </td>'
. '<td id = "'.$remv[$i]['id'].'tormovBtn"></td>'
. '</tr>';
}else{
echo '<tr>';
echo '<th ><a style="color:black;" href="MealInfo.php?mealID='.$remv[$i]['id'].'">'.$remv[$i]['name'].'</a> </th>';
echo '<td colspan="2" > meal is not available </td >';
echo '</tr>';
}
$i++;
}//end of while loop
echo '</tbody>';
echo '</table>';
}//end of if($check>0)
}//end of big while
}//end of big if-else
?>
那么有没有人遇到过这个问题或知道如何解决它?
解决方案
考虑以下。
配置 PHP 以创建以下HTML结构。
<table id="mealsList">
<thead>
<tr>
<caption>Vendor Name 1</caption>
<tr>
<th>Meals</th>
<th>Status</th>
<th>Options</th>
</tr>
</thead>
<tbody>
<tr id="item-1001">
<td class="mealName">
<a class="highlight-green" href="MealInfo.php?mealID=1001">Meal Item 1</a>
</td>
<td class="mealStatus">Reserved</td>
<td class="mealOptions">
<button class="btn btn-remove">Remove</button>
</td>
</tr>
<tr id="item-1002">
<td class="mealName">
<a class="highlight-green" href="MealInfo.php?mealID=1002">Meal Item 2</a>
</td>
<td class="mealStatus">Reserved</td>
<td class="mealOptions">
<button class="btn btn-remove">Remove</button>
</td>
</tr>
<tr id="item-1003">
<td class="mealName">
<a class="highlight-green" href="MealInfo.php?mealID=1003">Meal Item 3</a>
</td>
<td class="mealStatus">Reserved</td>
<td class="mealOptions">
<button class="btn btn-remove">Remove</button>
</td>
</tr>
</tbody>
</table>
您可以在这里看到,在 HTML 结构中,我们将项目 ID 分配给行而不是行的每个部分。当我们稍后需要分配事件回调时,这使得它更加相关。有一个参考点。
然后应用以下CSS
#mealsList {
width: 340px;
}
.highlight-green {
background-color: #00ff00;
}
.highlight-yellow {
background-color: yellow;
}
.big {
font-size: 200%;
}
这使您可以更轻松地在元素上添加或删除类,而不是更改特定样式。这也使得将来更容易管理更改,您只需更新 CSS,然后不必调整您的 PHP 或 JS 代码。
JavaScript
$(function() {
function removeItem(id) {
$.get("rmov.php", {
classID: id,
html: "success"
},
function(response) {
if (response == "success") {
console.log("Remove Successful");
$("#item-" + id + " .mealName a").removeClass("highlight-green");
$("#item-" + id + " .mealStatus").html("");
$("#item-" + id + " .mealOptions .btn").html("Reserve").toggleClass("btn-remove btn-reserve");
}
});
}
function reserveItem(id) {
$.get("rsv.php", {
classID: id,
html: "success"
},
function(response) {
if (response == "success") {
console.log("Reserve Successful");
$("#item-" + id + " .mealName a").addClass("highlight-yellow big");
$("#item-" + id + " .mealStatus").html("Reserved");
$("#item-" + id + " .mealOptions .btn").html("Remove").toggleClass("btn-remove btn-reserve");
}
});
}
$("#mealsList").on("click", ".btn-remove", function(event) {
removeItem($(this).closest("tr").attr("id").split("-")[1]);
});
$("#mealsList").on("click", ".btn-reserve", function(event) {
reserveItem($(this).closest("tr").attr("id").split("-")[1]);
});
});
工作示例:https ://jsfiddle.net/Twisty/wLzakshp/9/
首先,我们想.on()
在这个用例中使用 jQuery 来分配事件回调。这是因为可能会添加或更改元素,而这种类型的分配对此很有用。
委托事件处理程序的优点是它们可以处理来自以后添加到文档的后代元素的事件。通过选择在附加委托事件处理程序时保证存在的元素,您可以使用委托事件处理程序来避免频繁附加和删除事件处理程序的需要。
查看更多:https ://api.jquery.com/on/
我使用函数让重复特定动作变得更容易一些。这些函数接受 ID(来自 Row)并将该详细信息发送到适当的脚本。如果成功,则进行特定更改。
推荐阅读
- mysql - 根据 LEFT JOIN 过滤 MYSQL 结果
- php - 如果没有上传文件,则停止 file_exist 调用错误
- python - 图像为空,在 KnnMatcher OpenCV 中有不正确的深度错误
- java - 加快 Android 上的 for 循环
- c++ - 即使构建成功,Visual Studio Cmake 生成的项目也会一直重新构建
- reactjs - 在 React 中动态创建输入数组
- java - 为什么更改数组的顺序会导致超出时间限制?
- javascript - 在 GraphQL 中是否可以在对象类型级别上使用解析器?
- regex - 如何从正则表达式中排除字符串,以便如果字符串出现在一行文本中,它不会返回匹配项?
- python - curl python使用响应