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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прочитать xml из iframe (ie) 
V
    Опции темы
Onis
  Дата 16.6.2009, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 241
Регистрация: 18.6.2005
Где: Украина, Николаев

Репутация: 2
Всего: 3



Привет винград.

Есть фрейм на который у различных форм установлен target. На событие фрейма onload срабатывает метод который считывает ответ от сервера, ответ естественно в формaте xml.
В Opera, FF, Chrome всё работает. Но ишак (что шестой, что восьмой) не хочет воспринемать информацию в фрейма как XML.

Ответ от сервера идет с заголовком "Content-type: text/xml; charset=UTF-8". Если ставлю только XML то при загрузке фрейма всплывает окно с предложением сохранить файл на диске, в сохраненном файле верный XML ответ.

Пример ответа в дебагере FF:
Код

<iframe id="uploadFile" height="1" frameborder="0" width="1" name="uploadFile" style="display: none;">
<response>
<file>
<name>start-with-ajax.zip</name>
<error>1</error>
</file>
</response>
</iframe>

Деббагер IE8:
Код

<iframe id="uploadFile" height="1" frameBorder="0" width="1" name="uploadFile" style="display: none;">
<html>
<head>
<title></title>
<style>CSS Stylesheet</style>
<script><!-- function f(e){ if (e.className=="ci"){if (e.children(0).innerText.indexOf("\n")>0) fix(e,"cb");} if (e.className=="di"){if (e.children(0).innerText.indexOf("\n")>0) fix(e,"db");} e.id=""; } function fix(e,cl){ e.className=cl; e.style.display="block"; j=e.parentElement.children(0); j.className="c"; k=j.children(0); k.style.visibility="visible"; k.href="#"; } function ch(e){ mark=e.children(0).children(0); if (mark.innerText=="+"){ mark.innerText="-"; for (var i=1;i<e.children.length;i++) e.children(i).style.display="block"; } else if (mark.innerText=="-"){ mark.innerText="+"; for (var i=1;i<e.children.length;i++) e.children(i).style.display="none"; }} function ch2(e){ mark=e.children(0).children(0); contents=e.children(1); if (mark.innerText=="+"){ mark.innerText="-"; if (contents.className=="db"||contents.className=="cb") contents.style.display="block"; else contents.style.display="inline"; } else if (mark.innerText=="-"){ mark.innerText="+"; contents.style.display="none"; }} function cl(){ e=window.event.srcElement; if (e.className!="c"){e=e.parentElement;if (e.className!="c"){return;}} e=e.parentElement; if (e.className=="e") ch(e); if (e.className=="k") ch2(e); } function ex(){} function h(){window.status=" ";} document.onclick=cl; --></script>
<body class="st">
<DIV class=e><SPAN class=b>&nbsp;</SPAN> <SPAN class=m>&lt;?</SPAN><SPAN class=pi>xml version="1.0" </SPAN><SPAN class=m>?&gt;</SPAN> </DIV>
<DIV class=e>
<DIV class=c IEDevTbCSSSaved="TEXT-INDENT: -2em; MARGIN-LEFT: 1em"><A class=b onfocus=h() onclick="return false" href="#">-</A> <SPAN class=m>&lt;</SPAN><SPAN class=t>response</SPAN><SPAN class=m>&gt;</SPAN></DIV>
<DIV>
<DIV class=e>
<DIV class=c IEDevTbCSSSaved="TEXT-INDENT: -2em; MARGIN-LEFT: 1em"><A class=b onfocus=h() onclick="return false" href="#">-</A> <SPAN class=m>&lt;</SPAN><SPAN class=t>file</SPAN><SPAN class=m>&gt;</SPAN></DIV>
<DIV>
<DIV class=e>
<DIV IEDevTbCSSSaved="TEXT-INDENT: -2em; MARGIN-LEFT: 1em"><SPAN class=b>&nbsp;</SPAN> <SPAN class=m>&lt;</SPAN><SPAN class=t>name</SPAN><SPAN class=m>&gt;</SPAN><SPAN class=tx>Водяные лилии.jpg</SPAN><SPAN class=m>&lt;/</SPAN><SPAN class=t>name</SPAN><SPAN class=m>&gt;</SPAN> </DIV></DIV>
<DIV><SPAN class=b>&nbsp;</SPAN> <SPAN class=m>&lt;/</SPAN><SPAN class=t>file</SPAN><SPAN class=m>&gt;</SPAN></DIV></DIV></DIV>
<DIV><SPAN class=b>&nbsp;</SPAN> <SPAN class=m>&lt;/</SPAN><SPAN class=t>response</SPAN><SPAN class=m>&gt;</SPAN></DIV></DIV></DIV>

... ETC ...

Что делать? Что делать?
PM MAIL   Вверх
Astraller
Дата 17.6.2009, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 300
Регистрация: 1.8.2007
Где: $Украина[Кры м]->Феодосия

Репутация: 2
Всего: 5



В принципе логично smile Осел действительно парсит XML и выводит его в виде HTML.
ИМХО: вариант решения это обмен с сервером через Ajax.


--------------------
A.S.T.R.A.L.L.E.R.: Artificial Synthetic Technician Responsible for Assassination, Logical Learning and Efficient Repair
PM MAIL WWW ICQ   Вверх
Aliance
Дата 17.6.2009, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 55
Всего: 137



Цитата

На событие фрейма onload срабатывает метод который считывает ответ от сервера

покажи его код
PM MAIL WWW ICQ Skype   Вверх
Onis
Дата 17.6.2009, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 241
Регистрация: 18.6.2005
Где: Украина, Николаев

Репутация: 2
Всего: 3



Astraller
Цитата(Astraller @  17.6.2009,  08:20 Найти цитируемый пост)
ИМХО: вариант решения это обмен с сервером через Ajax. 

Эту фишку я использую для "асинхронной" загрузки файлов, ajax исключен.

Aliance
Я написал такую функцию:
Код

function getValFromXML(xx, name)
{
    if(xx.getElementsByTagName(name)[0])
    {
        if(xx.getElementsByTagName(name)[0].nodeType == 1)
        {
            var name_node = xx.getElementsByTagName(name)[0].firstChild;
            if ( !name_node )
                var theData = "";
            else
                var theData = name_node.nodeValue;
            return theData;
        }
    }
    return false;
}
func

Т.к. у меня большинство ответов однообразны есть еще такая функция:
Код

function responseInArray(xmldoc)
{
    var response = xmldoc.getElementsByTagName('response')[0];
    var data = new Array();
    for(var i = 0; response.childNodes.length > i; i++)
    {
        var kids = response.childNodes[i].childNodes;
        var tmp = new Array();
        for(var k = 0; kids.length > k; k++)
        {
            if(kids[k].firstChild)
                tmp[kids[k].tagName] = kids[k].firstChild.nodeValue;
        }
        data.push(tmp);
    }
    return data;
}

Немного кривовато но это наброски.

Aliance
Сам метод:
Код

function imgUpload(response, container, nextFile)
{
    if(response.documentElement.tagName.toUpperCase() == 'RESPONSE')
    {        
        var d = responseInArray(response);
    
        if(typeof(d[0]) == 'undefined')
            container.innerHTML+= '<p class="uploadReport error">%LANG_undefined_error%</p>';
        else if(d[0]['error'])
        {
            if(typeof(d[0]['name']) == 'undefined')
                container.innerHTML+= '<p class="uploadReport warning">%LANG_empty_file%</p>';
            else
            {
                switch(d[0]['error'])
                {
                    case '1': container.innerHTML+= '<p class="uploadReport">' + d[0]['name'] + ' <span class="error">%LANG_wrong_file_type%</span></p>';    break;
                    case '2': container.innerHTML+= '<p class="uploadReport">' + d[0]['name'] + ' <span class="error">%LANG_error_while_upl%</span></p>';    break;
                    case '3': container.innerHTML+= '<p class="uploadReport">' + d[0]['name'] + ' <span class="error">%LANG_error_while_proc%</span></p>'; break;
                    default: container.innerHTML+= '<p class="uploadReport">' + d[0]['name'] + ' <span class="error">%LANG_undefined_error%</span></p>'; break;
                }
            }
        
        }
        else
            container.innerHTML+= '<p class="uploadReport">' + d[0]['name'] + ' %LANG_file_success_upl%</p>';            
    }
    (nextFile)? nextFile() : null;
}



Это сообщение отредактировал(а) Onis - 17.6.2009, 17:01
PM MAIL   Вверх
WIPS
Дата 17.6.2009, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 22.5.2006
Где: Украина, Киев

Репутация: 2
Всего: 8



А если просто для IE спецобработку написать:

1. Сначала вырезаем все теги кроме <iframe> регуляркой, таким образом избавляемся от HTML;
2. Заменяем "&gt;" и "&lt;" на "<" и ">" - получаем строку с XML;
3. Потом используем Ms.XMLDOM чтобы распарсить получившийся текст.

Типа 
Код

var xmlParser = new ActiveXObject("Microsoft.XMLDOM");
// и т.д.


Это сообщение отредактировал(а) WIPS - 17.6.2009, 17:48
--------------------
Автопроизводители, машины, марки, модели!
PM MAIL WWW ICQ Skype   Вверх
Onis
Дата 17.6.2009, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 241
Регистрация: 18.6.2005
Где: Украина, Николаев

Репутация: 2
Всего: 3



WIPS
Спасибо за идею, сегодня попробую и отпишусь.
PM MAIL   Вверх
Onis
  Дата 17.6.2009, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 241
Регистрация: 18.6.2005
Где: Украина, Николаев

Репутация: 2
Всего: 3



Извините за тупой вопрос но как содержимое фрейма заставить воспринимать как текст? Чтобы работать с ним регулярками. 
PM MAIL   Вверх
Ghirik
Дата 17.6.2009, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

На событие фрейма onload срабатывает метод 


раньше так былонеправильно. IE воспринимет нормально только событие онлоад загружаемого в фрейм документа. возможно от того неправильная трактовка формата файла.

http://forum.vingrad.ru/index.php?showtopi...t&p=1239869


--------------------
Отдадим всё клиенту, пускай его машина мучается...

PM MAIL   Вверх
Ghirik
Дата 17.6.2009, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

как содержимое фрейма заставить воспринимать как текст? Чтобы работать с ним регулярками.


Я уже больше года не занимаюсь javascript-ом, потому не очень помню. Сегодня случайно здесь попал. Вроде делали так responseText. Но умные люди говорили "Незя!", позже придут, расскажут... smile

 


--------------------
Отдадим всё клиенту, пускай его машина мучается...

PM MAIL   Вверх
WIPS
Дата 18.6.2009, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 22.5.2006
Где: Украина, Киев

Репутация: 2
Всего: 8



Цитата(Onis @  17.6.2009,  17:30 Найти цитируемый пост)
как содержимое фрейма заставить воспринимать как текст

3-и магических способа отсюда:
Код

var str1 = document.getElementById('frame_id').contentDocument.body.innerHTML + '';
var str2 = frame_id.document.body.innerHTML + '';
var str3 = frames['frame_name'].document.body.innerHTML + '';
// кавычки для надежности

--------------------
Автопроизводители, машины, марки, модели!
PM MAIL WWW ICQ Skype   Вверх
Onis
Дата 20.6.2009, 02:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 241
Регистрация: 18.6.2005
Где: Украина, Николаев

Репутация: 2
Всего: 3



Ух. Спасибо товарищи, я даже и не думал что смогу для IE исправить эту фичу.

Сделал вот такую вставку:
Код

if(MSIE)
{
    var tmpVar = frames[frameName].document.body.innerHTML.replace(/(<.*?>)|(&lt;\?.*?\?&gt;)|(&nbsp;)|(-)|(\s+)|(\n+)/g,"");
    var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
    xmlDoc.async = "false";
    xmlDoc.loadXML(tmpVar.replace(/(&gt;)/g,">").replace(/&lt;/g,"<"));
    return xmlDoc;
}

Еще раз спасибо, сам бы не додумался.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




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


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

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