Opera, undefined/null object
От: ShaggyOwl Россия http://www.rsdn.org
Дата: 14.02.08 08:22
Оценка:
Привет!

Есть скрипт оббегающий DOM-дерево для поиска элементов определенного класса. В IE и лисе все работает как часы. В опере (Win, 9.25) на выделенной строчке (код ниже) происходит ошибка. Эксперимент показывает, что в цикле успешно проходятся DOM-элементы head, включая script, после чего появляется некий undefined object (это не ie-specific строка с pngfix.js, проверял) и скрипт прерывается.
Вопросы.
1. Что это за undefined/null object?
2. Как определить условие, чтобы пропускать такие объекты?

Ниже текст ошибки и html-код.

Error:
name: TypeError
message: Statement on line 104: Could not convert undefined or null to object
...
if (all[e].className.search(className) != — 1)
...

(Это нормально, что консоль ошибок дает неправильные номера строк или где-то опции подкрутить можно?)

Спасибо.

PS JavaScript знаю полчаса, так что просьба сильно не пинать
PSS Код, безусловно будет переписан и дерево не будет оббегаться целиком, но с ошибкой необходимо разобраться.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
    <link rel="stylesheet" type="text/css" href="./base.css" media="all" />
    <link rel="stylesheet" type="text/css" href="./request.css" media="all" />

    <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />

    <title></title>

    <script type="text/javascript">
    
    function getElementsByStyleClass (className) 
    {
        var all = document.all ? document.all : document.getElementsByTagName('*');
        var elements = new Array();
        for (var e = 0; e < all.length; e++)
        {
            //alert( all[e].tagName );
            //alert( all[e].innerHTML );
            if ( all[e].className.search(className) != -1 ) // == className
                elements[elements.length] = all[e];
        }
        return elements;
    }

    function f( checked )
    {
        var classes = new Array(....);
        for ( var c = 0; c < classes.length; c++ )
        {
            var es = getElementsByStyleClass(classes[c]);
            ....
        }

    }
    </script>
    <!--[if lt IE 7.]><script defer type="text/javascript" src="./js/pngfix.js"></script><![endif]-->
</head>
<body id="">
</body>
</html>
Хорошо там, где мы есть! :)
Re: Opera, undefined/null object
От: Fenrir  
Дата: 15.02.08 09:32
Оценка: 7 (1)

SO>Error:
SO>name: TypeError
SO>message: Statement on line 104: Could not convert undefined or null to object
SO>...
SO> if (all[e].className.search(className) != — 1)
SO>...


А если просто проверять наличие className перед поиском класса?
if (all[e].className && all[e].className.search(className) != -1)


P.S. Неверные номера строк — это вообще общее место. Если кто подскажет способы борьбы...
Re[2]: Opera, undefined/null object
От: ShaggyOwl Россия http://www.rsdn.org
Дата: 15.02.08 09:35
Оценка:
Здравствуйте, Fenrir, Вы писали:

F>А если просто проверять наличие className перед поиском класса?

F>
F>if (all[e].className && all[e].className.search(className) != -1)
F>


Да, вариант. И еще по-хорошему, стоит посмотреть тип этого элемента.
Хорошо там, где мы есть! :)
Re[3]: Opera, undefined/null object
От: Fenrir  
Дата: 15.02.08 11:03
Оценка:
Здравствуйте, ShaggyOwl, Вы писали:

SO>Здравствуйте, Fenrir, Вы писали:


F>>А если просто проверять наличие className перед поиском класса?

F>>if (all[e].className && all[e].className.search(className) != -1)
F>>


SO>Да, вариант. И еще по-хорошему, стоит посмотреть тип этого элемента.


Это уже совсем по хорошему В принципе, если у элемента неподходящий тип, className просто будет undefined (что уже проверяется). Могу ошибаться...
Re[2]: Opera, undefined/null object
От: Mamut Швеция http://dmitriid.com
Дата: 16.02.08 17:32
Оценка:
F>P.S. Неверные номера строк — это вообще общее место. Если кто подскажет способы борьбы...

только Firefox+Firebug


dmitriid.comGitHubLinkedIn
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.