Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > setAttribute в IE6.


Автор: diam 1.6.2005, 08:00
Добрый день! (утро, вечер, ночь).

При написании адресной книги столкнулся с проблемой - IE не устанавливает у строки атрибут ID. То есть, не ругается, не выдаёт ошибок - просто не устанавливает.
Вот код:
Код

// search - id таблицы
var tablesearch = document.getElementById("search");

var tr;
if (document.all ) tr = document.createElement("TR");
else tr = tablesearch.insertRow(tablesearch.rows.length);

tr.setAttribute("id", "trlastcr");

if ( document.all )
    tablesearch.appendChild(tr.appendChild(document.createElement("TD").appendChild(document.createTextNode("Текст в ячейке"))));
else
    tr.insertCell(tr.cells.length).appendChild(document.createTextNode("Текст в ячейке"));


То есть, он добавляет строку, добавляет ячейку - а атрибут "id" устанавливать не хочет.

Где грабли?

Автор: Black 1.6.2005, 08:42
А так:

Код

// search - id таблицы
var tablesearch = document.getElementById("search");
var tr;
if (document.all ) tr = document.createElement("TR");
else tr = tablesearch.insertRow(tablesearch.rows.length);
tr.id = "trlastcr";

if ( document.all )
    tablesearch.appendChild(tr.appendChild(document.createElement("TD").appendChild(document.createTextNode("Текст в ячейке"))));
else
    tr.insertCell(tr.cells.length).appendChild(document.createTextNode("Текст в ячейке"));


В данном случае можно обойтись без setAttribute.

Автор: diam 1.6.2005, 08:55
PHP-DIRECTOR, нет, не работает.
Если потом попробовать
Код

alert(document.getElementById("trlastcr");

IE выведет null.

Автор: Black 1.6.2005, 09:00
diam
ну дык я не знаю как вы там делаете, но это дело надо вешать на событие onload, т.е. так:

Код

<html>
<head>
<script>
function cool(){
// search - id таблицы
var tablesearch = document.getElementById("search");
var tr;
if (document.all ) tr = document.createElement("TR");
else tr = tablesearch.insertRow(tablesearch.rows.length);
tr.id = "trlastcr";
if ( document.all )
    tablesearch.appendChild(tr.appendChild(document.createElement("TD").appendChild(document.createTextNode("Текст в ячейке"))));
else
    tr.insertCell(tr.cells.length).appendChild(document.createTextNode("Текст в ячейке"));
}
</script>
</head>

<body onload='cool()'>
ля-ля я нашел в саду кота
</body>
</html>


Поэтому и выводит нулл так как объекты еще не созданы, а мы уже к ним обращаемся :-) а вот после загрузки их создадут и тогда ОК.

Автор: diam 1.6.2005, 09:16
Хорошо.
Приведу полный код.
Код

<html>
<head>
<meta http-equiv="Content-Script-Type" content="text/javascript">
<script>
function f2 () {
  var tablesearch = document.getElementById("search");
  var tr;
  if ( document.all ) {
    tr = document.createElement("TR");
    tr.id = "trlastcr";     tablesearch.appendChild(tr.appendChild(document.createElement("TD").appendChild(document.createTextNode("Текст в ячейке"))));
  }
  else {
    tr = tablesearch.insertRow(tablesearch.rows.length);
    tr.setAttribute('id', 'trlastcr');
    tr.insertCell(tr.cells.length).appendChild(document.createTextNode("Текст в ячейке"));
  }
}
</script>
</head>
<body onLoad='f2(); alert(document.getElementById("trlastcr"));'>
<table id="tablesearch"></table>
<!--
После загрузки этого документа во всех браузерах, кроме ие, мы увидим что-то вроде
object htmlTableRowElement
Но только не в IE.
-->
</body>
</html>

Поэтому, php-director, теория интересна - но не верна. Ех...

Автор: Aliance 1.6.2005, 13:07
diam
поидеи, алертить нужно после исполнения кода. Используй задержку - setTimeout()

Автор: diam 1.6.2005, 13:54
Aliance, alert - просто что-бы показать, что не работает setAttribute на элементах TR (возможно, не только TR) в IE. Можно проверить не только alert'ом, но и другими способами.
JavaScript - скриптовый язык изначально, имплементируется как последовательность комманд. Поэтому на результат кода можно посмотреть сразу за его исполнением. Во всех остальных браузерах, кроме IE, работает отлично.

Автор: diam 1.6.2005, 15:24
А теперь самое смешное.
Если сделать так:
Код

<table><tr id="trx2"><td>Пробная ячейка в строке trx2</td></tr></table>
<script>
var trx = document.createElementById("trx2");
trx.setAttribute("id", "newtrx");
alert(trx.getAttribute("id"));
</script>

На экран радостно выскочит newtrx. То есть, если в IE и в Опере (блин, в ней тоже надо) ввести строку заранее и прописать в ней id="xxx" (тоже заранее), то потом это значение можно изменять!!!


 ! 
 
Весь оффтоп вырезан.

Автор: Sardar 1.6.2005, 19:21
diam зачем выделять ИЕ, зачем скармливать ему DOM, вместo HTML DOM1... ? И вообще убери кучу ошибок в именах и идентификаторах smile

Код
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<head>
<script type="text/javascript">
function f2 () {
  var tablesearch = document.getElementById("tablesearch");
  
  var tr = tablesearch.insertRow(tablesearch.rows.length);
  tr.setAttribute("id", "trlastcr");
  tr.insertCell(tr.cells.length).appendChild(document.createTextNode("Текст в ячейке"));
}
</script>
</head>
<body onLoad='f2(); alert(document.getElementById("trlastcr"));'>
<table id="tablesearch"></table>
<!--
После загрузки этого документа во всех браузерах, кроме ие, мы увидим что-то вроде
object htmlTableRowElement
Но только не в IE. (и вот тут мы ошиблись =) )
-->
</body>
</html>

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)