Javascript: ошибка «Требуется объект». Я не могу расшифровать это. Ты можешь? - PullRequest
2 голосов
/ 26 февраля 2009

Я использую javascript под названием «Facelift 1.2» на одном из моих веб-сайтов, и хотя скрипт работает в Safari 3, 4b и Opera, OmniWeb и Firefox, он не работает ни в одной версии IE. Но даже в рабочем браузере я получаю следующую ошибку, которую не могу расшифровать.

Может быть, в свое время - с большим опытом работы с Javascript - я смогу, но сейчас я подумал, что спрошу некоторых из вас здесь, в SO.

Ниже приведено всплывающее сообщение об ошибке, которое я получаю в IETester, тестирующем страницу для Interet Explorer 6,7 и 8: IE Error Pop Up

Следующее из консоли Firebug в Firefox 3.0.6: Firebug Console Log

Веб-сайт: http://www.457cc.co.nz/index.php Если это поможет вам увидеть проблему, упомянутую в действии.

Я также посмотрел, что соответствует строке 620: «строка 76»:

this.isCraptastic = (typeof document.body.style.maxHeight=='undefined');

, который является частью этого блока кода (взят из flir.js):

// either (options Object, fstyle FLIRStyle Object) or (fstyle FLIRStyle Object)
,init: function(options, fstyle) { // or options for flir style
    if(this.isFStyle(options)) { // (fstyle FLIRStyle Object)
        this.defaultStyle = options;
    }else { // [options Object, fstyle FLIRStyle Object]
        if(typeof options != 'undefined')
            this.loadOptions(options);

        if(typeof fstyle == 'undefined') {
            this.defaultStyle = new FLIRStyle();
        }else {
            if(this.isFStyle(fstyle))
                this.defaultStyle = fstyle;
            else
                this.defaultStyle = new FLIRStyle(fstyle);
        }
    }

    this.calcDPI();

    if(this.options.findEmbededFonts)
        this.discoverEmbededFonts();

    this.isIE = (navigator.userAgent.toLowerCase().indexOf('msie')>-1 && navigator.userAgent.toLowerCase().indexOf('opera')<0);
    this.isCraptastic = (typeof document.body.style.maxHeight=='undefined');

    if(this.isIE) {
        this.flirIERepObj = [];
        this.flirIEHovEls = [];
        this.flirIEHovStyles = [];    
    }
}

Весь скрипт также доступен на моем сервере: http://www.457cc.co.nz/facelift-1.2/flir.js

Я просто не знаю, с чего начать поиск ошибки, тем более что она влияет только на IE, но работает в остальном. Может быть, у вас, ребята, есть идея. Я хотел бы услышать их.

Спасибо за чтение. Jannis

PS: консоль Opera сообщает об этом:

JavaScript - http://www.457cc.co.nz/index.php
Inline script thread
Error:
name: TypeError
message: Statement on line 620: Cannot convert undefined or null to Object
Backtrace:
  Line 620 of linked script http://www.457cc.co.nz/facelift-1.2/flir.js
                    document.body.appendChild(test);
  Line 70 of linked script http://www.457cc.co.nz/facelift-1.2/flir.js
            this.calcDPI();
  Line 2 of inline#1 script in http://www.457cc.co.nz/index.php
            FLIR.init();
stacktrace: n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace'

Ответы [ 3 ]

7 голосов
/ 27 февраля 2009

Я согласен с tvanfosson - причина, по которой вы получаете эту ошибку, весьма вероятна, потому что вы звоните init() до завершения загрузки страницы, поэтому document.body еще не определено.

На странице, на которую вы ссылаетесь, вы должны переместить следующий код в конец страницы (непосредственно перед закрывающим тегом html:

<script type="text/javascript">
    FLIR.init({ path: 'http://www.457cc.co.nz/facelift-1.2/' });
    FLIR.auto();
</script>

Еще лучше, вы должны прикрепить инициализацию к событию ready документа. Если вы делаете это таким образом, нет необходимости даже перемещать ваш JavaScript в конец файла. Использование jquery:

$(document).ready( function(){
    FLIR.init({ path: 'http://www.457cc.co.nz/facelift-1.2/' });
    FLIR.auto();
});

Подробнее о событии document.ready в jquery "

0 голосов
/ 18 апреля 2009

Установите .net Framework v2 и решите проблему.

0 голосов
/ 27 февраля 2009

Редактировать Ответ оставлен для контекста. См. Ответ @ Триптиха (принято) для правильного разрешения.

Я предлагаю перенести включение javascript в конец вашей разметки. Я думаю, что происходит то, что код выполняется до полной загрузки DOM, и поэтому document.body имеет значение null, когда вы пытаетесь сослаться на него при определении свойства стиля maxHeight. Перемещение включения javascript в конец разметки должно быть достаточным, чтобы гарантировать, что тело документа загружено по крайней мере, и избежать этой конкретной ошибки.

 ... rest of html....

    <script type='text/javascript'
            src='http://www.457cc.co.nz/facelift/flir.js'>
    </script>
 </body>
 </html>
...