Совместимость с IE7
Вложений: 1
Доброе утро всем.
Я продолжаю улучшать парсер логов SHOUTcast сервера. На этот раз я написал на JavaScript четыре функции, первые две из которых совсем примитивны (меняют ширину столбцов определённого класса в таблицах), а вторые две чуть похитрее. Вот исходный код: function groupSucc() { var tables = document.getElementsByTagName('table') for (var i = 0; i < tables.length; i++) { var ip = '' var from = 0 var merged = 1 var rows = tables[i].rows for (var j = 1; j < rows.length; j++) { if (rows[j].cells[0].innerHTML != ip) { ip = rows[j].cells[0].innerHTML from += merged merged = 1 } else { merged++ rows[from].cells[0].setAttribute('rowspan', merged) rows[from].cells[4].setAttribute('rowspan', merged) rows[j].deleteCell(0) rows[j].deleteCell(3) } } } } function ungroupSucc() { var tables = document.getElementsByTagName('table') for (var i = 0; i < tables.length; i++) { var from = 0 var merged = 1 var rows = tables[i].rows for (var j = 1; j < rows.length; j++) { if (merged > 1) { rows[j].insertCell(0) rows[j].insertCell(-1) rows[j].cells[0].innerHTML = rows[from].cells[0].innerHTML rows[j].cells[4].innerHTML = rows[from].cells[4].innerHTML rows[j].cells[4].setAttribute('align', 'right') merged-- if (merged == 1) { rows[from].cells[0].removeAttribute('rowspan') rows[from].cells[4].removeAttribute('rowspan') } continue; } if (rows[j].cells[0].hasAttribute('rowspan')) { from = j merged = parseInt(rows[j].cells[0].getAttribute('rowspan')) } } } При этом в Firefox и Opera всё работает на ура. Проблема в том, что в IE7, в отличие от Восьмого, не встроено нормальных средств отладки, и я, честно говоря, не понимаю, что он мне хочет сказать. Все использованные мной методы поддерживаются стандартами W3C, смотрел в сети. Он что, не соблюдает эти стандарты? Можно ли как-то "обхитрить" его? Вот ссылка на парсер: http://popov654.pp.ru/parser3 Лог-файл для анализа в аттаче (ZIP-архив) |
Я поясню немного, что делает этот код, чтобы Вам было легче его читать. Он объединяет в группу все строки, идущие подряд и при этом имеющие одинаковый IP в первой колонке. Он сливает их с помощью атрибута rowspan и удаления лишних ячеек.
Обратный процесс аналогичен: берём из rowspan размер группы, добавляем нужное количество ячеек (содержимое копируем из первой), и затем, когда счётчик станет равен единице, удаляем атрибут rowspan у первой. Что тут ему не нравится... :-/ |
Цитата:
|
Что не работает то? Запустилось без ошибок http://img854.imageshack.us/img854/3929/29335642.jpg правда с файлом меньшего объема.
|
Octane, а Вы разве не видите, что у Вас на скрине всё поехало на фиг после второго нажатия на флажок? :) Вот и у меня так же)
|
Цитата:
|
Кстати, там Notice вылез, т.к. была небольшая ошибка в PHP коде в оптимизационной части - исправил только что. Но сдвиг не из-за этого совсем происходит :)
|
Так что, никто не знает? Там похоже проблема не в том, что IE не поддерживает hasAttribute() и removeAttribute() (если верить таблице, поддерживал ещё с пятой версии). У меня таблица разваливается ещё на этапе ГРУППИРОВКИ (первая функция), там этих методов нет ещё! Правда, ошибка про неподдерживаемый метод вылазит при нажатии флажка уже во второй раз - но это и немудрено, потому что там уже DOM неправильный и во второй функции происходит чёрт-те что. Почему в FF и Opera всё группируется нормально? Где я налажал?
Добавлено спустя две минуты: Судя по внешнему виду руин таблицы, создаётся такое ощущение, что ячейки удалились, а атрибут rowspan проигнорирован... С чего бы вдруг |
Цитата:
Цитата:
|
Сорри, всё оказалось элементарно. Надо было просто отказаться от атрибутов и воспользоваться свойсвом rowSpan. Вот исправленный кроссбраузерный код:
function groupSucc() { var tables = document.getElementsByTagName('table') for (var i = 0; i < tables.length; i++) { var ip = '' var from = 0 var merged = 1 var rows = tables[i].rows for (var j = 1; j < rows.length; j++) { if (rows[j].cells[0].innerHTML != ip) { ip = rows[j].cells[0].innerHTML from += merged merged = 1 } else { merged++ rows[from].cells[0].rowSpan = merged rows[from].cells[4].rowSpan = merged rows[j].deleteCell(0) rows[j].deleteCell(3) } } } } function ungroupSucc() { var tables = document.getElementsByTagName('table') for (var i = 0; i < tables.length; i++) { var from = 0 var merged = 1 var rows = tables[i].rows for (var j = 1; j < rows.length; j++) { if (merged > 1) { rows[j].insertCell(0) rows[j].insertCell(-1) rows[j].cells[0].innerHTML = rows[from].cells[0].innerHTML rows[j].cells[4].innerHTML = rows[from].cells[4].innerHTML rows[j].cells[4].setAttribute('align', 'right') rows[j].cells[0].firstChild.href = '#' // Внимание! Если эту строку закомментировать merged-- if (merged == 1) { rows[from].cells[0].rowSpan = 1 rows[from].cells[4].rowSpan = 1 } continue; } if (rows[j].cells[0].rowSpan > 1) { from = j merged = parseInt(rows[j].cells[0].getAttribute('rowspan')) } } alert(tables[0].rows[2].cells[0].innerHTML); // то здесь выведет <a href="#" onclick="..."> alert(tables[0].rows[3].cells[0].innerHTML); // а здесь - <a href="http://popov654.pp.ru/parser/parser.php#" onclick="..."> В общем случае это не опасно, однако поскольку данный сценарий опирается на идентичность innerHTML ячеек первой колонки, это может привести к неприятным последствиям (а именно, при следующей группировке сгруппируется всё, кроме первых строчек, и получится дублирование первой строки) } Просьба обратить внимание на то, что, как отмечено в коде, IE изменяет атрибут ref ссылок при копировании. Для остальных браузеров эта строка не нужна. |
Часовой пояс GMT +3, время: 03:48. |