我有一个PHP网站,里面有很多表格,可以在提交时转到某些页面。所以它们看起来像这样:
<form method='post' action='form_target.php'>
<input type='text' name='fieldname' />
<button type='submit'/>
</form>
我想同样的事情可以用$.post('form-target.php');
完成,而无需实际离开页面。但我试图阻止为许多不同的形式编写JavaScript代码。
那么,有没有一种简单的方法来检测页面上的表单,并将它们转换为 AJAX 调用呢?也许通过将onsubmit()
绑定,或者将事件onclick();
到$.post();
调用?
任何帮助实施这一点也将不胜感激。
.submit
事件附加到所有表单以捕获提交,然后在事件对象上使用.preventDefault()
来阻止实际页面提交(阻止它更改页面)。然后序列化表单的数据(创建一个名称-值配对字符串),从表单元素的 action 属性中获取 url,然后调用 jquery 的 ajax 函数
使用$("form")
没有其他任何东西作为选择器的一部分,会将其附加到页面上的所有表单
.HTML
<form method='post' action='form_target.php'>
<input type='text' name='fieldname' />
<button type='submit'/>
</form>
JAVASCRIPT
$("form").submit(function(e){
e.preventDefault();
var data = $(this).serialize();
var url = $(this).attr("action");
$.ajax({
url:url,
type:"POST",
data:data,
success:function(){
//do something when post succedes
},
error:function() {
// do something when it fails
}
});
});
JQuery .ajax
JQuery .serialize
JQuery .submit
为了进一步扩展这一点,您可以使每个表单执行特定的成功方法,这在您需要为特定表单提交发生特定操作的情况下会有所帮助。
首先给每个表单一个 data-* 属性,我们稍后可以在提交事件中使用该属性来触发该表单的特定函数。
<form method='post' action='form_target.php'
data-onerror="nameSubmitError"
data-onsuccess="nameSubmitSuccess">
然后创建我们在 data-* 属性中命名的两个函数
function nameSubmitError() {
//Do some code that will handle the error
}
function nameSubmitSuccess() {
//Do some code that will handle the success
}
在 .submit 事件中
$("form").submit(function(e){
e.preventDefault();
var data = $(this).serialize();
var url = $(this).attr("action");
var errorCallback = $(this).data("onerror");
var successCallback = $(this).data("onsuccess");
$.ajax({
url:url,
type:"POST",
success:function(){
//Check that we have a defined function before trying to execute it
if( typeof(window[successCallback]) == "function" ) {
//We do have a defined function so execute it
window[successCallback]();
}
},
error:function() {
//Check that we have a defined function before trying to execute it
if( typeof(window[errorCallback]) == "function" ) {
//We do have a defined function so execute it
window[errorCallback]();
}
}
});
});
当然,将所有回调函数放在全局空间中会污染它,因此您可以将所有函数设置到单个对象中并使用对象名称而不是window
var formCallbacks = {
nameSubmitError:function() {
//Do some code that will handle the error
},
nameSubmitSuccess: function() {
//Do some code that will handle the success
}
};
在 .submit 事件中,将window
更改为formCallbacks
//window[errorCallback]();
//Becomes
formCallbacks[errorCallback]();
是的,你可以试试 http://malsup.com/jquery/form/,这使用起来非常简单。
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.js"></script>
<script src="http://malsup.github.com/jquery.form.js"></script>
<script>
// wait for the DOM to be loaded
$(document).ready(function() {
// bind 'myForm' and provide a simple callback function
$('#myForm').ajaxForm(function() {
alert("Thank you for your submit!");
});
});
</script>
</head>
<body>
<form id="myForm" method='post' action='form_target.php'>
<input type='text' name='fieldname' />
<button type='submit'/>
</form>
</body>
</html>
http://api.jquery.com/submit/
$( "form" ).on( "submit", function( event ) {
// Your AJAX call
}
这样做:
$('form').on('submit', function() {
$.post(
$(this).prop('action'), // Your url action
$(this).serialize(), // Your data
success: function() { // Your callback function
alert('Submitted');
}
);
});