Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.08.2011, 08:36
Профессор
Отправить личное сообщение для popov654 Посмотреть профиль Найти все сообщения от popov654
 
Регистрация: 22.09.2010
Сообщений: 217

Совместимость с IE7
Доброе утро всем.
Я продолжаю улучшать парсер логов 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-архив)
Вложения:
Тип файла: zip sc_serv.zip (624.7 Кб, 3 просмотров)
Ответить с цитированием
  #2 (permalink)  
Старый 20.08.2011, 08:41
Профессор
Отправить личное сообщение для popov654 Посмотреть профиль Найти все сообщения от popov654
 
Регистрация: 22.09.2010
Сообщений: 217

Я поясню немного, что делает этот код, чтобы Вам было легче его читать. Он объединяет в группу все строки, идущие подряд и при этом имеющие одинаковый IP в первой колонке. Он сливает их с помощью атрибута rowspan и удаления лишних ячеек.
Обратный процесс аналогичен: берём из rowspan размер группы, добавляем нужное количество ячеек (содержимое копируем из первой), и затем, когда счётчик станет равен единице, удаляем атрибут rowspan у первой. Что тут ему не нравится...
Ответить с цитированием
  #3 (permalink)  
Старый 20.08.2011, 10:27
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

Сообщение от popov654
Все использованные мной методы поддерживаются стандартами W3C, смотрел в сети. Он что, не соблюдает эти стандарты?
Не только не соблюдает ,но ещё использует не JS а JScript
Ответить с цитированием
  #4 (permalink)  
Старый 20.08.2011, 10:29
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Что не работает то? Запустилось без ошибок http://img854.imageshack.us/img854/3929/29335642.jpg правда с файлом меньшего объема.
Ответить с цитированием
  #5 (permalink)  
Старый 20.08.2011, 10:32
Профессор
Отправить личное сообщение для popov654 Посмотреть профиль Найти все сообщения от popov654
 
Регистрация: 22.09.2010
Сообщений: 217

Octane, а Вы разве не видите, что у Вас на скрине всё поехало на фиг после второго нажатия на флажок? Вот и у меня так же)
Ответить с цитированием
  #6 (permalink)  
Старый 20.08.2011, 10:34
Профессор
Отправить личное сообщение для popov654 Посмотреть профиль Найти все сообщения от popov654
 
Регистрация: 22.09.2010
Сообщений: 217

Сообщение от dmitriymar Посмотреть сообщение
Не только не соблюдает ,но ещё использует не JS а JScript
Ну они вроде мало чем отличаются... насколько я слышал. А как выкрутиться? Он, как я понял, не знает некоторых методов (к сожалению, каких именно - не очевидно). Надо видимо найти аналог для IE
Ответить с цитированием
  #7 (permalink)  
Старый 20.08.2011, 10:43
Профессор
Отправить личное сообщение для popov654 Посмотреть профиль Найти все сообщения от popov654
 
Регистрация: 22.09.2010
Сообщений: 217

Кстати, там Notice вылез, т.к. была небольшая ошибка в PHP коде в оптимизационной части - исправил только что. Но сдвиг не из-за этого совсем происходит
Ответить с цитированием
  #8 (permalink)  
Старый 20.08.2011, 15:21
Профессор
Отправить личное сообщение для popov654 Посмотреть профиль Найти все сообщения от popov654
 
Регистрация: 22.09.2010
Сообщений: 217

Так что, никто не знает? Там похоже проблема не в том, что IE не поддерживает hasAttribute() и removeAttribute() (если верить таблице, поддерживал ещё с пятой версии). У меня таблица разваливается ещё на этапе ГРУППИРОВКИ (первая функция), там этих методов нет ещё! Правда, ошибка про неподдерживаемый метод вылазит при нажатии флажка уже во второй раз - но это и немудрено, потому что там уже DOM неправильный и во второй функции происходит чёрт-те что. Почему в FF и Opera всё группируется нормально? Где я налажал?

Добавлено спустя две минуты:
Судя по внешнему виду руин таблицы, создаётся такое ощущение, что ячейки удалились, а атрибут rowspan проигнорирован... С чего бы вдруг

Последний раз редактировалось popov654, 20.08.2011 в 15:25.
Ответить с цитированием
  #9 (permalink)  
Старый 20.08.2011, 15:29
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Сообщение от popov654
Так что, никто не знает?
лень разбираться

Сообщение от popov654
IE не поддерживает hasAttribute() и removeAttribute()
hasAttribute нет в IE<9
Ответить с цитированием
  #10 (permalink)  
Старый 20.08.2011, 16:12
Профессор
Отправить личное сообщение для popov654 Посмотреть профиль Найти все сообщения от popov654
 
Регистрация: 22.09.2010
Сообщений: 217

Сорри, всё оказалось элементарно. Надо было просто отказаться от атрибутов и воспользоваться свойсвом 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 ссылок при копировании. Для остальных браузеров эта строка не нужна.

Последний раз редактировалось popov654, 20.08.2011 в 18:14. Причина: Написал чушь
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Картинки-ссылки в меню не работают в IE7 Александр345 Internet Explorer 6 16.06.2011 18:33
Js + Ie7 проблема onuvidelsolnce Internet Explorer 4 28.03.2011 20:21
Взаимодействие фреймов. IE7 Svarog81 Internet Explorer 1 03.03.2011 13:08
слетает верстка в IE6 и IE7 (js используется) rognarek Internet Explorer 3 08.09.2010 19:34
Тормозит подсветка td в IE7 Beck Events/DOM/Window 7 25.04.2010 21:45