Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Отправка запроса POST Javascript (https://javascript.ru/forum/events/43738-otpravka-zaprosa-post-javascript.html)

kefalia 18.12.2013 15:25

Отправка запроса POST Javascript
 
Добрый день. Осваиваю отправку post-запросов посредством javascript. После изучения документации и форумов для получения id выбранного пользователем значения из списка <select> было написано следующее:

function postResult(){
        var xhr = new XMLHttpRequest();
	var sel_cat=document.getElementById("category_id").value;
        var result_cat = encodeURIComponent(sel_cat);
 
    xhr.open("POST", "test_selected_category.php", true)
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
    xhr.send(result_cat);
    xhr.onreadystatechange = function (){ 
	if(xhr.readyState == 4){ 
	if(xhr.responseText == "true"){ 
	alert("YES!"); 
	} else { 
	alert("NO!"); 
	} 
	xhr.result_cat; 
	} 
	} 
}


test_selected_category.php

<?php  $result_cat=$_POST['result_cat']; 
		echo $result_cat;
?>



Стабильно возвращается NO, то есть, никакого результата сервером не присылается.
Файл test_selected_category.php доступен для чтения и записи и лежит в той же директории, где и index.php, в котором прописан js-скрипт.

В чем может быть ошибка?

kefalia 18.12.2013 16:05

Вопрос снят.
Все работает, но возвращается не нужное значение, а целая страница. Пошла думать, как вытащить из нее значение. :)

danik.js 18.12.2013 16:12

Цитата:

Сообщение от kefalia
Все работает, но возвращается не нужное значение, а целая страница

Это как? Должно вернуться только значение из POST переменной result_cat. Но вы совершаете ошибку и неправильно его передаете.
Цитата:

Сообщение от kefalia
xhr.send(result_cat);

Тут вы передаете xhr.send("true") или xhr.send("false"), а надо:
xhr.send("result_cat=true")

Для этого надо написать
xhr.send("result_cat=" + result_cat);

kefalia 18.12.2013 16:26

function postResult(){
    var xhr = new XMLHttpRequest();
	var sel_cat=document.getElementById("category_id").value;
    var result_cat = encodeURIComponent(sel_cat);
    xhr.open("POST", "test_selected_category.php", true)
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
    xhr.send("result_cat=" + result_cat);
    xhr.onreadystatechange = function (){ 
	if(xhr.readyState == 4){ 
		alert(xhr.responseText);
	
	xhr.result_cat; 
	} 
	} 
}


При подобном положении вещей в alert выводится полный код страницы :)

kefalia 18.12.2013 16:45

Rise,
При комментировании данных строк никаких изменений не происходит. И, как я понимаю, в переменной $result_cat хранится переданное посредством POST значение. Или я ошибаюсь?

Если вопрос был в том, есть ли что-то еще кроме вышеуказанного в файле test_selected_category.php, то нет: в этом файле, помимо вышеупомянутого кода, ничего нет.

Если начать не с хвоста, а с головы: сайт сделан на joomla и, соответственно, помимо файла test_selected_category.php есть еще index.php, в котором генерируется шаблон страницы и много других.
В alert попадает абсолютно вся информация со страницы (которая состоит из нескольких подключаемых .php файлов), и я уже второй день не могу понять, почему. Ведь передаваться должно только значение value?

kefalia 18.12.2013 16:54

Rise,
<select id="category_id" name="category_name" class="inputbox" onchange='postResult(); '>
<option value = "0"/>Все категории</option>				    
				    ...
</select>


Отредактировала предыдущее сообщение :)

Vlasenko Fedor 18.12.2013 17:08

kefalia есть как минимум 4 варианта обработки ajax запрса в joomla
1. Контроллер. Вы можете к существующему подсунуть и добавить свой
2. Плагин обрабатывая событие onAfterInitialise()
3. Передача обработки файлу с отдельной инициализацией фреймворка (костыль)
4. Передача обработки файлу лежащему внутри вашего шаблона (костыль)
5. В Joomla 3.2 встроен компонент ajax
А теперь самое главное, после формирования ответа, вы должны закончить работу приложения.
То есть после ответа должно быть
die;
или
exit;

kefalia 23.12.2013 09:57

Rise,
Спасибо! Все работает :)

kefalia 23.12.2013 10:01

Poznakomlus,
Спасибо за ответ! Пока сделала с помощью "костыля": допиливаю стандартный поиск для Joomshopping. Опыта мало, так что с написанием плагина или контроллера без посторонней помощи вряд ли справлюсь (в те сроки, которые стоят).

kefalia 23.12.2013 10:20

Rise,
Подскажите еще, пожалуйста, как выбрать данные для передачи в одном запросе из двух разных полей с заданными id?

kefalia 23.12.2013 13:23

Rise,
К примеру:
<select id="category_id">
    <option value="0">Все категории</option>
    <option value="1">Категория 1</option>
    <option value="2">Категория 2</option>
</select>

<select id="manufacter_id" onchange="postResult()">
    <option value="0">Все производители</option>
    <option value="1">Производитель 1</option>
    <option value="2">Производитель 2</option>
</select>


Для задачи нужно, чтобы через postResult() передавались 2 значения: значение поля <select id="category_id"> и значение поля <select id="manufacter_id">. Я теоретически понимаю, что обращаться нужно через getElementById(). Как это корректно прописать?

P.S. Спасибо большое за помощь :)

Rise 23.12.2013 14:42

kefalia, как то так:
<select id="category_id" onchange="postResult()">
	<option value="0">Все категории</option>
	<option value="1">Категория 1</option>
	<option value="2">Категория 2</option>
</select>
<select id="manufacter_id" onchange="postResult()">
	<option value="0">Все производители</option>
	<option value="1">Производитель 1</option>
	<option value="2">Производитель 2</option>
</select>

<script>
function postResult() {
	var catVal = document.getElementById('category_id').value;
	var manVal = document.getElementById('manufacter_id').value;
	var xhr = new XMLHttpRequest();
	var params  = 'result_cat=' + catVal + '&result_man=' + manVal;
	xhr.open('POST', '/test_selected_category.php', true);
	xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	xhr.onreadystatechange = function() {
		if (this.readyState == 4 && this.status == 200) {
			alert(this.responseText);
		}
	}
	xhr.send(params);
}
</script>

$_POST['result_cat']
$_POST['result_man']


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