Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Не отправляются данные через AJAX POSTом (https://javascript.ru/forum/jquery/70411-ne-otpravlyayutsya-dannye-cherez-ajax-postom.html)

aston 03.09.2017 16:24

Не отправляются данные через AJAX POSTом
 
Есть несколько форм с уникальными ID. В каждой форме есть скрытый INPUT инициализирующий PHP функцию.

<form class='id' id="form_act" ction="/options/CORE.Executive.file.Admin.php" method="post">
	<input type="text" name="name" placeholder="имя" required />
	<input type="text" name="phone" placeholder="телефон" required />	
	<input type="hidden" name="funNAME" value="Act">
	<button onclick="act()">Отправить</button>
</form>


Написан AJAX функция отлавливающая событие onclick по button в конкретной форме, и отправляющая запрос на указанную страницу.

$(document).ready(function() {

	$(this).submit(function() {
		var soc = '#'+($(this).find('form.id').attr('id'));
                  $.ajax({
                        type: $(soc).attr('method'),
                        url: $(soc).attr('action'),
                        data: $(soc).serialize(),
                        dataFilter: function(){
                        	location.reload(true);
                    	}
                })
        return false;
	});	
});


if ($_POST['funNAME']) {
		$fladmin -> File_great('index1s.php', 'текст для вставки в файл', 'w');
	}


Ну никак не хочет отрабатывать. Форумчане, есть идеи? :)

laimas 03.09.2017 17:19

<button onclick="act()">Отправить</button> а это зачем?

$('form.id').submit(function(e) {
        e.prevetDefault();
                  $.ajax({
                        type: this.method,
                        url: this.action,
                        data: $(this).serialize(),
                        dataFilter: function(){
                            location.reload(true);
                        }
                })
    });

aston 03.09.2017 19:09

Цитата:

Сообщение от laimas
<button onclick="act()">Отправить</button> а это зачем?

Со старой формы капипастом досталось :) Забыл удалить.
А по теме, ну ни как не хочет работать представленный вами вариант, делает редирект на страницу функции. К слову все работает в таком варианте:
<form id="form_act" ction="/options/CORE.Executive.file.Admin.php" method="post">
    <input type="text" name="name" placeholder="имя" required />
    <input type="text" name="phone" placeholder="телефон" required />
    <input type="hidden" name="funNAME" value="Act">
    <button>Отправить</button>
</form>

$(document).ready(function() {

	$('#form_act').submit(function(e) {
        e.preventDefault();
            $.ajax({
                  type: 'post',
                  url: $('#form_act').action,
                  data: $('#form_act').serialize(),
                  dataFilter: function(){
                        location.reload(true);
                  }
            })
    	});
		
});

if ($_POST['funNAME']) {
        $fladmin -> File_great('index1s.php', 'текст для вставки в файл', 'w');
    }

Но мне крайне не хочется копипастить AJAX функцию для каждой формы :)

aston 03.09.2017 19:11

Цитата:

Сообщение от aston
e.prevetDefault()

Забыл сообщить!) У вас отпечатка :write:
e.preventDefault()

laimas 03.09.2017 19:19

Цитата:

Сообщение от aston
У вас отпечатка

Это не опечатка, а сели батарейки на клаве, может либо не допечатать, либо лишнего.

Цитата:

Сообщение от aston
Но мне крайне не хочется копипастить AJAX функцию для каждой формы

А подумать? $('form.id') - это означает один обработчик для всех форм с именем класса id (более презентабельного нельзя придумать?), который в вашей форме и упоминается. Что еще нужно?

А вот так - $('#form_act'), это обработчик для одной формы с уникальным идентификатором! Не используйте id как селектор, используйте классы как было показано и все будет работать.

laimas 03.09.2017 19:25

Цитата:

Сообщение от aston
url: $('#form_act').action,
data: $('#form_act').serialize()

Это полнейшая глупость, так как в обработчике форма доступна как this, стучаться до нее посредством jq это слишком, да еще по много раз, ибо стандартные ее атрибуты и так доступны, как было показано выше.

laimas 04.09.2017 02:21

Цитата:

Сообщение от laimas
dataFilter: function(){
location.reload(true);
}

Функция dataFilter, это для обработки возвращенных сервером данных, location.reload(true) в ней, это моветон.

success: function(data) {}.

aston 04.09.2017 11:14

Делаю так:
HTML KOД
<form class='className' action="/options/file.php" method="POST">
	<input type="text" name="name" placeholder="Ваше имя" required />
	<input type="text" name="phone" placeholder="Ваш телефон" required />
	<input type="hidden" name="funsGet" value="Act">
	<button>Отправить</button>
</form>

JS KOД
$(document).ready(function() {

      $('form.className').submit(function(event) {
        event.preventDefault();
            $.ajax({
                  type: $(this).method,
                  url: $(this).action,
                  data: $(this).serialize(),
                  success: function() {
                        location.reload(true);
                  },
                  dataFilter: function(){
                        //location.reload(true);
                  }
            })
      });
            
});

PHP KOД
if ($_POST['funsGet']) {
	$fladmin -> File_great('index1s.php', 'текст для вставки в файл', 'w');
}


success успешно отрабатывает, намекая что скрипт выполнил отправку, но функция php не создает файл т.к. $_POST['funsGet'] не была инициализирована. Где накасячил, не пойму.:blink:

laimas 04.09.2017 11:36

type: $(this).method,
url: $(this).action,

*** удалено модератором ***

сколько раз можно объяснять, что this в обработчике, это DOM объект, форма текущая, а method и action ее свойства, которые получить вот так:

type: this.method,
url: this.action,

зачем для этого напрягать JQ чтобы получить объект, который и так доступен?

Цитата:

Сообщение от aston
но функция php не создает файл т.к. $_POST['funsGet'] не была инициализирована. Где накасячил, не пойму.

Во-первых, это не функция, а сначала условие, по которому уже будет выполняться функция.

$fladmin -> File_great('index1s.php', 'текст для вставки в файл', 'w'); - заменить на exit("Yes");, а в success:

function(data) {
      alert(data);
}


тогда точно можно удостовериться, что сервер получил и ответил. И если ответил, то проблемы в $fladmin -> File_great('index1s.php'....

Вот только писать в РНР файл, который есть исполняемый на сервере, данные от клиента, это даже не дыра, это дырища с большие ворота.

laimas 04.09.2017 15:29

Цитата:

Сообщение от laimas
*** удалено модератором ***

За грубость 20 ударов плетью. :D


Часовой пояс GMT +3, время: 01:00.