Ошибка JavaScript в IE7 и IE8: SCRIPT5007: невозможно получить значение свойства 'newQuestion': объект является нулевым или неопределенным - PullRequest
2 голосов
/ 17 января 2012

Я искал повсюду и не могу найти решение.Следующий код прекрасно работает в IE9, Chrome, FF и Safari.Однако, когда вы нажимаете «Пуск» в IE7 или IE8, вы получаете следующую ошибку:

SCRIPT5007: Unable to get the value of property 'newQuestion': object is null or undefined

Код здесь:

//This is used to reduce some code size and not type document.getElementById(a) each time
function DOMelem(a) {
    return document.getElementById(a);
}
//This is used to round numbers
function roundTo(a,b) {
    a=a*Math.pow(10,b);
    a=Math.round(a);
    a=a/Math.pow(10,b);
    return a;
}
//The quiz object
function sQuiz(a,c,init) {
    //This part is used to get the variable used by the user
    this.getName=function() {
        for(var v in window) {
            if(window[v] instanceof sQuiz) {
                this.varName=v;
            }
        }   
    },
    //This will create the first page of the quiz
    this.createQuiz=function() {
        this.getName();
        DOMelem(a).innerHTML="<h1>"+init.intro.qTitle+"</h1>";
        DOMelem(a).innerHTML+="<h2>"+init.intro.qAuthor+"</h2>";
        DOMelem(a).innerHTML+="<h3>"+init.intro.qComments+"</h3><br /><br />";
        DOMelem(a).innerHTML+="<input type='button' value='Start' onClick='"+this.varName+".newQuestion(0)'>";
    },
    //This one will create a random id for the quiz and create a bar for it
    this.createBar=function() {
        id="12391023103091"+Math.round(Math.random()*12391023103091);
        id=id.substr(id.length-14,14);
        this.randBarId=id;
        DOMelem(c).innerHTML="<div class='progress_full' id='pro_"+id+"'><div class='progress_bar' style='width:0%;' id='bar_"+id+"'></div></div>";
    },
    //In this section we check to see if there's a bar, if we must show the results or just show the interface.
    this.newQuestion=function(index) {
        //Create the bar if it does not exist
        if(!DOMelem("pro_"+this.randBarId)||!DOMelem("bar_"+this.randBarId)) {
            eval(this.varName+".createBar()");
        }
        //Show the results page
        if(index>=init.questions.length) {
            eval(this.varName+".showResults()");
        }
        //Show the question interface
        else {
            DOMelem(a).innerHTML="<h1>"+init.questions[index].question+"</h1>";
            for (var i=0;i<init.questions[index].answers.length;i++) {
                DOMelem(a).innerHTML+="<input type='button' name='"+index+"_"+i+"' value='"+init.questions[index].answers[i]+"' onClick='"+this.varName+".checkAnswer("+index+","+i+")'>";
            }
            DOMelem(a).innerHTML+="<input type='submit' id='btn_"+this.randBarId+"' value='Next Question' onClick='"+this.varName+".changeQuestion("+index+")' disabled>";
            DOMelem("bar_"+this.randBarId).style.width=(((index+1)/init.questions.length)*100)+"%";
        }
    },
    //This is used when the user clicks to change the question 
    this.changeQuestion=function(index) {
        return this.newQuestion(index+1);
    },
    //This part handles when the user clicks on an answer, color it, un-disable the button and record the guess
    this.checkAnswer=function(index,i) {
        init.questions[index].guessed=i;
        var inputs=document.getElementById(a).getElementsByTagName("input");
        for(var j=0;j<inputs.length;j++) {
            document.getElementById(a).getElementsByTagName("input")[j].className="";
            if(inputs[i].name==index+"_"+i) {
                document.getElementById(a).getElementsByTagName("input")[i].className="selected";
            }
        }
        DOMelem("btn_"+this.randBarId).disabled=false;
    },
    //This one here shows the result of the quiz.
    this.showResults=function() {
        DOMelem(a).innerHTML="<h1>Results of "+init.intro.qTitle+"</h1>";
        var count=0;
        for(var i=0;i<init.questions.length;i++) {
            if(init.questions[i].guessed==(init.questions[i].correctAnswer-1)) {
                count++;
                DOMelem(a).innerHTML+="<div id='answer' class='correct'>&radic; Question "+(i+1)+"</div>";
            }
            else {
                DOMelem(a).innerHTML+="<div id='answer' class='wrong'>&times; Question "+(i+1)+"</div>";
            }
        }
        var result=roundTo((count/init.questions.length)*100,2);
        DOMelem(a).innerHTML+="<h3 style='clear:both'><br />"+result+"% correct answers.</h3>";
        var tweet=init.tweetText.replace(/--score--/gi,result+"%");
        tweet=tweet.replace(/ /gi,'+');
        tweet="https://www.twitter.com/share?text="+tweet;
        DOMelem(a).innerHTML+="<a href='"+tweet+"'>Tweet it</a>";
    }   
}

Вы можете просмотреть демонстрацию здесь .

Я действительно думаю, что прочитал о каждом связанном вопросе, но все еще не могу найти решение.Пожалуйста, дайте мне знать, если какая-либо дополнительная информация будет полезна.

ОБНОВЛЕНИЕ:

Чтобы уточнить, я тестирую в IE9 с включенным режимом совместимости.Если у кого-то на самом деле установлен IE7 или IE8, я бы с радостью узнал ваши результаты.В любом случае, кажется, что код выполняется до этого момента:

    //This will create the first page of the quiz
    this.createQuiz=function() {
        this.getName();
        DOMelem(a).innerHTML="<h1>"+init.intro.qTitle+"</h1>";
        DOMelem(a).innerHTML+="<h2>"+init.intro.qAuthor+"</h2>";
        DOMelem(a).innerHTML+="<h3>"+init.intro.qComments+"</h3><br /><br />";
        DOMelem(a).innerHTML+="<input type='button' value='Start' onClick='"+this.varName+".newQuestion(0)'>";
    },

После нажатия кнопки запуска я получаю сообщение об ошибке, потому что this.varName возвращается как undefined.

Ответы [ 2 ]

2 голосов
/ 17 января 2012

В вашем коде:

> //The quiz object

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

Вероятно, это:

> this.getName=function() {
>     for(var v in window) {
>         if(window[v] instanceof sQuiz) {
>             this.varName=v;
>         }
>     }
> },

обрабатывается как синтаксическая ошибка, поскольку она заканчивается запятой вместо точки с запятой . Нет, это не так.

Редактировать

Ваша проблема здесь:

    for(var v in window) {
         if(window[v] instanceof sQuiz) {
             this.varName=v;
         }
    }

Глобальные переменные не перечисляются в IE 8 (и, вероятно, ранее), поэтому вы никогда не найдете экземпляры sQuiz, которые вы ищете, и this.varName останется неопределенным (на самом деле, объект будет вообще не иметь свойства varName , если вы не добавите его другим способом).

Вам нужно использовать какой-то другой метод ссылки на экземпляр (ы) - возможно, используя шаблон модуля и сохраняя ссылку в закрытии, или массив ссылок на каждый экземпляр.

0 голосов
/ 17 января 2012

Я не уверен на 100%, но при загрузке страницы в IE появляется ошибка JavaScript.Эта строка: -

if(window[v] instanceof sQuiz)

терпит неудачу - вы должны сначала проверить в окне [v] значение null, прежде чем instanceof

...