Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.08.2017, 08:08
Аспирант
Отправить личное сообщение для desperate_one Посмотреть профиль Найти все сообщения от desperate_one
 
Регистрация: 21.04.2017
Сообщений: 43

Самое простое обновление БД
Есть такая задача обновлять настройки сайта без перезагрузки страницы.
Нужен самый простой скрипт без сторонних библиотек на чистом js. Элементов всего два: имя настройки и её значение (on/off), последнее и должно меняться в БД при нажатии на неё. Также нужно чтобы после нажатия button менялся (цвет на green и его value на on).

Вёрстка
<form name="sets" onsubmit="formsend(); return false;">
                <input name="setname" type="text" value="registration">
                <button name="set_go" type="submit" style="background-color:red; color:#fff;">off</button>
            </form>


Попытки:
function formsend() {
        var formData = new FormData(document.forms.sets);

        var xhr = new XMLHttpRequest();
        xhr.open("POST", "processor.php", true);
        xhr.send(formData);
        
        alert(document.forms.sets.setname); // для проверки, получил ли значения инпутов, выводит [object HTMLInputElement]
    }

Может кто поможет решить проблему иным способом или если я близок к решению подправит меня =)
Ответить с цитированием
  #2 (permalink)  
Старый 11.08.2017, 08:35
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,257

Сообщение от desperate_one
для проверки, получил ли значения инпутов
Для проверки "получил ли сервер данные" alert() в таком месте тебе не поможет.
var xmlhttp = getXmlHttp()
xmlhttp.open('GET', '/xhr/test.html', true);
xmlhttp.onreadystatechange = function() {
  if (xmlhttp.readyState == 4) {
     if(xmlhttp.status == 200) {
       alert(xmlhttp.responseText);
         }
  }
};
xmlhttp.send(null);

http://xmlhttprequest.ru
Ответить с цитированием
  #3 (permalink)  
Старый 11.08.2017, 08:39
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,257

Сообщение от desperate_one
если я близок к решению подправит меня
Просто хоть что-то прочти на эту тему.
https://learn.javascript.ru/ajax-xmlhttprequest
Ответить с цитированием
  #4 (permalink)  
Старый 11.08.2017, 10:51
Аспирант
Отправить личное сообщение для desperate_one Посмотреть профиль Найти все сообщения от desperate_one
 
Регистрация: 21.04.2017
Сообщений: 43

Сообщение от ksa Посмотреть сообщение
Для проверки "получил ли сервер данные" alert() в таком месте тебе не поможет.
var xmlhttp = getXmlHttp()
xmlhttp.open('GET', '/xhr/test.html', true);
xmlhttp.onreadystatechange = function() {
  if (xmlhttp.readyState == 4) {
     if(xmlhttp.status == 200) {
       alert(xmlhttp.responseText);
         }
  }
};
xmlhttp.send(null);

http://xmlhttprequest.ru
Почему метод get? и к чему test.html? Документацию читал..
Ответить с цитированием
  #5 (permalink)  
Старый 11.08.2017, 13:35
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,257

Сообщение от desperate_one
Почему метод get? и к чему test.html?
Видно понятие "пример" тебе не особо знакомо...

Сообщение от desperate_one
Документацию читал..
Тогда из нее и, приведенного мной, примера тебе должно быть понятно как же нужно проверять получил ли сервер данные.

Т.е. не так как у тебя alert после
Сообщение от desperate_one
xhr.send(formData);
А в колбек-функции, что указана в onreadystatechange объекта XMLHttpRequest.
Ответить с цитированием
  #6 (permalink)  
Старый 11.08.2017, 15:02
Аспирант
Отправить личное сообщение для desperate_one Посмотреть профиль Найти все сообщения от desperate_one
 
Регистрация: 21.04.2017
Сообщений: 43

В общем пока такие букоффки:

function getXmlHttp() {
    var xhr;
    try {
      xhr = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        xhr = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (E) {
        xhr = false;
      }
    }
    if (!xhr && typeof XMLHttpRequest!='undefined') {
      xhr = new XMLHttpRequest();
    }
    return xhr;
  }

function formsend(setnamepost,setstat) {

    var xhr = getXmlHttp();
    xhr.open('post', 'processor.php', true);
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); // Отправляем тип содержимого
    xhr.send('setname=' + encodeURIComponent(setnamepost) + '&setstat=' + encodeURIComponent(setstat));

    xhr.onreadystatechange = function() { // Ждём ответа от сервера
      if (xhr.readyState == 4) { // Ответ пришёл
        if(xhr.status == 200) { // Сервер вернул код 200 (что хорошо)
            if (xhr.responseText) document.getElementById("return").innerHTML = 'fine';
            else document.getElementsByClassName("return").innerHTML = 'error';

            alert(setstat + ', ' + setnamepost);
        }
      }
    };
}

<form action="javascript:void(0);" method="post" name="sets" onsubmit="formsend('registration','off'); return false;">
                <input name="setname" type="text" value="registration">
                
                    <input name="setstat" type="hidden" value="off">
                    <button name="set_go" type="submit" style="background-color:green; color:#fff;">on</button>
            </form>

Если в обработчик отправлять форму без использования ajax, то работает прекрасно, иначе в базе данные не меняются, консоль пуста, alert выводит и setstat, и setnamepost. А значит код 200 вернулся. Где эта ошибка хрен знает...
Ответить с цитированием
  #7 (permalink)  
Старый 11.08.2017, 15:13
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

desperate_one,
getElementsByClassName - это список элементов с данным классом.
Если такой элемент один - надо getElementsByClassName("return")[0]
Ответить с цитированием
  #8 (permalink)  
Старый 11.08.2017, 15:14
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,257

Сообщение от desperate_one
А значит код 200 вернулся.
Попробуй данные засунуть прямо у УРЛ, который отправляешь запросом.

var url='processor.php';
url+='?setname='+'тут имя';
url+='&setstat='+'тут статус';
xhr.open('post', url, true);

А в send ничего не передавай...
xhr.send();
Ответить с цитированием
  #9 (permalink)  
Старый 11.08.2017, 15:28
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,257

desperate_one, вот такой вариант у меня показал ответ сервера

tmp.csp
<!DOCTYPE html>
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=windows-1251' />
<style type='text/css'>
</style>
<script type='text/javascript'>
function getXmlHttp() {
    var xhr;
    try {
      xhr = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        xhr = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (E) {
        xhr = false;
      }
    }
    if (!xhr && typeof XMLHttpRequest!='undefined') {
      xhr = new XMLHttpRequest();
    }
    return xhr;
  }

function formsend(setnamepost,setstat) {
    var xhr = getXmlHttp();
    var url='tmp1.csp';
	var val=document.getElementsByName('setname')[0].value;
	url+='?setname='+encodeURIComponent(val);
	var val=document.getElementsByName('setstat')[0].value;
	url+='&setstat='+encodeURIComponent(val);
	xhr.open('post', url, true);
    xhr.open('post', url, true);
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); // Отправляем тип содержимого
    xhr.send();
    xhr.onreadystatechange = function() {
      if (xhr.readyState == 4) {
        if(xhr.status == 200) { 
            alert(xhr.responseText);
        }
      }
    };
}
</script>
</head>
<body>
<form method="post" name="sets" onsubmit="formsend('registration','off'); return false;">
	<input name="setname" type="text" value="registration">
	<input name="setstat" type="hidden" value="off">
	<button name="set_go" type="submit" style="background-color:green; color:#fff;">on</button>
</form>
</body>
</html>

tmp1.csp
setname=#($g(%request.Data("setname",1)))#
setstat=#($g(%request.Data("setstat",1)))#
Ответить с цитированием
  #10 (permalink)  
Старый 11.08.2017, 15:37
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,257

Вот такой вариант работает...

function formsend(setnamepost,setstat) {
    var xhr = getXmlHttp();
    var url='tmp1.csp';
    *!*var str='setname='+document.getElementsByName('setname')[0].value*/!*;
	 *!*str+='&setstat='+document.getElementsByName('setstat')[0].value;*/!*
	xhr.open('post', url, true);
    xhr.open('post', url, true);
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); // Отправляем тип содержимого
    *!*xhr.send(str);*/!*
    xhr.onreadystatechange = function() {
      if (xhr.readyState == 4) {
        if(xhr.status == 200) { 
            alert(xhr.responseText);
        }
      }
    };
}
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает самое простое... -=Женька=- Общие вопросы Javascript 3 09.10.2016 20:33
Обновление картинки по таймеру paveltkachev Events/DOM/Window 25 05.09.2016 15:27
обновление iframe с помощью AJAX Aglenn AJAX и COMET 4 02.09.2011 22:48
Обновление страницы AndreyS AJAX и COMET 6 16.05.2011 15:55
Обновление поля вместе с кнопкой,при нажатию на которую происходит обновление тома AJAX и COMET 8 26.11.2009 10:47