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


Автор: chiffa 13.11.2008, 11:14
Добрый день всем, использую аджакс через XMLHttpRequest 

тоесть из index.php через 2.js в table.php идет запрос, обработка и дальнейший вывод. Так вот суть задачи: в table.php выводятся инфа из базы данных в виде таблици, вопрос как передать теги? если стандартно <table> <tr> <td></td> </tr>  </table> то выдает ошибку. Делал таким образом &lt;table&gt; &lt;tr&gt; &lt;td&gt; &lt;/td&gt; $x &lt;/tr&gt;  &lt;/table&gt; все выводится на ура, но почему то только первые 10 записей из базы, всего же их около 100. Если делал обічній вывод типа $x."&lt;<br>&gt" то выводится все 100. Подскажите в чем проблема и как вообще подобное лучьше всего реализовать. код 2.js:

Код

var xmlHttp1 = createXmlHttpRequestObject1();
// retrieves the XMLHttpRequest object
function createXmlHttpRequestObject1()
{

  // will store the reference to the XMLHttpRequest object
  var xmlHttp1;
  // if running Internet Explorer
  if(window.ActiveXObject)
  {
    try
    {
      xmlHttp1 = new ActiveXObject("Microsoft.XMLHTTP");
    }
    catch (e)
    {
      xmlHttp1 = false;
    }
  }
  // if running Mozilla or other browsers
  else
  {
    try
    {
      xmlHttp1 = new XMLHttpRequest();
    }
    catch (e)
    {
      xmlHttp1 = false;
    }
  }

    // return the created object or display an error message
  if (!xmlHttp1)
   alert("Error creating the XMLHttpRequest object.");
  else
    return xmlHttp1;

}

// make asynchronous HTTP request using the XMLHttpRequest object
function process_mfo(make)
{
  // proceed only if the xmlHttp object isn't busy
  if (xmlHttp1.readyState == 4 || xmlHttp1.readyState == 0)
  {

    ssd=0;
    // retrieve the name typed by the user on the form
  //  mfo1 = encodeURIComponent(document.getElementById("myName").value);

sxsss = encodeURIComponent(document.getElementById("sx").value);

    // execute the quickstart.php page from the server
    xmlHttp1.open("GET", "table.php?what_make=" + make + "&sx_ft=" + sxsss, true);
    // define the method to handle server responses
    xmlHttp1.onreadystatechange = handleServerResponse1;
    // make the server request
    xmlHttp1.send(null);
  }
  else
    // if the connection is busy, try again after one second
    setTimeout('process_mfo()', 1000);
}

// executed automatically when a message is received from the server
function handleServerResponse1()
{
  // move forward only if the transaction has completed
  if (xmlHttp1.readyState == 4)
  {
    // status of 200 indicates the transaction completed successfully
    if (xmlHttp1.status == 200)
    {
      // extract the XML retrieved from the server
      xmlResponse1 = xmlHttp1.responseXML;
      // obtain the document element (the root element) of the XML structure
      xmlDocumentElement1 = xmlResponse1.documentElement;
      // get the text message, which is in the first child of
      // the the document element
      helloMessage1 = xmlDocumentElement1.firstChild.data;
      // update the client display using the data received from the server

var mk1 = helloMessage1.split('```');

  document.getElementById("divMessage").innerHTML = mk1 [1];

var er1 = helloMessage1.split('***');



 document.getElementById("sx").value = mk1 [0];


      // restart sequence

    }
    // a HTTP status different than 200 signals an error
    else
    {
      alert("There was a problem accessing the server: " +
xmlHttp1.statusText);
    }
  }

}


Автор: solenko 13.11.2008, 11:30
Если отдаете то зачем использовать responseXML? Пользуйтесь responseText

Автор: chiffa 13.11.2008, 13:55
Спасибо за ответ! просто поменять: responseXML на responseText? Поменял - престало вообще что либо выводить

Автор: bars80080 13.11.2008, 15:27
дофига много чего написано, главное непонятно зачем.
совет правильный, пхп-скрипт отдаёт не валидный xml, а кусок обычной раметки, поэтому надо использовать responseText.
то что дальше не работает - надо смотреть в обработке

либо сделать проще http://forum.vingrad.ru/index.php?show_type=forum&showtopic=234446&st=0&anchor=entry1685574

Автор: chiffa 13.11.2008, 22:38
Спасибо огромное! огромный тебе респект! Спасаешь уже много раз! smile  smile  smile 

Автор: chiffa 14.11.2008, 13:37
И еще вопросик, может подскажет кто. Если в table.php есть JavaScript код, то почему то не выполняется после асинхронной загрузки. К примеру этот:

Код

<script language='JavaScript'>
function ck()
{
alert ('fff');
}
</script>


<a href='JavaScript:ck ();'>dddddd</a>


Подскажите, кто знает в чем трабл...

Добавлено через 8 минут и 34 секунды
так работает на ура: <a href='JavaScript:alert ("fff");'>dddddd</a>, но если функция будет довольно емкая, то будет не эститично smile

Автор: chiffa 17.11.2008, 16:02
никто незнает?...

Автор: bars80080 17.11.2008, 19:08
если не ошибаюсь, скрипты надо мутить с помощью appendChild. т.е. напрямую добавляя к DOMу, а затем меняя ему .src
наверно можно отследить с помощью onload загрузку и тогда функции будут доступны

но это наобум

Автор: ksnk 17.11.2008, 19:59
chiffa, Вот http://forum.dklab.ru/js/other/ZapuskJavascriptPrishedshegoCherezAjaxHttprequestOptimizatsiya.html одно из решений.
Основная мысль - из полученого html'я нужно выгрести весь <script/> и потом уже вручную его за'eval'ить. Иначе получается не особенно кроссброузерно.


Автор: chiffa 18.11.2008, 17:28
спасибо за оветы, но что то не получается разобраться что и как.

ksnk, может подскажешь как выцепить скрипты из хтмл и как с помощью evel их потом залить?... буду весьма признателен

Автор: ksnk 18.11.2008, 19:33
Хм... Вообще-то код по моей ссылке действительно несколько неработоспособен :-( 
Методом упрощения удалось привести его к состоянию, когда оно заработало, правда при этом утерялась суть того метода выполнения скриптов, ну да не в этом , в общем-то, сейчас суть...

appendData - добавляет строку data_str в контейнер parent_node. Если нужно добавить к содержимому контейнера - третий параметр- "append", иначе содержимое контейнера замениться.

Мастерилось на коленке, но, вроде, должно работать. 
Код

function appendData(data_str, parent_node, mode)
{
    appendData.js_store='';
   
    data_str =data_str.replace(/<script.*?>((.|[\r\n])*?)<\/script>/ig,appendData.handle);

    //вставляем получившийся текст с метками
    if(parent_node)
      if (mode == 'append') {
        parent_node.innerHTML += data_str;
      } else {
        parent_node.innerHTML = data_str;
      } 
    if(!!appendData.js_store)
    try{ 
       // alert(appendData.js_store) ;
        if(window.execScript) { 
            window.execScript(appendData.js_store, "javascript"); 
        } else {
            eval(appendData.js_store)
        }
    } catch(e){}; // в целях отладки - блок нужно убрать!!!!
}
appendData.handle=function($0,$1)
{
    appendData.js_store+='\n'+$1; // собираем JS в едину кучу
    return '';
}

// appendData(document.body.innerHTML); // не раскомментировать эту строчку !!! :-)


Автор: chiffa 18.11.2008, 21:06
спасибо за помощь, но что то не работает, я вставил функцию в js-файл, дальше примени:

document.getElementById("ziel").innerHTML = appendData(mk1 [1]); и выводит undefined пробывал
 так appendData(document.getElementById("ziel").innerHTML) = mk1 [1];, может я что то недопоял, не выводит вообще ничего. вот сам код js-файла

Код


function appendData(data_str, parent_node, mode)
{
    appendData.js_store='';

    data_str =data_str.replace(/<script.*?>((.|[\r\n])*?)<\/script>/ig,appendData.handle);
    //вставляем получившийся текст с метками
    if(parent_node)
      if (mode == 'append') {
        parent_node.innerHTML += data_str;
      } else {
        parent_node.innerHTML = data_str;
      }
    if(!!appendData.js_store)
    try{
       // alert(appendData.js_store) ;
        if(window.execScript) {
            window.execScript(appendData.js_store, "javascript");
        } else {
            eval(appendData.js_store)
        }
    } catch(e){}; // в целях отладки - блок нужно убрать!!!!
}
appendData.handle=function($0,$1)
{
    appendData.js_store+='\n'+$1; // собираем JS в едину кучу
    return '';
}
// appendData(document.body.innerHTML); // не раскомментировать эту строчку !!! :-)

function changespecial(x) {
    var dpar = '<? echo time(); ?>';
    if(window.XMLHttpRequest) {
        try { req = new XMLHttpRequest(); }
        catch (e){}}
    else if(window.ActiveXObject) {
        try { req = new ActiveXObject('Msxml2.XMLHTTP'); }
        catch (e){ req = new ActiveXObject('Microsoft.XMLHTTP'); }}
    req.onreadystatechange = function() {
        if(req.readyState == 4) ajax_o(req.responseText); }


    sxsss = encodeURIComponent(document.getElementById("sx").value);

    req.open("GET", 'platej.cff?what_make=' + x + '&sx_ft=' + sxsss, true);
    req.send('');
}
function ajax_o(x) {

var mk1 = decodeURIComponent(x).split('```');

document.getElementById("sx").value = mk1 [0];

  document.getElementById("ziel").innerHTML = appendData(mk1 [1]);


}

Автор: chiffa 23.11.2008, 23:29
up smile

Автор: ksnk 24.11.2008, 00:45
appendData - процедура, которая выполняется не сразу, а сначала неспешно получит от сервера ответ, потом уже его обработает и вставит в innerHTML элемента, переданного вторым параметром.

возможно, было бы правильнее написать 
Код

...
  appendData(mk1 [1], document.getElementById("ziel"));
}


Автор: chiffa 24.11.2008, 01:07
не-а.... не работает... переданые скрипты не выполняются...

Автор: ksnk 24.11.2008, 03:27
chiffa, В FireFox'е есть FireBug, а мои способности телепата, видимо исчерпались...

Автор: chiffa 24.11.2008, 11:53
работает почему то только в осле в фаерфоксе и в опере не работает.  Смотрел через FireBug оно вообще скрипты не показывает, получается что они не подгрузились...


Цитата(ksnk @  24.11.2008,  03:27 Найти цитируемый пост)
а мои способности телепата, видимо исчерпались... 


сорри, но я просто незнаю какая инфа будет полезной. я вроде как узе все выложил...

Автор: chiffa 27.11.2008, 00:01
up

Автор: solenko 27.11.2008, 08:39
chiffa, а ты выложи все это в веб и дай ссылку. 

Автор: chiffa 27.11.2008, 21:38
вот... http://chiffa.biz.ua/rab/js/

Автор: ksnk 27.11.2008, 23:21
Нужно поставить таки FireBug. Так бы сразу была видна ошибка.

-- "Javcript: return false; " не является универсальным заклинанием. Если хочется - вместо пустого линка можно вставить 'javascript:void();' 

-- вместо  eval(appendData.js_store) лучше поставить eval.call(window, appendData.js_store)  в 19 строку. Так, по идее, должно работать в FireFox.

Автор: chiffa 28.11.2008, 00:28
Огромное спасибо!!! Наконецто оно заработало!!!  smile 

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