#javascript #html #internet-explorer #innerhtml
#javascript #HTML #internet-explorer #innerhtml
Вопрос:
Я хочу обновить содержимое TBODY (не всю ТАБЛИЦУ целиком, потому что в ней гораздо больше полумета-данных (LOL)). Я получаю > = 0 TR с сервера (XHR) и хочу увеличить их в существующей таблице. Новые TR должны перезаписывать существующее содержимое TBODY.
Я создал очень простой, статический пример на jsFiddle, который работает в Chrome и, вероятно, во всех остальных, за исключением IE (я использую Chrome только и тестирую в IE8).
В Chrome работает самая первая попытка: добавьте TR в TBODY. Нет проблем!
В IE этого не происходит… Я включил нерабочий пример того, что я имел в виду, чтобы заставить его работать.
Я уверен, что эта проблема не нова: как бы я вставил строку с TR в существующий TBODY?
PS. У jQuery нет проблем с этим!? Он используется здесь на SO. jQuery что-то делает с HTML, а затем вставляет его в виде HTML-узлов ..? Или что-то еще? Я не могу прочитать эту сумасшедшую библиотеку. Это происходит в этом файле (ищите "html: function("
. Вот где начинается волшебство.
У кого-нибудь есть функция или идея, чтобы это работало без библиотеки JS?
Ответ №1:
Вот хороший ресурс о проблемах innerHTML
и IE.
Суть в том, что свойство on tbody
innerHTML
доступно только для чтения.
Вот решение, представленное в одном из комментариев:
var innerHTML = "<tr><td>Hello world!</td></tr>";
var div = document.createElement("DIV");
div.innerHTML = "<table>" innerHTML "</table>";
// Get the tr from the table in the div
var trElem = div.getElementsByTagName("TR")[0];
Что касается части вопроса jQuery:
//inside the html() function:
// If using innerHTML throws an exception, use the fallback method
} catch(e) {
this.empty().append( value );
}
//inside the empty() function (basically removes all child nodes of the td):
while ( elem.firstChild ) {
elem.removeChild( elem.firstChild );
}
//append calls domManip applying this to all table rows:
if ( this.nodeType === 1 ) {
this.appendChild( elem );
}
//domManip as far as I can tell creates a fragment if possible and calls the three lines above with this=each row in turn, elem=the tbody(created if missing)
Комментарии:
1. Ага… Я пытаюсь сбросить TR в DIV. Не работает. Какого черта я не додумался поместить их в ТАБЛИЦУ?? ЛОЛ, я собираюсь попробовать это! редактировать Но что делает jQuery? jQuery не знает, что он к чему добавляет… Я знаю, что у меня есть TBODY и TR.
2. Идеально: jsfiddle.net/rudiedirkx/hZUkW Большое спасибо! (Хотя все еще любопытно, как jQ это делает …)
3. Что случилось с твоими дурацкими цитатами?
4. Извините за цитаты 🙂 скопируйте и вставьте из комментария, который я упомянул
5. Как создаются фрагменты в / by
domManip
? Вы можете вставить только (несколько!) TR находится в TBODY или ТАБЛИЦЕ (и даже не напрямую!)…value
In.append(value)
содержит несколько TR, поэтому это несколько узлов (но строка). Как эта строка становится фактическими объектами узла для добавления?? Я видел код jQ. Я все еще не понимаю =)
Ответ №2:
Используя обычный JavaScript, вы можете установить innerHTML
свойство соответствующего элемента. Текст, который вы задаете, может содержать сочетание HTML и text. Он будет проанализирован и добавлен в DOM.
Комментарии:
1. Недостаточно точно, моя ошибка.