oop javascript og 'this' problemer

Tags:    javascript

Hej alle guruer deruden!

Jeg er helt ny i det med at bruge classes og OOP javascript ... Forsøger at få sådan en quiz til at virke:

[code]
function Quiz() {

this.tvm = 0;
this.id = 0;
this.kk = 0;
this.gd = 0;
this.mpl = 0;

this.cur_slide = 0;

var html = [
function() {
var ler;
ler += 'FÆRDIG!!!';
return ler;
},
function() {
var ler;
ler += '1 Du har lige meldt dig ind i Lemvig Bowlingklub, du synes, de er nogle fine mennesker, og du vil gerne hjælpe klubben. Hvad tænker du?';
ler += '<form> ';
ler += ' <p><input type="radio" name="answer" value="tvm" /> De har brug for video på Youtube ';
ler += ' <p><input type="radio" name="answer" value="id" /> De skal have en ny hjemmeside ';
ler += ' <p><input type="radio" name="answer" value="gd" /> De skal have et fedt logo ';
ler += ' <p><input type="radio" name="answer" value="kk" /> De skal have et slogan ';
ler += ' <p><input type="radio" name="answer" value="mpl" /> Jeg vil gerne sidde i bestyrelsen';
ler += '</form> ';
ler += '<input type="button" onclick="quiz.submit()" value="Næste" /> ';
return ler;
}
]

function render() {
/*
Denne funktion sørger for ALT der har med at rendere et nyt view at gøre. Den indeholder ikke HTML men skaffer det fra html[]
*/
var quizcon = document.getElementById('quizcon');

var newhtml;
switch (this.cur_slide) {
case html.length:
// hvis man er nået videre end den sidste post i html[], vis resultaterne.
newhtml = html[0]();
break;
default:
// så længe man ik er nået videre end html.length, så skift til det html der er på posten html[this.cur_slide]
newhtml = html[this.cur_slide]();
}
quizcon.innerHTML = newhtml;
}

function next() {
this.cur_slide++;
alert(this.cur_slide); // siger NaN !!
render();
}

function Submit() {
/*
smider et point i en af puljerne
*/
var inputs = document.forms[0].getElementsByTagName('input');
if (inputs) {
for (var i = 0; i < inputs.length; ++i) {
if (inputs.type == "radio" && inputs.name == "answer" && inputs.checked == true) {
switch (inputs.value) {
case "tvm":
this.tvm++;
break;
case "id":
this.id++;
break;
case "kk":
this.kk++;
break;
case "gd":
this.gd++;
break;
case "mpl":
this.mpl++;
break;
}
alert (this.tvm);
}
}
}
next();
}
}
[code]

Det der burde ske:
Brugeren trigger Submit(), når man bladrer videre i quizzen. Submit() gør nogle praktske ting, og kalder så next().
next() skal tælle this.cur_slide én op, og kalde render() - men allerede her i next() er this.slide ikke tilgængelig længere! Hvorfor ikke? ... og det samme sker selvfølgelig i render()

Jeg tror jeg kludrer i "this.", hvornår en variabel er en reference og hvornår den er value.. Fatter det ik helt :) suk PHP er nemmere...





3 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 3 karma
Sorter efter stemmer Sorter efter dato
for at en function skal være en del af objektet skal du skrive:
this.Submit=function(){
}
og ikke
function Submit(){
}
inde i Quiz functionen.

Alternativt kunne de rykke submit funktion ud og protype den ind:
Quiz.prototype.Submit=function(){}

this bruges inde i objekter til at hente deres variabler eller kalde deres egne funktioner så for at kalde next i objektet burde du skrive this.next();

I øvrigt burde du formentlig skrive this.html og ikke var html



sorry formattering gik i stykker, der var ik en preview funktion -.-



Nu har jeg fundet løsninger på lidt af hvert:

function ler() {}
vil være privat, men
this.ler = function() {}
vil kunne kaldes udefra

grunden til at følgende ikke virker
function() {
alert(this.ler); // virker ikke
}
er at jeg instansierede variablerne med this. Det skal bare være var ler = 2; men selvfølgelig tilgå dem via this. inde i metoderne :)




t