Как я могу захватить ответ формы.представить
у меня есть следующий код:
<script type="text/javascript">
function SubmitForm()
{
form1.submit();
}
function ShowResponse()
{
}
</script>
.
.
.
<div>
<a href="#" onclick="SubmitForm();">Click</a>
</div>
Я хочу захватить html-ответ form1.submit? Как мне это сделать? Могу ли я зарегистрировать любую функцию обратного вызова в form1.отправить метод?
20 ответов:
вы не сможете сделать это легко с помощью простого javascript. Когда вы публикуете форму, входные данные формы отправляются на сервер, и ваша страница обновляется - данные обрабатываются на стороне сервера. То есть,
submit()функция не возвращает ничего, он просто отправляет данные формы на сервер.Если вы действительно хотели получить ответ на Javascript (без обновления страницы), то вам нужно будет использовать AJAX, и когда вы начнете говорить об использовании AJAX, вы будете нужно для использования библиотеки. jQuery на сегодняшний день является наиболее популярным, и мой личный фаворит. Есть отличный плагин для jQuery под названием форма, которые будут делать именно то, что это звучит, как вы хотите.
вот как бы вы использовали jQuery и этот плагин:
$('#myForm') .ajaxForm({ url : 'myscript.php', // or whatever dataType : 'json', success : function (response) { alert("The server says: " + response); } }) ;
альтернативой Ajax является установка невидимого
<iframe>как цель вашей формы и прочитать содержимое этого<iframe>в своемonloadобработчик. Но зачем беспокоиться, когда есть Аякс?Примечание: Я просто хотел упомянуть эту альтернативу, так как некоторые из ответов утверждают, что это невозможно чтобы достичь этого без Ajax.
Я делаю это так и работает.
$('#form').submit(function(){ $.ajax({ url: $('#form').attr('action'), type: 'POST', data : $('#form').serialize(), success: function(){ console.log('form submitted.'); } }); return false; });
Я не уверен, что вы понимаете, что submit() делает...
когда вы
form1.submit();информация о форме отправляется на веб-сервер.веб-сервер будет делать все, что он должен делать, и возвращать клиенту совершенно новую веб-страницу(обычно ту же страницу с чем-то измененным).
таким образом, вы не можете "поймать" возврат формы.отправить () действие.
Не-jQuery путь, из комментария 12me21:
var xhr = new XMLHttpRequest(); xhr.open("POST", "/your/url/name.php"); xhr.onload = function(event){ alert("The server responded with: " + event.target.response); }; var formData = new FormData(document.getElementById("myForm")); xhr.send(formData);
нет обратного вызова. Это как переход по ссылке.
Если вы хотите захватить ответ сервера, используйте AJAX или отправьте его в Iframe и возьмите то, что появляется там после iframe
onload()событие.
будущее интернет-поисковики:
для новых браузеров (с 2018 года: Chrome, Firefox, Safari, Opera, Edge и большинство мобильных браузеров, но не IE),
fetchэто стандартный API, который упрощает асинхронные сетевые вызовы (для чего мы привыкли нуждатьсяXMLHttpRequestили jQuery$.ajax).вот традиционная форма:
<form id="myFormId" action="/api/process/form" method="post"> <!-- form fields here --> <button type="submit">SubmitAction</button> </form>Если вам передана форма, подобная приведенной выше (или вы создали ее, потому что это семантический html), то вы можете обернуть
fetchкод в обработчик событий, как показано ниже:document.forms['myFormId'].addEventListener('submit', (event) => { event.preventDefault(); // TODO do something here to show user that form is being submitted fetch(event.target.action, { method: 'POST', body: new URLSearchParams(new FormData(event.target)) // event.target is the form }).then((resp) => { return resp.json(); // or resp.text() or whatever the server sends }).then((body) => { // TODO handle body }).catch((error) => { // TODO handle error }); });(или, если вам нравится оригинальный плакат, который вы хотите вызвать вручную без события отправки, просто поместите
fetchкод там и передать ссылку на элементformэлемент вместо использованияevent.target.)документы:
Fetch: https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API
другой: https://developer.mozilla.org/en-US/docs/Learn/HTML/Forms/Sending_forms_through_JavaScript Эта страница в 2018 году не упоминает fetch (пока). Но в нем упоминается, что трюк target="myIFrame" устарел. И у него также есть пример формы.addEventListener для события 'submit'.
$.ajax({ url: "/users/login/", //give your url here type: 'POST', dataType: "json", data: logindata, success: function ( data ){ // alert(data); do your stuff }, error: function ( data ){ // alert(data); do your stuff } });
Это мой код для этой проблемы:
<form id="formoid" action="./demoText.php" title="" method="post"> <div> <label class="title">First Name</label> <input type="text" id="name" name="name" > </div> <div> <input type="submit" id="submitButton" name="submitButton" value="Submit"> </div> </form> <script type='text/javascript'> /* attach a submit handler to the form */ $("#formoid").submit(function(event) { /* stop form from submitting normally */ event.preventDefault(); /* get the action attribute from the <form action=""> element */ var $form = $( this ), url = $form.attr( 'action' ); /* Send the data using post with element id name and name2*/ var posting = $.post( url, { name: $('#name').val()} ); /* Alerts the results */ posting.done(function( data ) { alert('success'); }); }); </script>
Если вы хотите захватить вывод запроса AJAX с помощью Chrome, вы можете выполнить следующие простые шаги:
- Откройте Панель инструментов программистов
- перейти к консоли и прямо в любом месте внутри него
- в появившемся меню нажмите кнопку "Включить ведение журнала XMXHTTPRequest"
- после этого каждый раз, когда вы делаете запрос AJAX, появляется сообщение, начинающееся с "XHR finished loading:http://......"появится в вашем приставка.
- нажав на ссылку, которая появляется, принесет "вкладку ресурсов", где вы можете увидеть заголовки и содержание ответа!
вы можете
event.preventDefault()в обработчике щелчка для вашей кнопки отправки, чтобы убедиться, что HTML-форма по умолчаниюsubmitсобытие не срабатывает (что приводит к обновлению страницы).Другой альтернативой было бы использовать разметку hackier form: это использование
<form>иtype="submit"это мешает желаемому поведению здесь; поскольку они в конечном итоге приводят к событиям щелчка, обновляющим страницу.если вы все еще хотите использовать
<form>, и вы не хотите писать пользовательские обработчики щелчков, вы можете использовать jQueryajaxметод, который абстрагирует всю проблему для вас, выставляя методы обещания дляsuccess,errorи т. д.
чтобы резюмировать, вы можете решить свою проблему либо:
• предотвращение поведения по умолчанию в функции обработки с помощью
event.preventDefault()• использование элементов, которые не имеют поведения по умолчанию (например,
<form>)* использование jQuery
ajax
(i просто заметил, что этот вопрос с 2008 года, не уверен, почему он появился в моем канале; во всяком случае, надеюсь, это четкий ответ)
основываясь на ответе @rajesh_kw (https://stackoverflow.com/a/22567796/4946681), я обрабатываю форму после ошибок и успеха:
$('#formName').on('submit', function(event) { event.preventDefault(); // or return false, your choice $.ajax({ url: $(this).attr('action'), type: 'post', data: $(this).serialize(), success: function(data, textStatus, jqXHR) { // if success, HTML response is expected, so replace current if(textStatus === 'success') { // https://stackoverflow.com/a/1236378/4946681 var newDoc = document.open('text/html', 'replace'); newDoc.write(data); newDoc.close(); } } }).fail(function(jqXHR, textStatus, errorThrown) { if(jqXHR.status == 0 || jqXHR == 302) { alert('Your session has ended due to inactivity after 10 minutes.\nPlease refresh this page, or close this window and log back in to system.'); } else { alert('Unknown error returned while saving' + (typeof errorThrown == 'string' && errorThrown.trim().length > 0 ? ':\n' + errorThrown : '')); } }); });Я использую
thisчтобы моя логика была повторно использована, я ожидаю, что HTML будет возвращен при успешном выполнении, поэтому я визуализирую его и заменяю текущую страницу, и в моем случае я ожидаю перенаправления на страницу входа, если сеанс истекает, поэтому я перехватываю это перенаправление, чтобы сохранить состояние страницы.теперь пользователи можно войти в систему через другую вкладку и попробовать их отправить снова.
вы можете сделать это с помощью javascript и AJAX технологии. Взгляните на jquery и на это форма plug in. Вам нужно только включить два JS-файла для регистрации обратного вызова для формы.представить.
Вы можете сделать это с помощью jQuery и
ajax()способ:<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script> <script language="javascript" type="text/javascript"> function submitform() { $.ajax({ headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, type: "POST", url : "/hello.hello", dataType : "json", data : JSON.stringify({"hello_name": "hello"}), error: function () { alert('loading Ajax failure'); }, onFailure: function () { alert('Ajax Failure'); }, statusCode: { 404: function() { alert("missing info"); } }, success : function (response) { alert("The server says: " + JSON.stringify(response)); } }) .done(function( data ) { $("#result").text(data['hello']); }); };</script>
$(document).ready(function() { $('form').submit(function(event) { event.preventDefault(); $.ajax({ url : "<wiki:action path='/your struts action'/>",//path of url where u want to submit form type : "POST", data : $(this).serialize(), success : function(data) { var treeMenuFrame = parent.frames['wikiMenu']; if (treeMenuFrame) { treeMenuFrame.location.href = treeMenuFrame.location.href; } var contentFrame = parent.frames['wikiContent']; contentFrame.document.open(); contentFrame.document.write(data); contentFrame.document.close(); } }); }); });Blockquote
одного из всех использовать $(документ).готов (функция ()) внутри этого использования ('formid').подать(функция(событие)) а затем предотвратите действие по умолчанию aftyer, которое вызывает отправку формы ajax $.Аякс({, , , , }); он примет параметр у может выбрать согласовывать ваше требование затем вызовите afunction success:function(data){ //делайте все, что вы хотите мой пример, чтобы поставить ответ html на div }
прежде всего нам понадобится serializeObject ();
$.fn.serializeObject = function () { var o = {}; var a = this.serializeArray(); $.each(a, function () { if (o[this.name]) { if (!o[this.name].push) { o[this.name] = [o[this.name]]; } o[this.name].push(this.value || ''); } else { o[this.name] = this.value || ''; } }); return o; };затем вы делаете основной пост и получить ответ
$.post("/Education/StudentSave", $("#frmNewStudent").serializeObject(), function (data) { if(data){ //do true } else { //do false } });
У меня есть следующий код perfactly запустить с помощью ajax с несколькими частями данных формы
function getUserDetail() { var firstName = document.getElementById("firstName").value; var lastName = document.getElementById("lastName").value; var username = document.getElementById("username").value; var email = document.getElementById("email").value; var phoneNumber = document.getElementById("phoneNumber").value; var gender =$("#userForm input[type='radio']:checked").val(); //var gender2 = document.getElementById("gender2").value; //alert("fn"+firstName+lastName+username+email); var roleIndex = document.getElementById("role"); var role = roleIndex.options[roleIndex.selectedIndex].value; var jobTitleIndex = document.getElementById("jobTitle"); var jobTitle = jobTitleIndex.options[jobTitleIndex.selectedIndex].value; var shiftIdIndex = document.getElementById("shiftId"); var shiftId = shiftIdIndex.options[shiftIdIndex.selectedIndex].value; var addressLine1 = document.getElementById("addressLine1").value; var addressLine2 = document.getElementById("addressLine2").value; var streetRoad = document.getElementById("streetRoad").value; var countryIndex = document.getElementById("country"); var country = countryIndex.options[countryIndex.selectedIndex].value; var stateIndex = document.getElementById("state"); var state = stateIndex.options[stateIndex.selectedIndex].value; var cityIndex = document.getElementById("city"); var city = cityIndex.options[cityIndex.selectedIndex].value; var pincode = document.getElementById("pincode").value; var branchIndex = document.getElementById("branch"); var branch = branchIndex.options[branchIndex.selectedIndex].value; var language = document.getElementById("language").value; var profilePicture = document.getElementById("profilePicture").value; //alert(profilePicture); var addDocument = document.getElementById("addDocument").value; var shiftIdIndex = document.getElementById("shiftId"); var shiftId = shiftIdIndex.options[shiftIdIndex.selectedIndex].value; var data = new FormData(); data.append('firstName', firstName); data.append('lastName', lastName); data.append('username', username); data.append('email', email); data.append('phoneNumber', phoneNumber); data.append('role', role); data.append('jobTitle', jobTitle); data.append('gender', gender); data.append('shiftId', shiftId); data.append('lastName', lastName); data.append('addressLine1', addressLine1); data.append('addressLine2', addressLine2); data.append('streetRoad', streetRoad); data.append('country', country); data.append('state', state); data.append('city', city); data.append('pincode', pincode); data.append('branch', branch); data.append('language', language); data.append('profilePicture', $('#profilePicture')[0].files[0]); for (var i = 0; i < $('#document')[0].files.length; i++) { data.append('document[]', $('#document')[0].files[i]); } $.ajax({ //url : '${pageContext.request.contextPath}/user/save-user', type: "POST", Accept: "application/json", async: true, contentType:false, processData: false, data: data, cache: false, success : function(data) { reset(); $(".alert alert-success alert-div").text("New User Created Successfully!"); }, error :function(data, textStatus, xhr){ $(".alert alert-danger alert-div").text("new User Not Create!"); } }); // }
можно использовать jQuery.post () и возвращают красиво структурированные ответы JSON с сервера. Он также позволяет проверять / дезинфицировать ваши данные непосредственно на сервере, что является хорошей практикой, потому что это более безопасно (и даже проще), чем делать это на клиенте.
например, если вам нужно отправить html-форму на сервер(для сохранения изменений.php) с пользовательскими данными для простой регистрации:
И. клиентские части:
И. А. HTML-код часть:
<form id="user_profile_form"> <label for="first_name"><input type="text" name="first_name" id="first_name" required />First name</label> <label for="family_name"><input type="text" name="family_name" id="family_name" required />Family name</label> <label for="email"><input type="email" name="email" id="email" required />Email</label> <input type="submit" value="Save changes" id="submit" /> </form>I. b. часть сценария:
$(function () { $("#user_profile_form").submit(function(event) { event.preventDefault(); var postData = { first_name: $('#first_name').val(), family_name: $('#family_name').val(), email: $('#email').val() }; $.post("/saveprofilechanges.php", postData, function(data) { var json = jQuery.parseJSON(data); if (json.ExceptionMessage != undefined) { alert(json.ExceptionMessage); // the exception from the server $('#' + json.Field).focus(); // focus the specific field to fill in } if (json.SuccessMessage != undefined) { alert(json.SuccessMessage); // the success message from server } }); }); });второй. Серверная часть (saveprofilechanges.php):
$data = $_POST; if (!empty($data) && is_array($data)) { // Some data validation: if (empty($data['first_name']) || !preg_match("/^[a-zA-Z]*$/", $data['first_name'])) { echo json_encode(array( 'ExceptionMessage' => "First name missing or incorrect (only letters and spaces allowed).", 'Field' => 'first_name' // Form field to focus in client form )); return FALSE; } if (empty($data['family_name']) || !preg_match("/^[a-zA-Z ]*$/", $data['family_name'])) { echo json_encode(array( 'ExceptionMessage' => "Family name missing or incorrect (only letters and spaces allowed).", 'Field' => 'family_name' // Form field to focus in client form )); return FALSE; } if (empty($data['email']) || !filter_var($data['email'], FILTER_VALIDATE_EMAIL)) { echo json_encode(array( 'ExceptionMessage' => "Email missing or incorrectly formatted. Please enter it again.", 'Field' => 'email' // Form field to focus in client form )); return FALSE; } // more actions.. // more actions.. try { // Some save to database or other action..: $this->User->update($data, array('username=?' => $username)); echo json_encode(array( 'SuccessMessage' => "Data saved!" )); return TRUE; } catch (Exception $e) { echo json_encode(array( 'ExceptionMessage' => $e->getMessage() )); return FALSE; } }
вы должны использовать AJAX. Отправка формы обычно приводит к тому, что браузер загружает новую страницу.
вы можете сделать это без AJAX.
напишите ваш как ниже.
.. .. ..
и затем в " действии.php"
затем после frmLogin.submit ();
читать переменную $submit_return..
$submit_return содержит возвращаемое значение.
удачи.
Comments