Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   XMLHttpRequest (https://javascript.ru/forum/events/73668-xmlhttprequest.html)

Conus 05.05.2018 19:37

XMLHttpRequest
 
Доброго дня,
не мог бы кто пояснить что происходит когда я посылаю запрос :
xhttp.open('POST', '/', true); какую роль играет /
мне приходит дубликат страницы -то есть копия всего что на странице добавляется на туже страницу только плюс ответ php
при чем ответ только во втором экземпляре страницы
а отправка данных может быть только с первого оригинального экземпляра кода

и если кто знает - как вернуть ответ php а не всего запроса XMLHttpRequest?

заранее спасибо

страница
<html>
<head>
<script type="text/JavaScript">
 
 function XmlHttp()
  {
    var xmlhttp;
    try  { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); } 
    catch (e) { try {  xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (E) {  xmlhttp = false; } }
    if (!xmlhttp && typeof XMLHttpRequest!='undefined') { xmlhttp = new XMLHttpRequest();  }
    return xmlhttp;
  }

function stat(readyState)
{
  switch (readyState) 
  {
    case 0: return "не инициализирован";  break;      
    case 1: return "загрузка..."; break;   
    case 2:  return "загружено"; break;   
    case 3:  return "в процессе..."; break;      
    case 4:  return "готово"; break;    
    default: return "неизвестное состояние";  
  }  
}

function Send_(xhttp)
{
     xhttp.onreadystatechange = function() 
		{  
         
            if (xhttp.readyState == 4)
			{
	            if(xhttp.readyState == 4) 
				{ if(xhttp.status == 200) 
					{
                                            if (!xhttp.responseType || xhttp.responseType === "text") {  data = xhttp.responseText; } 
						if (xhttp.responseType === "document") { data = xhttp.responseXML;  }

						document.getElementById("sub").innerHTML =   data + ' . : . '
					  }
					   else { document.getElementById("sub").innerHTML = "Не удалось получить данные: " + xhttp.statusText;  } 
				  }
			 }
           
		 } 
}



  function sub() 
  {
     var xhttp = XmlHttp();       

     xhttp.open('POST', '/', true); 
     xhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 
     xhttp.send("mod=" + encodeURIComponent( document.getElementById("a").value) ); 

     Send_(xhttp)

  }
    </script>


</head>

<body>
	 
<?php
$action = isset($_REQUEST['mod'])? $_REQUEST['mod']: '';
if($action) { if($action == 'out') { echo 'ok';  } else { echo $action;  } }
?>

  <input type='text' name='mod' id='a'  />

  <a href='' id='on' onClick='event.preventDefault();sub()'>send</a>
  <div id='sub'></div>


 </body>
</html>

laimas 06.05.2018 03:48

Цитата:

Сообщение от Conus
xhttp.open('POST', '/', true); какую роль играет /

Не роль, а параметр XMLHttpRequest, который задает сетевой путь, и / это корень документов, то это обращение к индексному файлу.

Conus 06.05.2018 07:39

А почему возвращается ответ весь этот файл + document.getElementById("a").value?

Conus 06.05.2018 07:55

URL не начинающиеся с названия протокола(например, http:)называются относительными, то есть они интерпретируются относительно текущего документа. Когда они начинаются со слеша (/), они заменяют текущий путь – часть после названия сервера. В ином случае часть текущего пути вплоть до последнего слеша помещается перед относительным URL.

laimas 06.05.2018 08:53

Conus,
ну и что будет означать /?

Браузер подставить домен и получится http://domain/, а это что означает?

Если при этом запускать скрипт из другого расположения, то будет подставлен еще и путь относительный скрипту этому.

Цитата:

Сообщение от Conus
А почему возвращается ответ весь этот файл + document.getElementById("a").value?

Потому, что это вывод в браузер, а надо получить запрос, обработать, ответить клиенту и завершить работу скрипта.

Conus 06.05.2018 09:21

А как получить запрос?
я ж его вот получаю

<?php
$action = isset($_REQUEST['mod'])? $_REQUEST['mod']: '';

if($action) { if($action == 'out') { echo 'ok'; } else { echo $action; } }

?>

laimas 06.05.2018 09:35

Вообще же используйте $_POST, в $_REQUEST попадают как GET/POST, так данные из сессии, и они будут перезаписываться в том порядке, в котором определена их очередность настройками. То есть, если вы используете $_REQUEST, то должны это учитывать.

Проблема не в том, что вы получаете, а в том где вы их получаете. Фактически здесь xhttp.open('POST', '/', true); можно заменить путь на window.location (или просто location), то есть текущий скрипт, запрос к текущей странице. Судя по ошибке это у вас и происходит. Но такие запросы должны обрабатываться до любого вывода в браузер, то есть:

<?
php - код обрабатывающий ajax запрос
и ответ, и выход - exit(тут данные ответа)
?>
<html>
а далее html-код страницы


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