[英]Form not submitting inside $.ajax success function
我正在使用jquery + Ajax驗證重復的名稱。 一切都工作正常,除了一旦一切都返回真實,表單不提交
發生了什么
else
部分正在運行),但表單未提交 。 我希望表單繼續並在else
部分提交自己 jQuery代碼
$('#form1').submit(function(){
var name = $('#shelf_name').val();
if(name == '')
{
alert('Shelf name is required');
$('#shelf_name').focus();
}
else
{
$.ajax({
type:'post',
url:'check-duplicate-shelf-name.php',
data:{'name':name},
context:this,
success:function(data)
{
if(data == 'stop')
{
alert('Shelf name already exists'); // working if duplicate name is found
}
else
{
alert('else working?'); // alert box is showing up if name is not duplicate
this.submit(); // but after alert, this line not executing
}
}
});
}
return false;
});
HTML表單標記
<form action="add-shelf-post.php" method="post" id="form1">
check-duplicate-shelf-name.php
<?php
include 'confignew.php';
$name = $_POST['name'];
// peforming database operations
.
.
.
// and then
if($db->num_rows($q) == 0)
{
echo 'go';
}
else
{
echo 'stop';
}
我錯過了一些非常明顯的東西。 希望有人能指出這一點。
在Firefox中使用Firebug進行檢查后,我確實遇到了錯誤。 我在使用Chrome進行測試時沒有顯示出來。 這是截圖。
我會在運行時使用jQuery驗證器檢查它,而不是提交,但另一種方法是進行Rest Style調用。 我認為沒有必要POST一個完整的表單來檢查1字段。
$('#form1').submit(function(){
//Check not empty
if(!$('#shelf_name').val()) {
alert('Shelf name is required');
$('#shelf_name').focus();
} else {
//Valiate Rest style call
$.getJSON("check-duplicate-shelf-name.php/".concat($('#shelf_name').val()), function(data) {
//If you only have 2 states I would return boolean to faster check ex: if(!data){
if(data == 'stop') {
// working if duplicate name is found
alert('Shelf name already exists');
} else {
alert('else working?'); // alert box is showing up if name is not duplicate
$('#form1').submit(); // but after alert, this line not executing
}
});
}
return false;
});
當我在評論中說你可以手動發布表單而不是使用$(this).submit(); 我指的是:
$.ajax({
url: "./myurl",
cache: false,
type: "POST",
data: $("#form1").serialize(),
success: function(){
console.log("Submit successful");
}
});
做遠程表單驗證? 簽出jquery.validate plugin
及其.remote()
規則。
除此之外你的代碼看起來很好。 這是一個有效的演示: http : //jsfiddle.net/dKUSb/7/
我已經測試了您的代碼,它適用於Chrome,IE 8和Mozilla Firefox。 檢查在整個頁面中是否有一個元素,其中包含單詞submit的名稱屬性值。 如果有重命名它。 例如,像這樣的輸入標記: <input type="submit" name="submit" value="Submit Form"/>
將導致Mozilla Firebug中出現錯誤。
此外,您可以找到替代解決方案。
以下解決方案已在Chrome,IE 8和Mozilla Firefox中成功通過測試。
替代方案
檢索要發布的帖子URL和數據,並在成功回調中執行帖子。
以下實施已在Chrome,IE 8和Mozilla Firefox中成功測試 。 在成功回調中,將檢索要發布的數據並將其發布到URL,並將結果放入具有id 結果的div。 您可以對其進行修改以滿足您的需求。
$(document).ready(function() {
$('#form1').submit(function(){
var name = $('#shelf_name').val();
if(name == '')
{
alert('Shelf name is required');
$('#shelf_name').focus();
}
else
{
$.ajax({
type:'post',
url:'check-duplicate-shelf-name.php',
data:{'name':name},
context:this,
success:function(data)
{
if(data == 'stop')
{
alert('Shelf name already exists');
}
else
{
alert('else working?');
//this.submit();
//$(this).submit();
// get the post url and the data to be posted
var $form = $(this);
shelfNameVal = $form.find( 'input[id="shelf_name"]' ).val(),
url = $form.attr( 'action' );
// Send the form data and put the results in the result div
$.post(url, { shelf_name: shelfNameVal },
function(data) {
$( "#result" ).empty().append(data);
}
);
}
}
});
}
return false;
});
});
我希望這有幫助。
在這種情況下,您可以從callbacks
中受益。 只需將代碼分開如下:
使用將返回對象的回調函數{status: 'true or false', message: 'Some text'}
function validity(callback){
var name = $('#shelf_name').val();
if(name == '')
{
return callback({status: false, message: 'Shelf name is required'});
}
else
{
$.ajax({
type:'post',
url:'check-duplicate-shelf-name.php',
data:{'name':name},
context:this,
success:function(data)
{
if(data == 'stop')
{
return callback({status: false, message: 'Shelf name already exists'});
}
else
{
return callback({status: true, message: 'else working?'});
}
}
});
}
//just for safety :))
return callback({status: false, message: 'something went wrong completely'});
});
這將返回AJAX調用的結果。 它將等待AJAX完成並返回相應的分支結果if
...
..現在你可以用它:
$('#form1').submit(function(){
validity(function(result){
if (result.status) { //status is true
return true;
}
else
{
alert(result.message);
$('#shelf_name').focus();
return false;
}
});
});
......或者只是將它們組合起來:
$('#form1').submit(function(){
// definition
function validity(callback){
var name = $('#shelf_name').val();
if(name == '')
{
return callback({status: false, message: 'Shelf name is required'});
}
else
{
$.ajax({
type:'post',
url:'check-duplicate-shelf-name.php',
data:{'name':name},
context:this,
success:function(data)
{
if(data == 'stop')
{
return callback({status: false, message: 'Shelf name already exists'});
}
else
{
return callback({status: true, message: 'else working?'});
}
}
});
}
//just for safety :))
return callback({status: false, message: 'something went wrong completely'});
});
//usage
validity(function(result){
if (result.status) { //status is true
return true;
}
else
{
alert(result.message);
$('#shelf_name').focus();
return false;
}
});
});
希望這可以幫助
而不是this.submit()寫:
document.yourFormName.method = "POST";
document.yourFormName.action = "Relative_URL_to_Go_to";
document.yourFormName.submit();
或者,如果您不知道formName,您可以使用:
document.forms[0].method = "POST";
document.forms[0].action = "Relative_URL_to_Go_to";
document.forms[0].submit();
完全由於范圍
你在哪里
alert('else working?'); // alert box is showing up if name is not duplicate
this.submit(); // but after alert, this line not executing
這是指ajax對象,而不是表單。 這是因為它現在在另一個函數中。
我添加$form = $(this);
在ajax調用之前聲明一個可以在回調中使用的變量。
嘗試這個:
$('#form1').submit(function( e ){
e.peventDefault();
var name = $('#shelf_name').val();
if(name == '')
{
alert('Shelf name is required');
$('#shelf_name').focus();
}
else
{
$form = $(this);
$.ajax({
type:'post',
url:'check-duplicate-shelf-name.php',
data:{'name':name},
context:this,
success:function(data)
{
if(data == 'stop')
{
alert('Shelf name already exists'); // working if duplicate name is found
}
else
{
alert('else working?'); // alert box is showing up if name is not duplicate
$form.submit(); // but after alert, this line not executing
}
}
});
}
return false;
});
更新:我昨天可能完全沒有了。 嘗試添加e.preventDefault(); 就在提交電話之上。 另外,在function()定義中添加e變量。 檢查上面的更新代碼。
以下是有關preventDefault()的一些文檔: http : //api.jquery.com/event.preventDefault/
不要嘗試多檢查獲取簡單按鈕並在該事件中添加onclick事件下面的代碼
HTML代碼
<input type="button" value="submit" onclick="formsubmit();">
javascript代碼
function formsubmit() {
var name = $('#shelf_name').val();
if (name == '') {
alert('Shelf name is required');
$('#shelf_name').focus();
} else {
$.ajax({
type: 'post',
url: 'check-duplicate-shelf-name.php',
data: {
'name': name
},
context: this,
success: function (data) {
if (data == 'stop') {
alert('Shelf name already exists'); // working if duplicate name is found
} else {
alert('else working?'); // alert box is showing up if name is not duplicate
$('#form1').submit()
}
}
});
}
}
表單未提交的原因是您從submit
事件處理程序返回false
,這會導致默認操作(提交)不會發生。 即使你調用submit()
方法,你仍然在submit
事件處理程序中,它返回false
。
您可能需要考慮更改處理表單提交的服務器端邏輯,以檢查重復項,或將重復檢查ajax帖子附加到文本框的blur
事件,或者@rajesh kakawat建議的提交按鈕(除了附加jQuery而不是HTML屬性)。 例:
$('#form1').submit(function(){
var name = $('#shelf_name').val();
if(name == '')
{
alert('Shelf name is required');
$('#shelf_name').focus();
return false;
}
});
$('#shelf_name').on('blur', function () {
var $this = $(this),
name = $this.val();
if(name == '')
{
alert('Shelf name is required');
$this.focus();
return false;
}
$.ajax({
type:'post',
url:'check-duplicate-shelf-name.php',
data:{'name':name},
success:function(data)
{
if(data == 'stop')
{
alert('Shelf name already exists'); // working if duplicate name is found
}
else
{
alert('else working?'); // alert box is showing up if name is not duplicate
$('#form1').submit(); // this should work now
}
}
});
});
我不確定為什么this.submit();
line以前工作,因為我不太了解你的應用程序,腳本版本等。你可能想考慮使用jsfiddle發布一個例子。
$('#form1').submit(function(){
var name = $('#shelf_name').val();
if(name == '')
{
alert('Shelf name is required');
$('#shelf_name').focus();
}
else
{
var istrue = false;
$.ajax({
type:'post',
url:'check-duplicate-shelf-name.php',
data:{'name':name},
context:this,
success:function(data)
{
if(data == 'stop')
{
alert('Shelf name already exists');
istrue = false;
}
else
{
alert('else working?') // alert box is showing up
istrue = true;
}
}
});
return istrue;
}
});
像這樣的東西:)不能測試
我們有同樣的問題,並認為我們整理出來了。
問題是.submit()
動作在“thread” $.ajax
里面都不起作用$.post
。 為此,您必須在$.ajax
塊中添加async:false
指令,並在$.ajax
執行完成時提交表單。
沒有測試,但這是一個工作的想法:
HTML:
<input type='submit' onClick='javascript:MyCheck(); return false;'>
javacript:
function Mycheck() {
var result = "";
$.ajax {
async:false,
url: you_url_here,
timeout: 15000,
success: function(data) {
result="success";
},
error: function(request, status, err) {
result="error";
}
};
// Here, if success -> SUBMIT FORM or whatever
// Only get here if "ASYNC" = FALSE!!!
if (result == "success") {
$("form").submit(); // this submits the form
return;
} else {
alert('error');
// the form will not be post
}
}
享受它的工作..
document.createElement('form').submit.call(document.formname);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.