2012-01-22 5 views
2

Следующее, что я хотел бы сделать в моем сценарии JQuery. В функции отправки (4) ниже, я хочу решить, имеет ли форма ввод файла и отправляется либо с помощью ajax, либо только с обычной формой без asjax. Другими словами, если форма имеет выгрузку, сделайте регулярную отправку.JQuery Отправить форму изнутри Отправить функцию

Я написал вопрос в функции отправки ниже. Это единственное, что мне нужно, чтобы заставить его работать.

Спасибо!

function FindFileInput(){ 
    // check for file input 
    var FileInput = $('input:file'); 
    if(FileInput.length > 0){ 
     return true; 
    }else{ 
     return false; 
    } 
} 

function validation(){ 
    // code to validate form 
    ... 
} 

function ajaxSubmit(formData){ 
    $.ajax({ 
     // ajax submit code 
    }); 
} 

$(myForm).submit(function(e){ 
    e.preventDefault(); 

    // 1. if NO file input present 
    if(FindFileInput() === false){ 
     if(validation() === true){ 
     // serialize and call ajaxSubmit function 
     } 
    } 

    // 2. if file input IS present 
    if(FindFileInput() === true){ 
     if(validation() === true){ 
     // QUESTION: How do I submit the form here??? 
     } 
    } 
}); 

ответ

3

От http://api.jquery.com/submit/:

Теперь, когда форма была отправлена, сообщение предупреждается. Это происходит перед фактическим представлением, поэтому мы можем отменить действие отправки на , вызывая .preventDefault() для объекта события или возвращая false false из нашего обработчика. Мы можем инициировать событие вручную при нажатии на другой элемент :

Итак, поверните свою логику. Не вызывайте e.preventDefault() по умолчанию, а затем пытайтесь его отменить, а просто вызывайте, когда это действительно необходимо.

$(myForm).submit(function(e){ 

    // 1. if NO file input present 
    if(FindFileInput() === false){ 
     if(validation() === true){ 
      ajaxSubmit(formdata); 
     } 
    } 

    // 2. if file input IS present 
    if(FindFileInput() === true){ 
     if(validation() === true){ 
      return true; // submit form as normal, don't call e.preventDefault() 
     } 
    } 

    // Prevent form from submitting normally 
    e.preventDefault(); 
    return false; 
}); 
+1

Спасибо! Вышеупомянутое предложение также помогло, но это имеет больше смысла с точки зрения программирования и обучения. – user1002039

0

Если вы хотите, чтобы подача продолжалась, это не препятствует поведению по умолчанию и возвращает true.

$(myForm).submit(function(e){ 

    if(!FindFileInput()){ 
     if(validation()){ 
      //AJAX method 
     } 
    }else{ 
     if(validation()){ 
      return true; 
     } 
    } 
    e.preventDefault(); 
    return false; 
}); 
0

Не называть e.preventDefault() так рано, делать это только тогда, когда вы на самом деле хотите, чтобы остановить форму от их размещения путь по умолчанию (таким образом, при выборе файла). Таким образом, вы можете избавиться от второго if-statement и просто позволить JS-функции отправки ничего не делать, когда есть файл для отправки. Таким образом, форма будет отправлена ​​по умолчанию, если файл не выбран.

$(myForm).submit(function(e){ 

    // 1. if NO file input present 
    if(FindFileInput() === false){ 
     if(validation() === true){ 
     e.preventDefault(); 
     // Do your AJAX-stuff here 
     } 
    } 

}); 
0

this.submit() при условии, что вы не переопределены его с чем-то вроде <input name="submit" />

демо:

http://jsfiddle.net/4buHP/

.submit() Уроженец не срабатывает событие JQuery.

0

Простой! Я удалил e.preventDefault(); и добавил некоторые другие условия. Однако я представил очень процедурное (менее идеальное) решение.

$(myForm).submit(function(e){ 

    // 1. if NO file input present 
    if(FindFileInput() === false){ 
     if(validation() === true){ 
     // serialize and call ajaxSubmit function 

     return false; // stops form submissions, same as preventDefault but less chars. 
     } 
    } 

    // 2. if file input IS present 
    if(FindFileInput() === true){ 
     if(validation() === true){ 
     // QUESTION: How do I submit the form here??? 
     // no return false, moves forward. 
     } else { 
      return false; 
     } 
    } else { 
     return false; 
    } 
}); 
Смежные вопросы