Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.03.2014, 08:43
Кандидат Javascript-наук
Отправить личное сообщение для koeshiro Посмотреть профиль Найти все сообщения от koeshiro
 
Регистрация: 05.12.2012
Сообщений: 125

ajax запрос со статусом 0
Для изучения php поставил себе Денвер и начал писать небольшую панельку себе в удобство. Однако. Когда я решил перейти от <form> тегов к ajax у меня везде стала вылезать ошибка 0. У меня windows 7 Денвер и все порты открыты + брандмауэр успешно отключён ещё пару лет назад. Но что делать? Может у кого уже была такая же проблема? Подскажите прошу.
Вот собственно и код страницы
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title></title>
<meta charset="windows-1251"/>
<style>
textarea{width:500px;height:500px;}
#filename{height:50px;}
input{width:500px;}
</style>
</head>
<body>
<textarea id="filename">Имя документа</textarea><br />
<textarea id="filebody">Тело документа</textarea><br />
<input onclick="xhr()" type="submit"/>
<script>
	function xhr()
	{
		var xhr=new XMLHttpRequest();
		var params = 'filename=' + encodeURIComponent(document.getElementById('filename').value) + '&filebody=' + encodeURIComponent(document.getElementById('filebody').value); 
		xhr.open('POST','localhost/filecraftphp.php?'+params,true);
		xhr.onreadystatechange = function() 
		{  
    		if (xhr.readyState != 4) return; 
    		if (xhr.status != 200) 
			{
      			// status=0 при ошибках сети, иначе status=HTTP-код ошибки
      			alert('Ошибка ' + xhr.status + ': ' + xhr.statusText);
      			return; 
    		}
  		}	
		alert(xhr.status);
	}
</script>
</body>
</html>

И код обработчика
<?php
$filename=$_POST['filename'];
$filebody=$_POST['filebody'];
if(!file_get_contents($_SERVER['DOCUMENT_ROOT'].'/'.$filename.'.html')){
	fopen($_SERVER['DOCUMENT_ROOT'].'/'.$filename.'.html','x+');	
}
else{$old_file=file_get_contents($_SERVER['DOCUMENT_ROOT'].'/'.$filename.'.html');}
$html="
<!DOCTYPE html>
<html>
<head>
<meta charset='windows-1251'/>
<title>$filename</title>
</head>
<body>
$filebody
</body>
</html>
";
if(strlen($filename)>5){
	if($old_file!=$html)
	{
		file_put_contents($_SERVER['DOCUMENT_ROOT'].'/'.$filename.'.html',$html);
	}
}
?>

Последний раз редактировалось koeshiro, 28.03.2014 в 08:47.
Ответить с цитированием
  #2 (permalink)  
Старый 28.03.2014, 09:18
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

А где xhr.send() ?
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #3 (permalink)  
Старый 28.03.2014, 09:27
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от koeshiro
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
Это корявый доктайп. Устаревший. Пиши просто <!DOCTYPE html>
Сообщение от koeshiro
<meta charset="windows-1251"/>
Это устаревшая кодировка. Пиши utf-8. Хотя этот мета-тег игнорируется если сервер выставляет кодировку через http-заголовок Content-Type

Сообщение от koeshiro
перейти от <form> тегов к ajax
Не надо никуда переходить. Оставь формы. Разметку вообще не меняй. Просто добавь скрипт, который будет перехватывать отправку и делать ajax-запрос.

Кстати, это типа управлялка сайтом? Хреновая идея создавать html-файлы.

Лучше хранить шаблон отдельно, контент отдельно, и собирать все вместе на лету.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #4 (permalink)  
Старый 28.03.2014, 09:36
Кандидат Javascript-наук
Отправить личное сообщение для koeshiro Посмотреть профиль Найти все сообщения от koeshiro
 
Регистрация: 05.12.2012
Сообщений: 125

Но у меня окошечко так что думал более целесообразно, да и ничего помимо английского и русского не использую. А как перехватывать? Я что-то не очень понял вас.
Ответить с цитированием
  #5 (permalink)  
Старый 28.03.2014, 11:01
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от koeshiro
А как перехватывать?
form.onsubmit = function() {
    var request = new XMLHttpRequest();
    request.open(this.method, this.action);
    request.onreadystatechange = function() { /* bla bla */ };
    request.send(new FormData(this));
    return false; // это остановит отправку формы браузером
};


FormData - клевая штука, но к сожанию не работает в старых браузерах.
Но можно поискать polyfill , подключить и забыть об этой проблеме.
Или можно сериализовать поля по старинке (примерно как ты делаешь params, только делать это через цикл без привязки к конкретным полям формы)
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #6 (permalink)  
Старый 28.03.2014, 11:21
Кандидат Javascript-наук
Отправить личное сообщение для koeshiro Посмотреть профиль Найти все сообщения от koeshiro
 
Регистрация: 05.12.2012
Сообщений: 125

Пробегаться по всем детям form и по name или class брать нужный элемент? Да неплохая идея. Спасибо за помощь. FormData это заголовки ?
Ответить с цитированием
  #7 (permalink)  
Старый 28.03.2014, 12:32
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от koeshiro
FormData это заголовки ?
Нет. FormData сериализует поля формы для отправки через POST. То есть при использовании FormData не нужно бегать по полям.
Сообщение от koeshiro
брать нужный элемент
А разве у тебя в форме есть ненужные? Погугли готовую функцию, чета типа serializeForm(). Тут на форуме несколько раз встречал и даже сам писал.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #8 (permalink)  
Старый 29.03.2014, 21:15
Аватар для Hapson
Кандидат Javascript-наук
Отправить личное сообщение для Hapson Посмотреть профиль Найти все сообщения от Hapson
 
Регистрация: 23.07.2013
Сообщений: 122

function serializeForm(form){
	/**
	* @form - объект формы
	* 
	* @return {string} - строка пригодная для отправки в POST
	*/
	var fields = form.elements;
	var field, name, value, type;
	var res = '';
	for(var z = 0; z < fields.length; z++){
		field = fields[z];
		name = field.name;
		value = field.value;
		type = field.type;
		if(typeof name == "undefined" || name == ""){continue;}
		if(type == 'checkbox' || type == 'radio'){
			if(field.checked){
				res += name +"="+ encodeURIComponent(value) +"&";
			}
			continue;
		}
		if(type == "select-multiple"){
			for(var so = 0; so < field.length; so++){
				if(field[so].selected){
					res += name +"="+ encodeURIComponent(field[so].value) +"&";
				}
			}
			continue;
		}
		res += name +"="+ encodeURIComponent(value) +"&";
	}
	return res.trim("&");
}
Ответить с цитированием
  #9 (permalink)  
Старый 30.03.2014, 14:58
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от Hapson
res.trim("&")
Эт че такое?
__________________
В личку только с интересными предложениями
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ajax запрос на ютуб masterdle Элементы интерфейса 2 16.07.2013 15:32
AJAX запрос в Internet Explorer срабатывает через раз nikolayseo jQuery 5 13.11.2012 00:13
Как можно кешировать Ajax запрос ? saturn AJAX и COMET 5 27.10.2012 14:48
Синхронный запрос данных по AJAX Shasoft AJAX и COMET 2 03.03.2009 14:07
ajax запрос с подгружемным js HelpeR AJAX и COMET 1 27.10.2008 12:44