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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как получить DOM element из строки 
V
    Опции темы
Lixil
Дата 8.1.2006, 14:35 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Кто - нибудь занет, как можно создать элемент из строки?

Проблема вот в чем: у меня есть таблица, я принимаю кусок html кода через XMLHttpRequest примерно такого содержания.
Код

<tr id="43" parnt="42">
<td>
blah blah blah
</td>
<td>
blah blah blah
</td>
</tr>

В виде строки!


мне его надо прицепить к таблице через insertBefore. Как это можно сделать? Создавать <tr>, править параметры и втыкать в него <td> через innerHTML не хочется.
Принимать XML тоже не получится, там у меня специфика своя smile .

Это сообщение отредактировал(а) Lixil - 8.1.2006, 14:36
  Вверх
Greendrake
Дата 8.1.2006, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 6



loadXML
http://msdn.microsoft.com/library/default....d2b692b0afc.asp

Потом, кажется, полученный DOM-элемент придётся клонировать, ибо чужеродные элементы неохотно инсертятся/аппендятся.

Цитата

Принимать XML тоже не получится, там у меня специфика своя smile .

А стоит ли эта специфика её использования, если она требует левое ухо чесать правой рукой? XMLHTTPRequest заточен именно под XML, responseText в него добавили как баловство, коим пользуютя не по назначению ИМХО.
PM MAIL   Вверх
Lixil
Дата 8.1.2006, 16:04 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











F
Цитата(Greendrake @ 8.1.2006, 14:57 Найти цитируемый пост)

loadXML

А есть что - нибудь кроссбраузерное? smile

Цитата(Greendrake @ 8.1.2006, 14:57 Найти цитируемый пост)

А стоит ли эта специфика её использования, если она требует левое ухо чесать правой рукой? XMLHTTPRequest заточен именно под XML, responseText в него добавили как баловство, коим пользуютя не по назначению ИМХО.

стОит! Иногда приходится и не такие костыли вставлять, чтобы все это везде заработало.
  Вверх
Greendrake
Дата 8.1.2006, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 6



Цитата
Цитата
loadXML
А есть что - нибудь кроссбраузерное? smile ... не такие костыли вставлять, чтобы все это везде заработало

Вообще-то, loadXML - это не выпендрон ИЕ, а стандартный метод от DOM W3C. И если браузер не поддерживает стандарты w3с, может ну его н.., этот браузер? Иначе где же предел до которого поддерживать кроссбраузерность? Почему бы под IE и Нетскейп 3-х версий не точить?
PM MAIL   Вверх
Lixil
Дата 8.1.2006, 16:45 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(Greendrake @ 8.1.2006, 16:29 Найти цитируемый пост)

Вообще-то, loadXML - это не выпендрон

ОК тогда как мне вызвать loadXML без IE шных выпендронов вроде
Код

ActiveXObject("Msxml2.DOMDocument.3.0");


Цитата(Greendrake @ 8.1.2006, 16:29 Найти цитируемый пост)

Иначе где же предел до которого поддерживать кроссбраузерность?

Для меня пока предел - последные версии Opera, IE и Mozilla smile . Но и здесь приходится выпендриваться smile .
  Вверх
Sardar
Дата 8.1.2006, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Цитата(Lixil @ 8.1.2006, 13:35 Найти цитируемый пост)
Создавать <tr>, править параметры и втыкать в него <td> через innerHTML не хочется.

Почему? Религия не позволяет? smile


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Lixil
Дата 8.1.2006, 17:31 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(Sardar @ 8.1.2006, 17:08 Найти цитируемый пост)

Создавать <tr>, править параметры и втыкать в него <td> через innerHTML не хочется.

Почему? Религия не позволяет? smile

только что в отчаянии попытался. Не вышло... Мозилла обрезает все td обрезает
  Вверх
Greendrake
Дата 8.1.2006, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 6



Хм, тока что выяснил что Мозилла вот просто так не позволит loadXML заюзать. У них свои метОды:

http://developer.mozilla.org/en/docs/Migra...ML_data_islands

Впрочем, в обоих случаях (и через loadXML и через мозилловский parseFromString) мы получаем объект типо DOM XML. Но аппендиться к имеющемуся HTML-дереву он не хочет!! smile Вот тут я пока сдаюсь.

Кстати, innerHTML вроде тока у дивов мона перезаписывать, то что ИЕ это позволяет делать для TR и TD - это вольности.
PM MAIL   Вверх
Sardar
Дата 9.1.2006, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Звиняюсь не проверил. Действительно tbody, tr, table имеют read-only свойство innerHTML, поэтому только insertRow() методом таблицу править и можно. Мозилла 1.5 кстати хавает такое:
Код
function bla() {
  var tab=document.getElementById('test');
  tab.tBodies[0].innerHTML+='<tr id="43" parnt="42"><td>blah blah blah</td>\
  <td>blah blah blah</td></tr>';
}

Xотя это не правильно.

Также возможен такой финт ушами:

Код
<table id="test" border="1">
</table>
<script type="text/javascript">
<!--
function toTable(tb, code) {
    //используем div и span, т.к. отстойный ИЕ не понимает custom элементов, по крайней
    //мере мой ИЕ6.0 SP2
    code=code.replace(/<(\/?)tr/g, '<$01div').replace(/<(\/?)td/g, '<$01span').replace(/\sid=/g, ' id_t=');
    var tab=document.createElement('div');
    tab.innerHTML=code;
    var rows=getDirectChilds(tab);
    for(var i=0; i<rows.length; i++) {
        var r=tb.insertRow(tb.rows.length);
        if(rows[i].getAttribute('id_t')) r.setAttribute('id', rows[i].getAttribute('id_t'));
        var cls=getDirectChilds(rows[i]); 
        for(var j=0; j<cls.length; j++) {
            var c=r.insertCell(r.cells.length);
            c.innerHTML=cls[j].innerHTML
            if(cls[j].getAttribute('id_t')) c.setAttribute('id', cls[j].getAttribute('id_t'));
        }    
    }
    return tb;
}

//вот одна из больших ошибок DOM дизайна от W3C, используя 
//getElementsByTagName нельзя искать в прямых потомках
//пишем своё
function getDirectChilds(obj) {
  var ret=[];
  for(var i=0; i<obj.childNodes.length; i++)
     if(obj.childNodes[i].nodeType==1) ret.push(obj.childNodes[i]);
  return ret;
}

function bla() {
  toTable(document.getElementById('test'), '<tr id="43" parnt="42"><td>blah blah blah</td><td>blah blah blah</td></tr>');
}
//-->
</script>
<button onclick="bla()">Test</button>

Работает в ИЕ и Мозилле, но не пашет в Опера8.5 (при чём никаких ошибок в консоли, просто молча всё игнорирует).

Вообще советую отдавать инфу не как HTML, а в виде JSON (JS массива/обьекта с инфой).


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


 




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


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

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