Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: для новичков > динамическое обновление textarea


Автор: begin 25.6.2009, 17:52
Пишу систему сообщений для сайта.
На странице есть форма. В ней textarea и кнопка отправки.
Должно происходить два вида событий:
1. при нажатии на кнопку отправки выполняется пхп-код, а затем динамически обновляется содержимое textarea
2. при бездействии пользователя каждую минуту динамически обновляется содержимое textarea

Нашел вот такой пример:
Код

<html>
    <script>
      var xmlDoc = null ;
  
      function load() {
        if (typeof window.ActiveXObject != 'undefined' ) {
          xmlDoc = new ActiveXObject("Microsoft.XMLHTTP");
          xmlDoc.onreadystatechange = process ;
        }
        else {
          xmlDoc = new XMLHttpRequest();
          xmlDoc.onload = process ;
        }
        xmlDoc.open( "GET", "test-request.html", true );
        xmlDoc.send( null );
      }
  
      function process() {
        if ( xmlDoc.readyState != 4 ) return ;
        document.getElementById("output").value = xmlDoc.responseText ;
      }
 
    </script>
  
    <body>
      <textarea id="output" cols="60" rows="20">&lt;empty&gt;</textarea>
      <br></br>
      <button onclick="load()">Load</button> &nbsp;
    </body>
  </html>


Но есть вопросы:
1. нужно ли подгружать какую-либо библиотеку
2. как сделать автовызов через определенные промежутки времени
3. где вставить вызов пхп-кода (при отправке нового сообщения от пользователя на сервер)
И общий вопрос:
насколько такой механизм повысит нагрузку на сервер и насколько он увеличит трафик?

Автор: bars80080 25.6.2009, 17:56
1. нет
2. setInterval('load()', 60000);
3. "test-request.html" - вот вызов страницы. напиши адрес своего скрипта заместо неё
 

Автор: begin 27.6.2009, 01:04
Понял.
Еще вопрос: там в коде есть вот такая строка:
Код

xmlDoc.open( "GET", "test-request.html", true );

Но мне надо вызывать скрипт методом POST и с параметрами. Как мне это сделать?
Код

xmlDoc.open( "POST", "myscript.php", true );

а вот как передать параметры?

Автор: bars80080 27.6.2009, 14:35
Код

xmlDoc.open( "POST", "test-request.html", true );
xmlDoc.send(data);



где data - твои параметры в виде: 
Код

data = "perem1=value1&perem2=value2&... ";

Автор: begin 27.6.2009, 15:49
Цитата(bars80080 @ 27.6.2009,  14:35)
где data - твои параметры в виде: 
Код

data = "perem1=value1&perem2=value2&... ";

Скажите, а длина переменной дата неограничена? Просто такой синтаксис больше похож на GET, а там ведь есть ограничение браузера на длину строки. Тут такого не возникнет?

Автор: bars80080 27.6.2009, 19:29
не ограничена. 

разница между get и post, не в том как они отправляют параметры, а в том, где они их отправляют. в случае get-запроса данные находятся прямо в адресе запроса, а в случае post-запроса, они находятся в "теле", т.е. идут после первичных заголовков. а скреплены с помощью & они так же

Добавлено через 1 минуту и 30 секунд
хотя вру, ограничена директивами .htaccess и настройками сервера (несколько мегабайт). как ограничение на размер закачиваемых файлов

Автор: begin 28.6.2009, 21:50
Все сделал, но вот проблема.
В коде написал так:
Код

xmlDoc.open( "POST", "message2.php", true );
xmlDoc.send("id=1243");

У текстового поля для нового сообщения имя такое: text_new
Так вот скрипт message2.php не видит ни переменную $_POST['id'] ни переменную $_POST['text_new']
Подскажите, почему?

Автор: bars80080 29.6.2009, 00:16
message2.php точно запускается? а если указать абсолютный адрес? и добавьте случайный параметр:

Код

var tm = new Date();
var par = tm.getHours() + tm.getMinutes() + tm.getSeconds();
url = 'http://server.ru/message2.php?param=' + par;
xmlDoc.open( "POST", "url", true );

Автор: begin 29.6.2009, 01:14
Да, message2.php точно запускался - я специально выводил надпись перед запросом к базе. Итог: видна надпись, а далее сообщение об ошибке в запросе (из-за тех недостающих данных). Все это как и надо, выводилось в первом textarea.

Когда сделал по вашему последнему совету, то туда тебе грузится главная страница сайта - т.е. ведет себя, как будто вообще не находит такой скрипт. Может из-за абсолютного адреса, а может из-за параметра в адресе.

Главное то - что все данные теряются.  smile 

Автор: An6rey 29.6.2009, 03:08
Для запроса GET строку параметров присоединяй к URL в open

Для запроса POST стрку параметров передавай в send()

By the way - запросы POST не кэшируются и случайный парметр не нужен

Автор: begin 29.6.2009, 03:39
Цитата(begin @ 28.6.2009,  21:50)
Все сделал, но вот проблема.
В коде написал так:
Код

xmlDoc.open( "POST", "message2.php", true );
xmlDoc.send("id=1243");

У текстового поля для нового сообщения имя такое: text_new
Так вот скрипт message2.php не видит ни переменную $_POST['id'] ни переменную $_POST['text_new']
Подскажите, почему?

An6rey, вот же я попробовал и отписался - скрипт не видит поступающих данных ни из формы ни из send  smile 

Автор: An6rey 29.6.2009, 12:57
begin
Так не бывает
Выкладывай все - лучше в архиве - найду причину

Или ты прикалываешься?

Автор: begin 29.6.2009, 15:35
Цитата(An6rey @ 29.6.2009,  12:57)
Выкладывай все - лучше в архиве - найду причину

Выкладываю:

Автор: An6rey 29.6.2009, 22:54
xmlDoc.setRequestHeader("Content-Type","application/x-www-form-urlencoded")

А ты как думал?

Автор: begin 29.6.2009, 23:19
Цитата(An6rey @ 29.6.2009,  22:54)
xmlDoc.setRequestHeader("Content-Type","application/x-www-form-urlencoded")

Подскажите, где именно в коде java-скрипта нужно вставлять эту строку? После какой строки?

Автор: An6rey 29.6.2009, 23:32
после open и до send

Автор: begin 30.6.2009, 01:07
Спасибо, частично помогло: параметр $_POST['id'] уже виден. Но все еще не виден параметр $_POST['text_new'] - содержимое textarea, в котором пользователь набирает сообщение. В теле скрипта я ведь не могу его передать - скрипт объявляется раньше чем само поле.
Где же еще одна ошибка?  smile 

Автор: An6rey 30.6.2009, 01:37
Так бывает когда вместо того чтобы изучать технологию пошагово браться сразу за код.
Твой инпут будет пересылатья только при сабмите
Для передачи его Аяксом его значение нужно извлечь из валуэ и прописать явно в методе сэнд

Автор: begin 30.6.2009, 02:37
Цитата(An6rey @ 30.6.2009,  01:37)
Так бывает когда вместо того чтобы изучать технологию пошагово браться сразу за код.
Твой инпут будет пересылатья только при сабмите
Для передачи его Аяксом его значение нужно извлечь из валуэ и прописать явно в методе сэнд

Да, Вы полностью правы. И тепеть вот приходится расхлебывать и Вас напрягать  smile 
Насчет текста выкрутился так:
Код

xmlDoc.setRequestHeader("Content-Type","application/x-www-form-urlencoded")
myparams = 'id=<?php echo $profile_id; ?>&text_new=' + document.getElementById("text_new").value;
xmlDoc.send(myparams);

И наконец то все заработало  smile 
Огромное спасибо всем, кто помогал  smile 

Вот еще хочу посоветоваться. Я хочу, чтобы функция reload вызывалась сама каждые 60 секунд.
Для этого после скрипта отправки формы, добавил такой код:
Код

<script>
setTimeout ("reload()", 60000);
</script>

Но почему то ничего само не обновляется  smile 

Автор: bars80080 30.6.2009, 11:09
даже ни одного раза? или всё один раз?

для многократного надобно бы setInterval("reload1()", 60000);

да и посоветовал бы сменить имя функции на другое, reload явно служебное слово

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)