не понимаю cloneNode
Получаю xml через responseXML и хочу вставить и отобразить полученный кусок в имеющемся дереве.
Для этого делаю(как учат все учебники) var resp = xhr.responseXML var old = resp.getElementsByTagName('ul')[0]; var noviy = old.cloneNode(true); и вставляю в заданный li(вложенный спискок) document.getElementById('some id').appendChild(noviy) в результате вставлятся мешанина li не в виде списка а именно li следуют один за другим без переноса строки, и в firebug вствленный кусок структурно отображается правильно но блекло. Как корректно вставлять? И можно ли вообще просто получить кусок хмл и вставить иге в нужное место без создания элементов, создания всех их атрибутов и последующей, и только потом вставки? Спасибо. |
С сервера возвращаете обычный html, потом у нужного элемента
document.getElementById('someId').innerHTML = xhr.responseText; |
Не уверен, но по моему попытка вставить кусок XML в HTML обречена на неудачу.
попробуйте обернуть HTML внутри XML-а в блок CDATA, а потов вставлять с помощью innerHTML не уверен, что поможет, но попробовать стоит |
У меня аналогичная проблема. Аяксом получаю с сервера XML, в котором есть как бы HTML-разметка, которую нужно перенести на страницу. Например:
<answer> Ответ на вопрос смотрите <a href="">тут<a> </answer> Делаю cloneNode(true), все вставляется, но ссылки не работают, хотя в исходном коде они есть. Возможно, есть какое-то решение проблемы? |
Цитата:
Цитата:
|
Такое решение мне не подходит, поскольку xml строится с помощью xslt, а xsl:copy-of невозможно обернуть в cdata. Поэтому и спрашиваю, нет ли какого-то альтернативного варианта.
|
Цитата:
<!DOCTYPE html> <body> <div></div> <script> var text = '<root><a href="//google.com">Google</a></root>'; if (typeof DOMParser !== 'undefined') { parser = new DOMParser(); xmlDoc = parser.parseFromString(text, "application/xml"); } else { xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); xmlDoc.async = false; xmlDoc.loadXML(text); } var xmlNode = xmlDoc.documentElement.firstChild, htmlNode = document.body.children[0]; try { htmlNode.appendChild(xmlNode.cloneNode(true)); } catch (e) { alert(e.message); } </script> </body> Цитата:
Или проходить в цикле по ним и создавать и вставлять соответствующие им html-элементы. |
danik.js, спасибо за ответ. Решила-таки попробовать переписать все с использованием JSON вместо XML.
|
в ие xml и html - это два непересекающихся мира, так что по любому требуется промежуточная сериализация.
я беру xml накладываю xslt который преобразует xml в html с дополнительными преобразованиями и вставляю в документ |
Цитата:
воспользуйся например такой либой для xml: https://github.com/nin-jin/jin/blob/...v%3Dweb.jam.js при этом у тебя будут удобные селекты по xpath запросам, возможность преобразования в html без говнокода на js ну и в целом более практичный и расширяемый формат данных. |
Цитата:
Цитата:
|
> Так в любом браузере. Я тестовый скрипт привел выше.
ты забыл применить importNode когда добавлял узлы из одного документа в другой. в современных браузерах нет особой разницы между дом моделями XML и html. а вот в ие - это 2 различные хоть и похожие модели. > В каком плане? И по сравнению с чем? По сравнению с XML и CDATA секциями, содержащими html? зачем html пихать в сидату? html вполне органично вписывается в xml, в отличие от json и ему подобных |
Про importNode не знал. Тем не менее, при импорте узлы не "конвертируются". И узел <a> не становится инстансом HTMLAnchorElement.
<!DOCTYPE html> <body> <div></div> <script> var text = '<root><a href="//google.com">Google</a></root>'; if (typeof DOMParser !== 'undefined') { parser = new DOMParser(); xmlDoc = parser.parseFromString(text, "application/xml"); } else { xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); xmlDoc.async = false; xmlDoc.loadXML(text); } var xmlNode = xmlDoc.documentElement.firstChild, htmlNode = document.body.children[0]; try { htmlNode.appendChild(document.importNode(xmlNode, true)); } catch (e) { alert(e.message); } </script> </body> Цитата:
|
> И узел <a> не становится инстансом HTMLAnchorElement.
конечно, в xml неймспейс по умолчанию - пустая строка, а в хтмл - "http://www.w3.org/1999/xhtml") ну вот пример фильтрации вывода с использованием xslt http://habrahabr.ru/post/171557/ также можно нагенеренному пользователем контенту навешать своих классов и прочих прелестей |
Да чтож такое. Опять затупил ) И с firstChild тупанул ведь.
<!DOCTYPE html> <body> <div></div> <script> var text = '<root><a xmlns="http://www.w3.org/1999/xhtml" href="//google.com">Google</a></root>'; if (typeof DOMParser !== 'undefined') { parser = new DOMParser(); xmlDoc = parser.parseFromString(text, "application/xml"); } else { xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); xmlDoc.async = false; xmlDoc.loadXML(text); } var xmlNode = xmlDoc.documentElement.firstChild, htmlNode = document.body.children[0]; try { htmlNode.appendChild(document.importNode(xmlNode, true)); } catch (e) { alert(e.message); } </script> </body> |
Ссылки заработали после добавления пространства имен:)
Но остался еще один неприятный глюк - ссылки "выделяются" переходом на новую строку, в исходном коде вот такое: <p>"Если вы хотите приобрети продукт, приходите в любой" <a xmlns="http://www.w3.org/1999/xhtml" href="...">офис </a> "или" <a xmlns="http://www.w3.org/1999/xhtml" href="">салоны наших дилеров</a> "."<br></br><br></br> Не забудьте, что для совершения покупки ...</p> Т.е. ссылка переходит на новую строчку и после нее тоже переход на новую строку. var answer = curTheme.getElementsByTagName('question')[j].childNodes[1].cloneNode(true); var ans = document.createElement('p'); // ans.innerHTML = answer; ans.appendChild(answer); el('questions_insert').appendChild(ans); При этом в ИЕ работает только вариант с innerHTML... Честно говоря, после двух дней всевозможных попыток и изучения тонны информации голова идет кругом, так что любое вправление мозгов всячески приветствуется:) |
Цитата:
Цитата:
|
Я имею в виду в коде того, что было добавлено динамически.
Да, для восьмерки я нашла костыль. Но проблема не в ИЕ, а в непонятных переносах строки:( |
А кавычки вас значит не смущают? Нет никаких переносов. И кавычек нет:-)
|
Переносы есть уже визуальные, на странице.
|
Цитата:
|
Переносы получаются там, где ссылка. Я создаю элемент р, в него добавляю из хмл что-нибудь вроде "текст текст <a> ссылка</а> текст", и ссылка переносится на новую строку. И текст после нее тоже.
|
Тоесть вставляются теги <br> ? Или у вас у элемента выставлено white-space: pre-wrap?
|
Нет, теги не вставляются (те, что были в примере выше, присутствовали в самом xml). White-space не задан...
|
Ну, так в чем же тогда проблема?
|
Вот в таком отображении:
Код внутри xml-ноды такой: <p>Если вы хотите приобрети, приходите в любой <a href= "">офис</a> или <a href= "">салоны наших дилеров</a>.<br /> <br /> Не забудьте, что для совершения покупки нового номера при себе необходимо иметь паспорт и второй документ на выбор.</p> |
Нет никаких переносов.
<!DOCTYPE html> <body> <div></div> <script> var text = '<root><p xmlns="http://www.w3.org/1999/xhtml">Если вы хотите приобрети, приходите в любой <a xmlns="http://www.w3.org/1999/xhtml" href= "">офис</a> или <a xmlns="http://www.w3.org/1999/xhtml" href= "">салоны наших дилеров</a>.<br xmlns="http://www.w3.org/1999/xhtml" /> <br xmlns="http://www.w3.org/1999/xhtml" /> Не забудьте, что для совершения покупки нового номера при себе необходимо иметь паспорт и второй документ на выбор.</p></root>'; if (typeof DOMParser !== 'undefined') { parser = new DOMParser(); xmlDoc = parser.parseFromString(text, "application/xml"); } else { xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); xmlDoc.async = false; xmlDoc.loadXML(text); } var xmlNode = xmlDoc.documentElement.firstChild, htmlNode = document.body.children[0]; try { htmlNode.appendChild(document.importNode(xmlNode, true)); } catch (e) { alert(e.message); } </script> </body> |
У меня был приступ острого тупизма:( Проблема оказалась в стилях для ссылок внутри блока, в который они вставлялись... Теперь все нормально.
danik.js, спасибо за терпение:) |
Часовой пояс GMT +3, время: 20:53. |