Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как побороть BUG? (https://javascript.ru/forum/misc/2556-kak-poborot-bug.html)

gcolor 14.01.2009 22:28

Как побороть BUG?
 
Здраствуйте. Есть таблица. В какой-то момент времени все ее содержимое изменяеться через innerHTML. Тоисть я передаю такое значение:
<tr onclick='Go(this)'>
<td>some data</td><td>some data2</td>
</tr>
.............
<tr onclick='Go(this)'>
<td>some data150</td><td>some data200</td>
</tr>

Сама функция Go :
function Go(asder)
{
alert(asder.rowIndex);
}

Тоисть процедура показывает на какую строку мы нажали. В Firefox и Opera все работает коректо, а вот в Chrome и IE показывает -1.
Покопался в нете. Нашел вот : http://connect.microsoft.com/IE/feed...dbackID=371923 Вообщем БАГ. И будет исправлен только в 8 версии IE. Там пишут что такое происходит когда єлементы не присоеденны к document нормально. :)
Как можна изменить содержимое таблицы НОРМАЛЬНО?
Какие еще есть варианты узнать на какую строку нажал пользователь?

Андрей Параничев 14.01.2009 22:34

А на ячейку если поставить обработчик?

gcolor 14.01.2009 22:37

Мне надо именно на строку.

x-yuri 15.01.2009 04:56

не знаю, как вы меняете все содержимое таблицы
table.innerHTML = '<tr>...</tr>...<tr>...</tr>'

у меня не работает, да и не стоит так делать пожалуй
я написал table.outerHTML = '<table>...</table>' и у меня все корректно работает (в IE 7)
и тот баг-репорт с вашей проблемой не связан

Андрей Параничев 15.01.2009 17:23

gcolor,
Сорри, сначала не понял в чем проблема. Нормально работать с таблицей нужно используя методы insertRow и insertCell, innerHTML для таблиц использовать нельзя.

x-yuri 15.01.2009 17:36

но outerHTML можно

Kolyaj 15.01.2009 17:53

outerHTML работает только в ИЕ.

gcolor 15.01.2009 23:11

Так суть в том что я использую innerHTML и все у меня работает отлично только вот rowIndex глючит (в тех браузерах что я указал). Вставка происходит корректно, все что между <table></table> заменяеться на то что мне нужно. (Смотрел через Firebug). Использовать insertRow и другое не могу в силу специфики движка который пишу.

x-yuri 16.01.2009 00:22

про IE: innerHTML is read/write for all objects except the following, for which it is read-only: COL, COLGROUP, FRAMESET, HEAD, HTML, STYLE, TABLE, TBODY, TFOOT, THEAD, TITLE, TR.
другими словами innerHTML для записи в table использоваться нельзя

Цитата:

Так суть в том что я использую innerHTML и все у меня работает отлично только вот rowIndex глючит (в тех браузерах что я указал).
и как же ваше "работает отлично" соотносится с "rowIndex глючит"

Цитата:

Использовать insertRow и другое не могу в силу специфики движка который пишу.
чем ваш проект так специфичен, что в нем нельзя использовать insertRow?

gcolor 16.01.2009 01:06

В Firefox и Opera все работает коректно. Не работает в Chrome и IE.
Используеться AJAX. Клиент получает xml файл, где прописано какой єлемент ID надо изменить, и значение для изменения. Вот кусок функции
function ShowData(){ // розбираємо відповідь сервера
 for (i=0; i < xmlDOC.getElementsByTagName('response').length; i++){
       //-- получаємо значення CSS для об"єкта;
   var changeCSS=xmlDOC.getElementsByTagName("css")[i].childNodes[i].nodeValue;
      //-- получаємо ID яке потрібно змінити
   var changeID=xmlDOC.getElementsByTagName('changeid')[i].childNodes[i].nodeValue;
   //-- получаємо значення що потрібно зробити
    var methodID=xmlDOC.getElementsByTagName('methodid')[i].childNodes[i].nodeValue;
   //-- получаємо контент
    var content=xmlDOC.getElementsByTagName("maindata")[i].childNodes[i].nodeValue;
  }
    $(changeID).innerHTML=content;
//--- прикручуємо скрипти
var scripts = $(changeID).getElementsByTagName('script');
if (scripts.length > 0) {
                var l = 0;
                for (var i=0; i < scripts.length - l; i++) {
                    if (scripts[i].src) {
                        var newScr = document.createElement('script');
                        newScr.src = scripts[i].src;
                        $(changeID).appendChild(newScr);
                        l++;
                    } else {
                        var newScr = document.createElement('script');
                        newScr.text = scripts[i].text;
                        $(changeID).appendChild(newScr);
                        l++;
                    }
                }
            }


Часовой пояс GMT +3, время: 00:36.