ajax // Разбор XML в опере и файрфокс

Farsh

~ on ~ high ~ wave ~
ajax // Разбор XML в опере и файрфокс

У меня тут возник вопрос .
Расписывать много не буду, вопрос конкретен .
Представим , что от серверного скрипта в асинхронном режиме данные приходят в xml :
<response>
alalala
</response>
Но в опере и файрфоксе эти данные нельзя получить таким образом :
getElementsByTagName('response').item(0).firstChild.data , файрфокс выдает :
getElementsByTagName('response').item(0) has no properties .

В ie все отлично ( =) )
Файрбаг показывает , что данные корректно пришли , в правильной форме .
В поиске ничего на эту тему нет , в гугле ответы ( почему-то ) только когда данные передаются неасинхронно , типо проверять как readystate будет равен 4 , тогда парсить . В моем случае это проверяется по умолчанию , но все равно такая лабуда .

если просто написать firstChild.data - тогда все отлично выводит .
В чем проблема ?
 

Farsh

~ on ~ high ~ wave ~
Эммм... Разобрался .
Я тестировал на простом xml'e :
<response>
ogogo
</response>
При этом если будет getElementsByTagName('response')[0].firstChild.NodeValue , то все равно будет писать ту хрень .

А если типо этого :
<response>
<resp>
asdasd
</resp>
</response>
То getElementsByTagName('resp')[0].firstChild.NodeValue нормально работает ...
Будет такой вопросег не в тему - есть ли хоть какие то преимущества неасинхронной передачи данных ?
 

kruglov

Новичок
Farsh
Да? Ну, значит, добавили, помнится, некогда MSIE детектили как if(document.all && document.all.item).
 

Farsh

~ on ~ high ~ wave ~
Вообще , что я хочу сказать , у меня в файрфокс и опере childNodes просто не работают ..
Идет бред какой то. Допустим обрабатывается какая то часть xml , и к примеру childNodes[2] не работает , пишет что в первом посте , а childNodes[3] работает отлично ...
Пришлось половину изменить на getElementsByTagName ..
 

Farsh

~ on ~ high ~ wave ~
dimagolov
Файрбаг давным давно стоит , возвращающийся хмл абсолютно правелен :) Ну ладно , это особо не решает , просто код стал чуть больше

-~{}~ 11.12.07 15:57:

Проблема решена .. Спасибо dimagolov , я поспешил с ответом ...
Причина оказалась ... $domgen->formatOutput = true ...
Изза чего этот "красивый вывод" сказался на добавлении между чаилдами дополнительных текстовых нодов со значением "\n" =) Даже не ожидал .
 

dimagolov

Новичок
текстовых нодов со значением "\n"
это не только для XML справедливо, для простого HTML та же история...
 

phpdev2007

Новичок
Farsh
Не ну зачем так мучаться? :)
попробуйте в google: jQuery
потом напишите ваше мнения :)
 

Farsh

~ on ~ high ~ wave ~
phpdev2007,
Знаю , знаю про этот jquery .
Но в данное время мне не до него .. И так тяну со сроком ппц .. Как доделаю то , чем сейчас занимаюсь , уже примусь и за jquery , и за серьезные библиотеки типо prototype , extjs, mootols .
 

phpdev2007

Новичок
Farsh
она не требует много времени, наоборот поможет в такой ситуации гарантия.!
 

alekciy

Новичок
Автор оригинала: Farsh
Причина оказалась ... $domgen->formatOutput = true ...
Изза чего этот "красивый вывод" сказался на добавлении между чаилдами дополнительных текстовых нодов со значением "\n" =) Даже не ожидал .
Вообще-то это нормальное поведение. И только глупый IE убирает текстовые узлы между тегами. Неправильно этого.
 

Farsh

~ on ~ high ~ wave ~
Да это понятно , до этого я ещё не понимал особо разницу работы различных браузеров .. Сейчас многое понял .
Есть ещё такой вопрос , правда возможно вам понадобится телепат , но постараюсь описать подробно .
Есть файрфокс .
При нажатии на кнопку запускаются 2 функции .
Первая функция - 1 раз.
Вторая функция - стоит на таймауте в скока то там секунд и выполняется до тех пор , пока не прекратит свою работу первый скрипт .
Смысл в том , что в данном случае в файрфоксе выполняется все так , но после этого сразу же сам по себе второй раз вызывается первый скрипт , уже без второго , и от него уже получается итоговый ответ . А первый раз от первого скрипта файрфокс показывается ответ - "Loading..." .
Надеюсь вы меня поняли .
В чем может быть проблема , в какую сторону глядеть ?
В опере и ИЕ все ок .
 

alekciy

Новичок
Автор оригинала: Farsh
Да это понятно , до этого я ещё не понимал особо разницу работы различных браузеров
Я бы даже сказал это вопрос степени правильности реализации DOM модели от W3C в разных браузерах. В IE реализация неправильная.

Автор оригинала: Farsh
правда возможно вам понадобится телепат
Проще просто привести пример кода (не дай боже весь движок!!! напиши простой тестовый пример) чем играть тут в угадайку.
 

Farsh

~ on ~ high ~ wave ~
Автор оригинала: alekciy
Я бы даже сказал это вопрос степени правильности реализации DOM модели от W3C в разных браузерах. В IE реализация неправильная.


Проще просто привести пример кода (не дай боже весь движок!!! напиши простой тестовый пример) чем играть тут в угадайку.
Ок.
PHP:
function process()
 {  
    if(xmlHttp.readyState == 4 || xmlHttp.readyState == 0)
      {
       xmlHttp.open("POST", "./trance.php", true);
       xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
       xmlHttp.onreadystatechange = processResponse;
       xmlHttp.send(params);
     }
  }

function processResponse()
 {
  if (xmlHttp.readyState == 4)
  {                             
    if (xmlHttp.status == 200)
    {
      firstFunction();
      secondFunction();  
            }
      }
 }

function secondFunction()
{
  if (xmlHttp2.readyState == 4 || xmlHttp2.readyState == 0)
  { 
    .. тд и тп ..
    xmlHttp2.open("POST", "./secondFunction.php", true);
    xmlHttp2.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xmlHttp2.onreadystatechange = secondFunctionResponse;
    xmlHttp2.send(params);
  }
  else { t = setTimeout('secondFunction()', 3000); }
}

function secondFunctionResponse()
 {
  if (xmlHttp2.readyState == 4)
  {                             
    if (xmlHttp2.status == 200)
    { 
       .. тут получаем result .. ( Если приходит готово , значит функция firstFunction завершилась )
       if(result == 'готово') {
       document.getElementById('getexcel').innerHTML = result;
       clearTimeout(t); }
      else {
       document.getElementById('getexcel').innerHTML = result;
       t = setTimeout('secondFunction()', 3000);} }
}
First function как раз таки выполняется один раз , ее приводить не буду , и так все понятно .
В файрфоксе идет так :
process();
firstFunction(); ( представим что она будет выполняться 6 сек )
secondFunction();
secondFunction(); // Тут функция firstFunction завершилась , но от нее пришел ответ "Loading..." и дальше ->
firstFunction(); // Вызвалась ни с того ни с сего , которая опять будет выполняться около 6 сек , функция secondFunction не вызывается . Ответ приходит .

Ну вот и не пойму че за бред .
 
Сверху