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


Автор: sugee 24.7.2006, 19:48
Код

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;

работает нормально, проблема только в том чтобы передать параметр.
 

Автор: vasac 24.7.2006, 20:08
Код

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

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

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

Код

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); //--в том месте, где надо

Это использование окружения объекта. 

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

Автор: skyboy 26.7.2006, 08:22
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... 

Автор: sugee 26.7.2006, 21:10
Формирую такой 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.  

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

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

Автор: sugee 26.7.2006, 22:43
Дело в том что у меня в теге <cont> содержится не просто текст, а JavaScript
пропущенный через htmlspecialchars().  Так что валидный XML тут никак не получится.    Странно другое:  если убрать этот тег вообще,  то XML уж точно валидный,    а req.responseXML.documentElement всё равно возвращает NULL. 

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

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

какой тег? <response>?  

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

Так заключи его в CDATA. 

Автор: sugee 28.7.2006, 07:19
Код

<?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 теперь всё правильно, но корневой узел всё равно не могу получить.  

Автор: skyboy 28.7.2006, 08:07
а без скрипта в cont- можешь? вместе с тегом respone? 

Автор: sugee 28.7.2006, 08:18
Нет,  null и всё...   smile   

Автор: skyboy 28.7.2006, 10:11
а responseText какой? 

Автор: sugee 28.7.2006, 22:54
В 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>
 

Автор: skyboy 28.7.2006, 23:36
слу, самый-самый простой пример из любого учебника/справочника по ajax работает? мало ли, может проблема с кодировкой, настройкой, прочим...  

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