Javascript 当使用 AJAX 检索表单时,表单提交 preventDefault 不起作用
Javascript form submit preventDefault not working when form is retrieved with AJAX
我有一个表单,我使用 Javascript 和 preventDefault 提交了该表单。一切正常。但是,当我使用 AJAX 调用与数据库中的其他数据一起检索表单时,该表单将不再使用 Javascript 提交,而是尝试使用正常 action="" 刷新整个页面和方法="post"。似乎由于 AJAX 调用,preventDefault 以某种方式被禁用?
AJAX 调用以从数据库中获取表单和其他数据:
<a href="#" onClick="return false" onmousedown="javascript:loadnames('<?php echo $postid;?>');">Load Names</a>
<div id="form-container"></div>
<!-- is empty, but contains the form upon ajax call above-->
AJAX 检索到 HTML 表单以提交 Javascript:
<div id="form-container">
<!--let user add a name to DB not contained in DB list below-->
<form method="post" action="" id="addnameform">
<input name="name" id="name" type="text" value=""/>
<input type="submit" name="add-name-submit" value="Add"/>
</form>
<!--get a list of names from DB-->
<?php
$sql = "SELECT * FROM names ORDER BY name ASC";
$query = mysqli_query($connection, $sql);
while ($row = mysqli_fetch_array($query)) {
$name = $row["name"];
echo ...
} // end while
?>
</div><!--end-container-->
Javascript 提交上面的 HTML 表格:
$("#addnameform").submit(function(event) {
event.preventDefault();
var $form = $("#addnameform");
var name = $form.find( "input[name='name']" ).val();
$.ajax({
url: "ajax.php",
type: "POST",
...
如前所述,当表单在页面加载时显示在页面上时,一切正常。但是一旦我将它包装在一个容器中,该容器最初是 "empty",但在 AJAX 调用时出现,preventDefault 就被禁用了。
您需要有一个父 dom 对象,您可以异步加载您的表单,您可以试试下面的 jQuery 代码吗?
$(function(){
$("#form-container").append("<form id=\"addnameform\" method=\"post\"><button type=\"submit\">Submit Me</button></form>");
$("#form-container").on("submit","#addnameform",function(event){
event.preventDefault();
alert("Submit fired!");
//Your business goes here...
return false;
});
});
这是一个工作示例:https://jsfiddle.net/1fta504n/2/
PS: #form-container 可以是任何类型的 dom 元素前文档,"body", "div", ".class "等
希望对您有所帮助
您必须将提交事件绑定到您的主体(或从一开始就存在的任何其他父级 DOM)
$("body").on('submit', '#addnameform', function(event) {
//...
});
我有一个表单,我使用 Javascript 和 preventDefault 提交了该表单。一切正常。但是,当我使用 AJAX 调用与数据库中的其他数据一起检索表单时,该表单将不再使用 Javascript 提交,而是尝试使用正常 action="" 刷新整个页面和方法="post"。似乎由于 AJAX 调用,preventDefault 以某种方式被禁用?
AJAX 调用以从数据库中获取表单和其他数据:
<a href="#" onClick="return false" onmousedown="javascript:loadnames('<?php echo $postid;?>');">Load Names</a>
<div id="form-container"></div>
<!-- is empty, but contains the form upon ajax call above-->
AJAX 检索到 HTML 表单以提交 Javascript:
<div id="form-container">
<!--let user add a name to DB not contained in DB list below-->
<form method="post" action="" id="addnameform">
<input name="name" id="name" type="text" value=""/>
<input type="submit" name="add-name-submit" value="Add"/>
</form>
<!--get a list of names from DB-->
<?php
$sql = "SELECT * FROM names ORDER BY name ASC";
$query = mysqli_query($connection, $sql);
while ($row = mysqli_fetch_array($query)) {
$name = $row["name"];
echo ...
} // end while
?>
</div><!--end-container-->
Javascript 提交上面的 HTML 表格:
$("#addnameform").submit(function(event) {
event.preventDefault();
var $form = $("#addnameform");
var name = $form.find( "input[name='name']" ).val();
$.ajax({
url: "ajax.php",
type: "POST",
...
如前所述,当表单在页面加载时显示在页面上时,一切正常。但是一旦我将它包装在一个容器中,该容器最初是 "empty",但在 AJAX 调用时出现,preventDefault 就被禁用了。
您需要有一个父 dom 对象,您可以异步加载您的表单,您可以试试下面的 jQuery 代码吗?
$(function(){
$("#form-container").append("<form id=\"addnameform\" method=\"post\"><button type=\"submit\">Submit Me</button></form>");
$("#form-container").on("submit","#addnameform",function(event){
event.preventDefault();
alert("Submit fired!");
//Your business goes here...
return false;
});
});
这是一个工作示例:https://jsfiddle.net/1fta504n/2/
PS: #form-container 可以是任何类型的 dom 元素前文档,"body", "div", ".class "等
希望对您有所帮助
您必须将提交事件绑定到您的主体(或从一开始就存在的任何其他父级 DOM)
$("body").on('submit', '#addnameform', function(event) {
//...
});