使表单提交不重新加载页面
Making a form submit NOT reload the page
我仍在学习编写代码的正确和更有效的方法 - 目前我被困在这个当前问题上。
我有一个当前工作正常的表单 - 写入 sql 数据库,然后重新加载当前页面。我希望表格不重新加载页面。
我知道有一种方法可以用 jQuery 和 Ajax 来做到这一点 -- 老实说,我对这些还不是很熟练。
如果有办法用 PHP/HTML 做到这一点 - 我很乐意提供有关此方法的指导。
如果唯一的答案是 Java 和 Ajax - 我希望获得有关更改此表单以不重新加载页面的特定实例的指导。
按钮外观的屏幕截图 -- 三种颜色代表发票付款跟踪的 3 个阶段。单击时红色变为黄色,黄色变为绿色,绿色变为红色(以防单击错误)。
这是我的表单的前端代码:
<form action="jump_invoicepaid.php" method="post">
<input type="hidden" name="invoicepaid" value="'.$projectid.'">');
if ($projectpaid == 2) {
echo('<button type="submit" name="action" class="greenbutton" value="unpaid">Paid</button></form>');
} else if ($projectpaid == 1) {
echo('<button type="submit" name="action" class="yellowbutton" value="paid">Paid</button></form>');
} else {
echo('<button type="submit" name="action" class="redbutton" value="sent">Paid</button></form>');
}
这是我的表单的后端代码:
if ($_POST['action'] == paid) {
///marking project as paid
include_once('toolbox.php');
$projectid = $_POST['invoicepaid'];
mysqli_query($con, "UPDATE kmis_projects SET project_paid='2' WHERE project_id= '$projectid'");
header('Location: ./?page=pastevents');
} else if ($_POST['action'] == sent) {
///marking project as sent
include_once('toolbox.php');
$projectid = $_POST['invoicepaid'];
mysqli_query($con, "UPDATE kmis_projects SET project_paid='1' WHERE project_id= '$projectid'");
header('Location: ./?page=pastevents');
} else if ($_POST['action'] == unpaid) {
///marking project as unpaid
include_once('toolbox.php');
$projectid = $_POST['invoicepaid'];
mysqli_query($con, "UPDATE kmis_projects SET project_paid='0' WHERE project_id= '$projectid'");
header('Location: ./?page=pastevents');
}
我确实想完整地学习 jQuery 和 ajax,这是我的下一个学习清单。我知道他们会让这个问题更容易解决。
更新——我花了一些时间在 link 的帖子上,表明这是 link 的重复问题。我确实明白为什么......但它与我要问的内容或 link 中给出的答案的核心不同。我认为 link 可能是问题的 "an" 答案 - 但我对无需使用 jQuery 和 AJAX 即可解决问题的任何方法感兴趣 - 如果那是不可避免的,然后是 AJAX 如何适合我的代码和这种特定情况。我同样认为这与 link 不同,因为我的按钮填充了 3 个不同的 "if" 检查,根据填充和单击的按钮写入不同的值。
更新 2 --
这是我正在使用的当前代码。尽管看起来 ajax 没有发送按钮的名称或值。
<script>
$( document ).ready(function() {
$("button").click(function(e) {
e.preventDefault(); // prevent page refresh
$.ajax({
type: "POST",
url: "jump_invoicepaid.php",
data: $(this).serialize(), // serialize form data
success: function(data) {
window.location.replace("?page=pastevents");
},
error: function() {
// Error ...
}
});
});
});
</script>
<form action="">
<input type="hidden" name="invoicepaid" value="'.$projectid.'">
if ($projectpaid == 2) {
echo('<button type="submit" name="action" class="greenbutton" value="unpaid">Paid</button></form>');
} else if ($projectpaid == 1) {
echo('<button type="submit" name="action" class="yellowbutton" value="paid">Paid</button></form>');
} else {
echo('<button type="submit" name="action" class="redbutton" value="sent">Paid</button></form>');
}
为了从客户端(静态HTML和JavaScript)执行服务器端脚本(PHP),您需要使用Ajax技术。本质上,Ajax 将允许您发送 and/or 从服务器 "behind the scenes" 检索数据而不影响您的页面。
JavaScript,一种用于向您的网页添加交互性的客户端脚本语言,已经支持 Ajax。但是,语法相当冗长,因为您需要考虑浏览器及其版本之间的差异(尤其是 Internet Explorer 版本 5 到 11 的实现与 Chrome 或 Mozilla 不同)。
作为开发人员,您可以通过使用前端 框架 来避免这些技术细节,例如 jQuery(其他很好的例子是 Angular.js, Vue.js,以及其他)。 jQuery 本质上是一个用 vanilla JavaScript 编写的代码库,它简化了查询 DOM 等常见任务。它还提供了使用 Ajax 的表达语法。它将在内部解决浏览器不兼容问题。这样你就可以专注于你的高级逻辑,而不是像那样的低级问题。
再次强调,jQuery 代码也是 JavaScript 代码。因此,将以下 <script>
标记放置在页面的某处,就像您通常使用 JS 所做的那样。
<script>
$( document ).ready(function() {
$("form").submit(function(e) {
e.preventDefault(); // prevent page refresh
$.ajax({
type: "POST",
url: "jump_invoicepaid.php",
data: $(this).serialize(), // serialize form data
success: function(data) {
// Success ...
},
error: function() {
// Error ...
}
});
});
});
</script>
首先,一旦页面为 loaded,此代码将 运行。其次,它会将 submit
事件处理程序附加到 HTML 页面中的每个 <form>
。当您单击 <button type='submit'>
时,将触发此事件。 e.preventDefault()
将停止正常提交表单并阻止页面刷新。请注意,e
是包含有关 submit
事件(例如它源自哪个元素)的信息的事件对象。
接下来,我们将使用 jQuery library. It is a generic method, and we could as well have used $.post
, since we are specifically doing the POST request 中的 $.ajax
方法发送实际的 Ajax 请求。它将由您的 PHP 文件 jump_invoicepaid.php
.
接收
现在,在您的 PHP 文件中,您有以下行:header('Location: ./?page=pastevents');
强制使用 GET 参数重定向到主页。如果你想有相同的行为,那么你需要删除该行,并将 window.location.replace("/?page=pastevents")
放入你的 JavaScript 代码中:
// in your Ajax request above...
success: function(data) {
window.location.replace("/?page=pastevents");
},
但是这会刷新页面,因为您实际上是在使用 GET 方法请求主页。我猜这样做是为了更新页面上的信息。您可以通过添加/更改/删除页面上的元素(即在 DOM 中)而无需重定向。这样,您可以将数据从服务器发送回客户端,如果成功收到响应,您可以在 JavaScript 中获取该响应并相应地操作您的网页。
如果您对后者感兴趣,请考虑使用 JSON 格式。您只需要在 PHP 中执行 json_encode
,然后在客户端使用 JSON.parse(...)
解析 JSON 字符串。例如阅读 here。
希望对您有所帮助!
我仍在学习编写代码的正确和更有效的方法 - 目前我被困在这个当前问题上。
我有一个当前工作正常的表单 - 写入 sql 数据库,然后重新加载当前页面。我希望表格不重新加载页面。
我知道有一种方法可以用 jQuery 和 Ajax 来做到这一点 -- 老实说,我对这些还不是很熟练。
如果有办法用 PHP/HTML 做到这一点 - 我很乐意提供有关此方法的指导。
如果唯一的答案是 Java 和 Ajax - 我希望获得有关更改此表单以不重新加载页面的特定实例的指导。
按钮外观的屏幕截图 -- 三种颜色代表发票付款跟踪的 3 个阶段。单击时红色变为黄色,黄色变为绿色,绿色变为红色(以防单击错误)。
这是我的表单的前端代码:
<form action="jump_invoicepaid.php" method="post">
<input type="hidden" name="invoicepaid" value="'.$projectid.'">');
if ($projectpaid == 2) {
echo('<button type="submit" name="action" class="greenbutton" value="unpaid">Paid</button></form>');
} else if ($projectpaid == 1) {
echo('<button type="submit" name="action" class="yellowbutton" value="paid">Paid</button></form>');
} else {
echo('<button type="submit" name="action" class="redbutton" value="sent">Paid</button></form>');
}
这是我的表单的后端代码:
if ($_POST['action'] == paid) {
///marking project as paid
include_once('toolbox.php');
$projectid = $_POST['invoicepaid'];
mysqli_query($con, "UPDATE kmis_projects SET project_paid='2' WHERE project_id= '$projectid'");
header('Location: ./?page=pastevents');
} else if ($_POST['action'] == sent) {
///marking project as sent
include_once('toolbox.php');
$projectid = $_POST['invoicepaid'];
mysqli_query($con, "UPDATE kmis_projects SET project_paid='1' WHERE project_id= '$projectid'");
header('Location: ./?page=pastevents');
} else if ($_POST['action'] == unpaid) {
///marking project as unpaid
include_once('toolbox.php');
$projectid = $_POST['invoicepaid'];
mysqli_query($con, "UPDATE kmis_projects SET project_paid='0' WHERE project_id= '$projectid'");
header('Location: ./?page=pastevents');
}
我确实想完整地学习 jQuery 和 ajax,这是我的下一个学习清单。我知道他们会让这个问题更容易解决。
更新——我花了一些时间在 link 的帖子上,表明这是 link 的重复问题。我确实明白为什么......但它与我要问的内容或 link 中给出的答案的核心不同。我认为 link 可能是问题的 "an" 答案 - 但我对无需使用 jQuery 和 AJAX 即可解决问题的任何方法感兴趣 - 如果那是不可避免的,然后是 AJAX 如何适合我的代码和这种特定情况。我同样认为这与 link 不同,因为我的按钮填充了 3 个不同的 "if" 检查,根据填充和单击的按钮写入不同的值。
更新 2 -- 这是我正在使用的当前代码。尽管看起来 ajax 没有发送按钮的名称或值。
<script>
$( document ).ready(function() {
$("button").click(function(e) {
e.preventDefault(); // prevent page refresh
$.ajax({
type: "POST",
url: "jump_invoicepaid.php",
data: $(this).serialize(), // serialize form data
success: function(data) {
window.location.replace("?page=pastevents");
},
error: function() {
// Error ...
}
});
});
});
</script>
<form action="">
<input type="hidden" name="invoicepaid" value="'.$projectid.'">
if ($projectpaid == 2) {
echo('<button type="submit" name="action" class="greenbutton" value="unpaid">Paid</button></form>');
} else if ($projectpaid == 1) {
echo('<button type="submit" name="action" class="yellowbutton" value="paid">Paid</button></form>');
} else {
echo('<button type="submit" name="action" class="redbutton" value="sent">Paid</button></form>');
}
为了从客户端(静态HTML和JavaScript)执行服务器端脚本(PHP),您需要使用Ajax技术。本质上,Ajax 将允许您发送 and/or 从服务器 "behind the scenes" 检索数据而不影响您的页面。
JavaScript,一种用于向您的网页添加交互性的客户端脚本语言,已经支持 Ajax。但是,语法相当冗长,因为您需要考虑浏览器及其版本之间的差异(尤其是 Internet Explorer 版本 5 到 11 的实现与 Chrome 或 Mozilla 不同)。
作为开发人员,您可以通过使用前端 框架 来避免这些技术细节,例如 jQuery(其他很好的例子是 Angular.js, Vue.js,以及其他)。 jQuery 本质上是一个用 vanilla JavaScript 编写的代码库,它简化了查询 DOM 等常见任务。它还提供了使用 Ajax 的表达语法。它将在内部解决浏览器不兼容问题。这样你就可以专注于你的高级逻辑,而不是像那样的低级问题。
再次强调,jQuery 代码也是 JavaScript 代码。因此,将以下 <script>
标记放置在页面的某处,就像您通常使用 JS 所做的那样。
<script>
$( document ).ready(function() {
$("form").submit(function(e) {
e.preventDefault(); // prevent page refresh
$.ajax({
type: "POST",
url: "jump_invoicepaid.php",
data: $(this).serialize(), // serialize form data
success: function(data) {
// Success ...
},
error: function() {
// Error ...
}
});
});
});
</script>
首先,一旦页面为 loaded,此代码将 运行。其次,它会将 submit
事件处理程序附加到 HTML 页面中的每个 <form>
。当您单击 <button type='submit'>
时,将触发此事件。 e.preventDefault()
将停止正常提交表单并阻止页面刷新。请注意,e
是包含有关 submit
事件(例如它源自哪个元素)的信息的事件对象。
接下来,我们将使用 jQuery library. It is a generic method, and we could as well have used $.post
, since we are specifically doing the POST request 中的 $.ajax
方法发送实际的 Ajax 请求。它将由您的 PHP 文件 jump_invoicepaid.php
.
现在,在您的 PHP 文件中,您有以下行:header('Location: ./?page=pastevents');
强制使用 GET 参数重定向到主页。如果你想有相同的行为,那么你需要删除该行,并将 window.location.replace("/?page=pastevents")
放入你的 JavaScript 代码中:
// in your Ajax request above...
success: function(data) {
window.location.replace("/?page=pastevents");
},
但是这会刷新页面,因为您实际上是在使用 GET 方法请求主页。我猜这样做是为了更新页面上的信息。您可以通过添加/更改/删除页面上的元素(即在 DOM 中)而无需重定向。这样,您可以将数据从服务器发送回客户端,如果成功收到响应,您可以在 JavaScript 中获取该响应并相应地操作您的网页。
如果您对后者感兴趣,请考虑使用 JSON 格式。您只需要在 PHP 中执行 json_encode
,然后在客户端使用 JSON.parse(...)
解析 JSON 字符串。例如阅读 here。
希望对您有所帮助!