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

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

25.12.2015, 20:19. Показов 1519. Ответов 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,091
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,091
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,091
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,091
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,091
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,091
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
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru