Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> XMLHttpRequest - проблема с передачей параметра 
:(
    Опции темы
sugee
Дата 24.7.2006, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 423
Регистрация: 12.6.2005

Репутация: нет
Всего: 4



Код

function view(scrId, act) {
    _block  =  document.getElementById(scrId);
    if (act == 1)
    _block.style.display = "block" ;
    else
    _block.style.display = "none" ;
  
  param = "out.php?id=" + scrId;
  loadXMLDoc(param);
}


function loadXMLDoc(url) {
   
    if (window.XMLHttpRequest) {
        req = new XMLHttpRequest();
        req.onreadystatechange = processReqChange;
        req.open("GET", url, true);
        req.send(null);
        
   
    } else if (window.ActiveXObject) {
        req = new ActiveXObject("Microsoft.XMLHTTP");
        if (req) {
            req.onreadystatechange = processReqChange;
            req.open("GET", url, true);
            req.send();
        }
    }
}

function processReqChange() {
    
    if (req.readyState == 4) {   
        if (req.status == 200) {
            proc=req.responseText;    
            proсess(proc);

        } 
    }
}

function proсess(pr) {
_id = "code" + scrId;
document.getElementById(_id).innerHTML = pr;
}


Для того чтобы показанный код делал именно то что мне нужно, надо передать параметр scrId, 
принимаемый функцией view в функцию process. Камнем преткновения стала функция processReqChange,
то есть вопрос в общем в том чтобы передать этот параметр в эту функцию.
Если делать это так
Код

req.onreadystatechange = processReqChange(scrIdparam);

естественно сначала передав параметр в loadXMLDoc(), то IE ругается на несоответствие типов,
а JavaScript-консоль в firefox загадочно молчит, но ни в одном браузере код не работает.
Мне это, в общем, нужно для того чтобы содержимое записи БД выводилось в DIV-е с соответствующим
айдишником.  
С фиксированным айдишником, т.е.
Код

 document.getElementById("ID").innerHTML = pr;

работает нормально, проблема только в том чтобы передать параметр.
 
PM MAIL   Вверх
vasac
Дата 24.7.2006, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1060
Регистрация: 4.5.2006

Репутация: 13
Всего: 36



Код

req.onreadystatechange = ( function(e) { return processReqChange( scrIdparam ); } );
 

Вместо srcIdparam видимо url имелся ввиду? 

Это сообщение отредактировал(а) vasac - 24.7.2006, 20:12
PM WWW   Вверх
12345c
Дата 24.7.2006, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

Репутация: 57
Всего: 101



Не знаю, возможно ли передать параметры функции-обработчику прерывания, разве что объявив её как метод в обёртывающей функции . Попробуйте

Код

function loadXMLDoc(URL, param) {
this.param0=param;
this.processReqChange=function () {
    
    if (req.readyState == 4) {   
        if (req.status == 200) {
            proc=req.responseText;
          this.param0 // использование параметра
            proсess(proc);
        } 
    }
}   
    if (window.XMLHttpRequest) {
        req = new XMLHttpRequest();
        req.onreadystatechange = loadXMLDoc.processReqChange;
        req.open("GET", url, true);
        req.send(null);
        
   
    } else if (window.ActiveXObject) {
        req = new ActiveXObject("Microsoft.XMLHTTP");
        if (req) {
            req.onreadystatechange = loadXMLDoc.processReqChange;
            req.open("GET", url, true);
            req.send();
        }
    }
}
LXM=new loadXMLDoc();
LXM(url, param); //--в том месте, где надо

Это использование окружения объекта. 
PM WWW   Вверх
sugee
Дата 25.7.2006, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 423
Регистрация: 12.6.2005

Репутация: нет
Всего: 4



Нет, так не получается.  В принципе я сделал то, что хотел, но я пошёл от обратного.   Id я передаю из PHP-скрипта в req.responseText, а потом вытаскиваю его оттуда  строковыми функциями.  Всё работает, но способ конечно не самый красивый. 

Это сообщение отредактировал(а) sugee - 25.7.2006, 20:16
PM MAIL   Вверх
skyboy
Дата 26.7.2006, 08:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 10
Всего: 260



sugee, конечно, не самый. При том, что XMLHttpReuquest - он, в первую очередь, XML.... Формируй на стороне сервера простенький XML и тогда вместо парсинга текста можно будет сделать чего-то вроде такого: 
Код

request.responseXML.documentElement.getElementsByTagName('result')[0].getElementsByTagNane('id').firstChild.nodeValue

Конечно, может парсинг строки из одного значения и покороче будет, зато такой метод хранения позволяет легко получить доступ и к 5, и к 10 разным значениям.
Касательно конкретно сабжа, то я использую передачу функции обратного вызова.
Вот так выглядят функции, упрощающие работу с данным объектом(они "заточены" под Get - передеачу, но, как мне кажется, переделать не сложно):
Код

     function MakeHttpRequest(url, callback) {
        if (window.XMLHttpRequest)
          req = new XMLHttpRequest();
        else if (window.ActiveXObject)
          req = new ActiveXObject("Microsoft.XMLHTTP");
        if (req) {
          req.onreadystatechange = processReqChange;
          req.open("GET", url, true);
          req.send(null);
          callback_httprequest=callback;
          return true;
        }
        return false;
      }

      function processReqChange()
      {
        if (req.readyState == 4) {
          // only if "OK"
          if (req.status == 200) {
            // ...processing statements go here...
            callback_httprequest();
          } else {
              alert("There was a problem retrieving the XML data:\n" + req.statusText);
          }
        }
      }


Решение не моё, на каком-то сайте нашёл. А вызов происходит так:
Код

MakeHttpRequest("zzz.com.ua?name=blablabla&id="+_id,function() {your_function(_id);});

Только в этой реализации функций - "обёрток" одна недоработка: используется одна глобальная реализация объекта xmlhttprequest... 
PM MAIL   Вверх
sugee
Дата 26.7.2006, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 423
Регистрация: 12.6.2005

Репутация: нет
Всего: 4



Формирую такой XML
Код

<?xml version="1.0" encoding="UTF-8"
standalone="yes"?>
<values>
<id>Id</id>
<cont>content</cont>
</values>


Получаю его
Код

  if (req.status == 200) {
proc=req.responseXML;
 ...
}

Почему-то не могу добраться добраться до корневого узла, proc.documentElement  у меня возвращает NULL.  

Это сообщение отредактировал(а) sugee - 26.7.2006, 21:11
PM MAIL   Вверх
skyboy
Дата 26.7.2006, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 10
Всего: 260



это потому что вся структура должна быть обрамлена <response></response>:
Код

<?xml version="1.0" encoding="UTF-8"    
standalone="yes"?>    
<response>
<values>    
<id>Id</id>    
<cont>content</cont>    
</values>
</response>
 
PM MAIL   Вверх
sugee
Дата 26.7.2006, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 423
Регистрация: 12.6.2005

Репутация: нет
Всего: 4



Дело в том что у меня в теге <cont> содержится не просто текст, а JavaScript
пропущенный через htmlspecialchars().  Так что валидный XML тут никак не получится.    Странно другое:  если убрать этот тег вообще,  то XML уж точно валидный,    а req.responseXML.documentElement всё равно возвращает NULL. 
PM MAIL   Вверх
skyboy
Дата 27.7.2006, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 10
Всего: 260



Цитата(sugee @  26.7.2006,  22:43 Найти цитируемый пост)
Так что валидный XML тут никак не получится. 

А в чём его инвалидность? В символах амперсанда?
Цитата(sugee @  26.7.2006,  22:43 Найти цитируемый пост)
 если убрать этот тег вообще

какой тег? <response>?  
PM MAIL   Вверх
vasac
Дата 27.7.2006, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1060
Регистрация: 4.5.2006

Репутация: 13
Всего: 36



Цитата(sugee @  26.7.2006,  22:43 Найти цитируемый пост)
Дело в том что у меня в теге <cont> содержится не просто текст, а JavaScript

Так заключи его в CDATA. 
PM WWW   Вверх
sugee
Дата 28.7.2006, 07:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 423
Регистрация: 12.6.2005

Репутация: нет
Всего: 4



Код

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
       <!DOCTYPE response [
       <!ELEMENT response ( id, cont ) >
       <!ELEMENT id (#PCDATA)>
       <!ELEMENT cont (#PCDATA)>
       ]>
       <response>
       <id>1</id>
       <cont>content</cont>
       </response>

В XML теперь всё правильно, но корневой узел всё равно не могу получить.  
PM MAIL   Вверх
skyboy
Дата 28.7.2006, 08:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 10
Всего: 260



а без скрипта в cont- можешь? вместе с тегом respone? 
PM MAIL   Вверх
sugee
Дата 28.7.2006, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 423
Регистрация: 12.6.2005

Репутация: нет
Всего: 4



Нет,  null и всё...   smile   
PM MAIL   Вверх
skyboy
Дата 28.7.2006, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 10
Всего: 260



а responseText какой? 
PM MAIL   Вверх
sugee
Дата 28.7.2006, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 423
Регистрация: 12.6.2005

Репутация: нет
Всего: 4



В responseText весь сформированный на стороне сервера текст, т.е.
Код

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
       <!DOCTYPE response [
       <!ELEMENT response (id, cont ) >
       <!ELEMENT id (#PCDATA)>
       <!ELEMENT cont (#PCDATA)>
       ]>
       <response>
       <id>1</id>
       <cont>content</cont>
       </response>
 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0849 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.