Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
 Аватар для ChildOfFlowers
15 / 14 / 9
Регистрация: 16.04.2012
Сообщений: 1,090

Как отправить форму, не перезагружая страницу?

25.12.2015, 20:19. Показов 1482. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собственно сабж. Раньше у меня получалось это сделать с помощью XHR. Теперь, как я понял, что-то где-то поменялось, и ничего у меня не работает. Вот функция:
JavaScript
1
2
3
4
5
6
7
8
9
10
function sendRequest(form)
{
    var xhr = new XMLHttpRequest();
    xhr.open("POST", "test.php");
    xhr.setRequestHeader('Content-Type', 'text/plain;charset=UTF-8');
    xhr.send(form.message.value);
    
    if (xhr.responseText) alert(xhr.responseText);
    else alert("Fail");
}
Практически один-в-один слизана из примера отсюда, нифига не работает.

Нагуглил, что можно реализовать задуманное при помощи Ajax. Вот функция номер два:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function sendRequest(form)
{
   jQuery.ajax({
      url: "test.php",
      type: "POST",
      dataType: "html",
      data: jQuery("#"+form).serialize(),
      success: function(response) {
         alert(response);
      },
      error: function(response) {
         alert("Fail");
      }
   });
}
Гуглохром на неё ругается: "uncaught referenceerror jquery is not defined" - опять нифига не работает.

Страница test.php лежит в корневом каталоге сайта, и выглядит следующим образом:
PHP
1
2
3
4
<?php
$message = $_POST['message'];
echo $message;
?>
Что я делаю не так? И как вообще это сделать лучше?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.12.2015, 20:19
Ответы с готовыми решениями:

Как отправить письмо на почту динамически перезагружая сайт
Суть проблемы когда пользователь оставляет свой номер и нажимает на кнопку перезвонить, то ничего не приходит, только ссылка в виде get...

Как отправить форму с html страницы на страницу которая формируется бинарным кодом?
имеется форма на сервере (https://omemo.ca:5281/register-on-omemo.ca) внешнему редактированию она не поддается, так же на ней имеется...

Как можно записать данные в сессию не перезагружая страницу?
есть форма и кнопка к этой форме. нужно все данные из формы при клике на кнопку записать в сессию, но при этом при клике на кнопку никакого...

14
Все элементарное - сложно
133 / 118 / 50
Регистрация: 14.04.2014
Сообщений: 509
25.12.2015, 23:36
Как из html вызываете функцию?

С jquery ajax нужно сначала этот jquery подключить, взять можно отсюда. Почитать как пользоваться можно здесь
1
 Аватар для ChildOfFlowers
15 / 14 / 9
Регистрация: 16.04.2012
Сообщений: 1,090
26.12.2015, 17:43  [ТС]
А что насчёт xhr? И бывают ли ещё какие-нибудь варианты?
0
Все элементарное - сложно
133 / 118 / 50
Регистрация: 14.04.2014
Сообщений: 509
27.12.2015, 01:22
Ну XHR и есть объект реализующий технологию AJAX. Других вариантов я не припомню
0
 Аватар для ChildOfFlowers
15 / 14 / 9
Регистрация: 16.04.2012
Сообщений: 1,090
30.12.2015, 16:33  [ТС]
Цитата Сообщение от mixenik Посмотреть сообщение
XHR и есть объект реализующий технологию AJAX
Это понятно. Вопрос - почему он у меня не работает.
С jQuery вариантом я разобрался, он у меня заработал. Но у него есть огромный минус: там callback функция. Это очень плохой для меня вариант. Поэтому хочется разобраться с XHR
0
Все элементарное - сложно
133 / 118 / 50
Регистрация: 14.04.2014
Сообщений: 509
30.12.2015, 16:51
Цитата Сообщение от ChildOfFlowers Посмотреть сообщение
Но у него есть огромный минус: там callback функция.
Используете промисы? $.ajax() возващает промис (deferred object), у которого есть методы done(), fail(), always() ну и конечно же then()
0
 Аватар для ChildOfFlowers
15 / 14 / 9
Регистрация: 16.04.2012
Сообщений: 1,090
30.12.2015, 17:09  [ТС]
Цитата Сообщение от mixenik Посмотреть сообщение
Используете промисы
Извиняюсь, я впервые в жизни столкнулся с jQuery. Буду очень признателен, если вы объясните мне на пальцах, что это за промисы, и как они могут помочь в моей беде...

Добавлено через 2 минуты
JavaScript
1
2
3
4
5
success: function(response) {
         alert(response);
      },
      error: function(response) {
         alert("Fail");
Это случаянно не то?
0
Все элементарное - сложно
133 / 118 / 50
Регистрация: 14.04.2014
Сообщений: 509
30.12.2015, 17:28
Про промисы можно почитать здесь.

Ваш же код отправляет запрос (синхронный запрос) и не работает дальше, пока не получит ответ. Что не есть хорошо, т.к. страница подвисает и пользователь ничего не может сделать, пока ждет ответа. Т.е. нужно использовать асинхронный запрос так:
JavaScript
1
xhr.open("POST", "test.php", true);
Но тут возникает другая проблема, запрос отправляется, а код продолжает работу не дождавшись ответа. Для этого в объекте XHR есть метод onreadystatechange, который вызывается, когда приходит ответ от сервера. Собственно поэтому и используют callback функцию(ну или промисы), который вызывается, когда приходит ответ от сервера. (Подробнее здесь)
$.ajax() в jQuery всего лишь обертка над объектом XHR
0
 Аватар для ChildOfFlowers
15 / 14 / 9
Регистрация: 16.04.2012
Сообщений: 1,090
30.12.2015, 20:57  [ТС]
mixenik, ничего я не понял про эти промисы. У меня с ними функция ведёт себя точно так же, как и без них было: сначала возвращает пустой ответ, а потом уже получает от сервера то, что надо было вернуть.
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
function sendRequest(form)
{
    var url = form.getAttribute('action');
 
    var promise = new Promise(function(resolve, reject){
        jQuery.ajax({url: url, type: "POST", dataType: "html", data: jQuery(form).serialize(),
            success: function(response)
                {
                    resolve(response);
                },
            error: function(response)
                {
                    reject(response);
                },
            function(){alert("success")}
        });
    });
    promise.then(
        function(response){
            return ("Success: "+response);
        },
        function(response){
            return ("Fail: "+response);
        }
    );
}
HTML5
1
2
3
4
5
<form action='test.php'>
<input type='text' name='msg'>
<br>
<input type='button' value='try' onClick='alert(sendRequest(this.parentNode))'>//выводит "undefined"
</form>
Беда, не знаю, что делать

Добавлено через 6 минут
То же самое и с этим вариантом:
JavaScript
1
2
3
4
5
6
7
8
9
10
function sendRequest(form)
{
    var url = form.getAttribute('action');
    var result = "fail";
    
    $.ajax({url: url, beforeSend: function( xhr ) {xhr.overrideMimeType( "text/plain; charset=x-user-defined" );}})
    .done(function(){result = "Success";});
    
    return result;
}
0
Все элементарное - сложно
133 / 118 / 50
Регистрация: 14.04.2014
Сообщений: 509
30.12.2015, 22:15
В первом варианте написан бред. Я же написал, что $.ajax и так промис возвращает.

Насчет второго. Такое ощущение, что вы не читаете, что я пишу. $.ajax отрабатывает асинхронно. Т.е. Отправляется запрос и код выполняется дальше, не дожидаясь ответа сервера. Соответственно, у вас функция вернет undefined, так как в result еще ничего нет.

Вот так оно сработает:
JavaScript
1
2
3
.done(function(result){
  alert("Success");
});
Это особенность Javascript и по другому вы не сделаете. Т.е. либо вы используете калбеки, либо промисы. Есть третий вариант - это генераторы. там бы это выглядело примерно так:
JavaScript
1
2
3
4
5
6
7
8
9
function*(){
  var result = yield $.ajax({
     url: url, 
     beforeSend: function( xhr ) {
        xhr.overrideMimeType( "text/plain; charset=x-user-defined" ); //не понимаю зачем, если у $.ajax есть подобные свойства
     }
  });
  return result;
}
Но 6 спецификация javascript только вышла и еще частично реализована в браузерах. Насколько я знаю браузеры, пока не поддерживают генераторы.
0
 Аватар для ChildOfFlowers
15 / 14 / 9
Регистрация: 16.04.2012
Сообщений: 1,090
31.12.2015, 14:49  [ТС]
Цитата Сообщение от mixenik Посмотреть сообщение
Такое ощущение, что вы не читаете, что я пишу
Читаю. И про асинхронность я всё отлично понял. Но как я уже писал,
Цитата Сообщение от ChildOfFlowers Посмотреть сообщение
Это очень плохой для меня вариант
Видимо, я просто не правильно описал свою проблему.
В общем, основная задумка такая:
На странице должен быть скрипт, который отправляет на сервер несколько запросов подряд. При этом, содержание каждого последующего запроса формируется на основе ответа сервера от предыдущего запроса.
Из этого следует, что асинхронное выполнение кода такого скрипта неприемлемо, т.к. для отправки очередного запроса, скрипт должен сначала обработать ответ от предыдущего запроса...
В общем, так: отправляем запрос => получаем ответ => формируем запрос => отправляем запрос => ...
Как такую задачу можно решить?
0
Все элементарное - сложно
133 / 118 / 50
Регистрация: 14.04.2014
Сообщений: 509
31.12.2015, 15:43
Я понял, что вы хотите сделать. Повторюсь.
Цитата Сообщение от mixenik Посмотреть сообщение
Ваш же код отправляет запрос (синхронный запрос) и не работает дальше, пока не получит ответ. Что не есть хорошо, т.к. страница подвисает и пользователь ничего не может сделать, пока ждет ответа.
У вас будет несколько запросов, обычный пользователь просто подумает, что у него завис браузер, когда он зашел на ваш сайт. Т.е. он может подумать, что вы пытаетесь установить ему зловред. Отсюда вывод 1: Использование синхронных запросов негативно скажется на посещаимости.
Вывод два: Необходимо использовать асинхронные запросы, чтобы не отпугнуть пользователя.

Повторюсь еще раз:
Цитата Сообщение от mixenik Посмотреть сообщение
Это особенность Javascript и по другому вы не сделаете. Т.е. либо вы используете калбеки, либо промисы.
Да это приводит к callback hell-у или к promise hell-у, но пока по-другому никак. (За это js и не любят)
Чем для вас плох такой код?
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
function sendRequest1(callback){ //callback, выполнит код, когда вся цепочка запросов выполнилась
  $.ajax({
    //свойства
    success: function(response){
      sendRequest2(response, callback); //передаем callback в следующую функцию
    }
  });
}
 
function sendRequest2(response, callback){
  //формируем следующий запрос на основе response (обозвать можно как угодно)
  $.ajax({
    //свойства
    success: function(response2){
      sendRequest3(response2, callback); //передаем callback в следующую функцию
    }
  });
}
 
function sendRequest3(response2, callback){ //допустим, что это последний запрос
  //формируем следующий запрос на основе response2 (обозвать можно как угодно)
  $.ajax({
    //свойства
    success: function(response3){
      //заканчиваем асинхронную цепочку
      callback(response3);
    }
  });
}
 
//где-то в коде
sendRequest1(function(response3){
  alert("Все запросы выполнены");
});
1
Superposition
 Аватар для Padimanskas
950 / 615 / 256
Регистрация: 27.10.2013
Сообщений: 2,083
31.12.2015, 16:11
Цитата Сообщение от ChildOfFlowers Посмотреть сообщение
При этом, содержание каждого последующего запроса формируется на основе ответа сервера от предыдущего запроса.
Из этого следует, что асинхронное выполнение кода такого скрипта неприемлемо, т.к. для отправки очередного запроса, скрипт должен сначала обработать ответ от предыдущего запроса...
Где-то выше говорили уже про промисы или нет? Можно конечно сделать типа рекурсию с замыканием на аргумент функции, но там может быть утечка памяти. Попробую прикинуть как это могло бы выглядеть, просто ради интереса...

Как-то вот так:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var sequence = (function (URLs) {
    return function recursive() {
        if (!!URLs.length) {
            $.ajax({
                url : URLs[0]
            }).complete(function (data, err) {
 
                    $("#log").append(data);
                    $("#log").append(err);
          
         // if( data == ... ){...}
 
                URLs.shift();
                recursive.call('...');
            });
        }
    }
})(['/mess.php', '/mess.php', '/mess2.php', '/mess100500.php']);
sequence();
1
31.12.2015, 16:20

Не по теме:

Padimanskas, слишком тяжелый вариант для начинающего =)

0
 Аватар для ChildOfFlowers
15 / 14 / 9
Регистрация: 16.04.2012
Сообщений: 1,090
31.12.2015, 16:50  [ТС]
Цитата Сообщение от mixenik Посмотреть сообщение
Использование синхронных запросов негативно скажется на посещаимости
хм... я не спорю, что в некоторых случаях может быть и так, но лишать выбора из-за этого, по-моему, глупо.
Цитата Сообщение от mixenik Посмотреть сообщение
Чем для вас плох такой код?
Возможно и не плох, сейчас буду разбираться. В любом случае, спасибо за помощь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.12.2015, 16:50
Помогаю со студенческими работами здесь

Сабмит формы не перезагружая страницу
Нужен самый простой пример сабмита формы не перезагружая страницу на AJAX или jQuery там где попроще главное чтобы все работало и...

Можно ли отобразить другой URL не перезагружая страницу?
Фреймовый сайт. В строке URL всегда типа: http://myServer.com/index.html А мне надо отобразить текущую страницу фрейма, отобразить...

Обновление материала каждые 10 секунд не перезагружая страницу
(cms joomla) вставил в материал php скрипт который с api binance выводит курс криптовалюты все нормально курс выводит вот только хотелось...

Вывести записи, соответствующие выбранному товару, из бд, не перезагружая страницу
есть список, типа &lt;li&gt;&lt;a href=&quot;#&quot;&gt; Телефоны &lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&quot;#&quot;&gt; Планшеты &lt;/a&gt;&lt;/li&gt; и тд можно ли по клику вывести записи,...

Как отправить страницу на сервер?
Доброго времени суток! Сейчас делаю простенький чат: function addDiv() { var name = document.getElementById('chatname').value; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru