Отладка IE8 Javascript Заменить innerHTML Runtime Error

17
function DeleteData(ID)
{
 var ctrlId=ID.id;

 var divcontents=document.getElementById(ctrlId).innerHTML;
 var tabid=ctrlId.replace(/div/,'tab');
 var tabcontents=document.getElementById(tabid).innerHTML;
 alert(document.getElementById(tabid).innerHTML);
 document.getElementById(tabid).innerHTML="<TBody><tr><td></td></tr><tr><td></td></tr><tr><td></td></tr></TBody>";
 document.getElementById(ctrlId).innerHTML='';

}

Я пытаюсь заменить таблицу пустой таблицей, но

document.getElementById(tabid).innerHTML="<TBody><tr><td></td></tr><tr><td></td></tr><tr><td></td></tr></TBody>";

эта строка вызывает Unknown Runtime Error

    
задан thejartender 17.02.2009 в 09:42
источник

10 ответов

15

Вы не можете установить значение в innerHTML таблицы, вы должны получить доступ к дочерним ячейкам или строкам и изменить их следующим образом:

document.getElementById(tabid).rows[0].cells.innerHTML = 'blah blah';

Для получения дополнительной информации / примера: Таблица, TableHeader, TableRow, Объекты TableData

    
ответ дан Canavar 17.02.2009 в 10:02
источник
  • на самом деле, в IE8 это document.getElementById (tabid) .rows [0] .cells [0] .innerHTML = 'blah blah'; –  Stefan Steiger 13.01.2010 в 04:19
  • что, если я хочу изменить структуру таблицы, я имею в виду сделать 3 строки из 4 строки в событии с помощью js. –  Saif 28.01.2015 в 08:06
13

В IE8 вы не можете изменить innerHTML объекта, когда код, который пытается запустить его из объекта.

Например:

<span id='n1'>
  <input type=button value='test' onclick='DoSomething(this);'>
</span>

со следующим кодом, заправленным в какой-то отдаленный угол документа:

<script type='text/javascript'>
  function DoSomething(element)
  {
    document.getElementById("n1").innerHTML = "This is a test"
  }
</script>

Это приведет к ошибке с ошибкой неизвестной ошибки выполнения. Я считаю, что это связано с тем, что вы пытаетесь заменить код HTML, который произвел текущую строку исполнения. Событие onclick является частью кода, заменяемого функцией DoSomething. IE8 не нравится.

Я решил проблему, установив событие таймера на 250 миллисекунд, так что функция, вызванная в конце 250 миллисекунд, заменяет внутренний HTTML диапазона.

    
ответ дан Paul 03.11.2010 в 04:42
источник
  • bah, почему я беспокоюсь. Чертова доска съела половину моего примера. –  Paul 03.11.2010 в 04:44
  • все еще хороший момент! –  frequent 26.10.2012 в 11:53
8

Я узнаю, что в IE8 некоторые элементы находятся в readonly: COL, COLGROUP, FRAMESET, HEAD, HTML, STYLE, TABLE, TBODY, TFOOT, THEAD, TITLE, TR.

Поэтому, если вы попытаетесь установить innerHTML для этих элементов, IE8 уведомляет об изменениях с Неизвестной ошибкой выполнения.

Подробнее здесь: Ссылка .

Самый простой способ - преобразовать элементы только для чтения в элемент div.

    
ответ дан Giulio Roggero 09.02.2011 в 11:06
источник
  • Как минимум, с IE8 + элементом title вы можете сделать: document.getElementsByTagName ('title') [0] .text = 'My Title'; –  Andrew Childs 18.01.2012 в 22:47
  • @Andrew решила мою проблему с помощью <script> в другом фрейме Теги –  user123444555621 21.06.2013 в 18:11
  • Элементы легенды также доступны только для чтения. Спасибо, что опубликовали это, спасли меня! –  Dave DeHaan 15.01.2014 в 19:52
3

У меня была такая же проблема, но моя ошибка состояла в том, что я вставлял тэг p непосредственно под элементом p , как в:

document.getElementById('p-element').innerHTML = '<p>some description</p>';

Я действительно не вижу, как это ошибка формата HTML; похоже больше на другую ошибку IE8.

    
ответ дан Boubacar 08.12.2010 в 22:22
источник
  • <p> не должны быть вложенными, это в спецификации HTML. Довольно ненужно для IE8 блокировать это, хотя! –  Fiona - myaccessible.website 19.04.2013 в 12:02
  • Получил ту же проблему с тегом p. Изменено это для div, и все работает нормально. –  Matthias Kleine 24.09.2015 в 13:34
2

Отлично, у меня была такая же ситуация с установкой innerHTML . Когда я прочитал это, я понял, что одним из элементов является TR , а один из них - TD , и TD работает.

Изменение кода так, что оба TD s исправляет его, что означает, что это довольно неочевидная проблема, вызванная структурой таблиц.

Предположительно, он вызывает ошибку DOM, когда я начинаю изменять таблицы строк, так как он больше не может хранить таблицу как массив.

Я уверен, что IE может дать более информативное сообщение об ошибке, так как не может быть так необычно, что DOM меняется на лету, и кажется странным, что это вызовет ошибку только для таблиц.

    
ответ дан Theo 23.11.2010 в 23:53
источник
1

О, да, помните, что структура HTML должна быть действительной.

Я попытался загрузить целую страницу в тэг <p> - он не прошел (очевидно), изменив его на тэг <div> , решил мою проблему!

Так что запомните структуру HTML!

    
ответ дан aliceraunsbaek 07.01.2011 в 15:29
источник
0

почему это произошло в IE ...

сценарий:

Неизвестная ошибка времени Javascript в IE при доступе к Div внутри Div для добавления содержимого ajax.

решение:

Никогда не помещайте вложенные divs между тегами формы, чтобы играть с ними. ..:)

    
ответ дан musmanjaved 12.02.2011 в 00:20
источник
0

При использовании YUI попытайтесь использовать

Y.one('#'+data.id).setContent(html); 

вместо:

Y.one('#'+data.id).set('innerHTML' , html);
    
ответ дан Joris Kok 09.02.2012 в 16:48
источник
0

Если вам нужно установить innerHTML в "" (пустая строка), вы можете использовать removeChild вместо

    
ответ дан Fulg 01.07.2013 в 18:27
источник
-1

Это не большая проблема, так как я столкнулся с такой же проблемой несколько дней назад и причина этой ошибки происходит в том, что есть: - существует ошибка в нашем html-формате или вы используете элемент, отличный от <td> , чтобы заменить innerHTML, т. е. использовать только, не использовать таблицы, divs для замены innerHTML.

  • SwapnilK
ответ дан Swapnil 22.06.2009 в 20:51
источник