"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."
Dat weet ik. [] is een array constructor, {} voor een object.Verwijderd schreef op zaterdag 17 februari 2007 @ 23:32:
Er is een verschil tussen [] en {}
Zo krijg ik geen foutmelding, maar gooi ik arrays en objecten door elkaar. Dat moet toch mooier (lees: met alleen arrays) kunnen? Of maakt dat niet uit?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| var poll = []; poll[0] = { 'type' : 'multiple choice', 'question' : 'hoe gaat het met u?', 'answers' : [ 'heel goed', 'goed', 'gaat wel', 'slecht' ] }; poll[1] = { 'type' : 'open vraag', 'question' : 'wat vind u van het weer?' }; |
[ Voor 55% gewijzigd door Reveller op 17-02-2007 23:40 ]
"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."
Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.
In veel scripttalen, zoals PHP, kan ik eigen eigen keys in een array definieren:Johnny schreef op zaterdag 17 februari 2007 @ 23:54:
[...] dan zul je de keys 'type' en 'question' moeten vervangen door nummers zoals 0 en 1
1
| $poll = array('type' => 'multiple choice', 'question' => 'hoe gaat het met u'); |
Javascript kent zo'n optie dus niet? Met andere woorden: er bestaan binnen javascript alleen numerieke keys?
En een tweede vraag: is er een nog kortere manier om de informatie uit de startpost te noteren?
[ Voor 9% gewijzigd door Reveller op 18-02-2007 00:04 ]
"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."
Nee, associatieve arrays kan wel in JS, maar niet via literal constructors. Daarnaast wordt het als bad practice beschouwd omdat juist objecten daarvoor bedoelt zijn.Reveller schreef op zondag 18 februari 2007 @ 00:03:
[...]
In veel scripttalen, zoals PHP, kan ik eigen eigen keys in een array definieren:
PHP:
1 $poll = array('type' => 'multiple choice', 'question' => 'hoe gaat het met u');
Javascript kent zo'n optie dus niet? Met andere woorden: er bestaan binnen javascript alleen numerieke keys?
sure:En een tweede vraag: is er een nog kortere manier om de informatie uit de startpost te noteren?
1
2
3
4
5
6
7
8
9
10
11
| var poll = [ { 'type' : 'multiple choice', 'question' : 'hoe gaat het met u?', 'answers' : ['heel goed', 'goed', 'gaat wel', 'slecht'] }, { 'type' : 'open vraag', 'question' : 'wat vind u van het weer?' } ]; |
[ Voor 25% gewijzigd door crisp op 18-02-2007 00:19 ]
Intentionally left blank
Uit nieuwsgierigheid: hoe kun je dan wel associatieve arrays in JS bouwen?crisp schreef op zondag 18 februari 2007 @ 00:06:
[...]
Nee, associatieve arrays kan wel in JS, maar niet via literal constructors. Daarnaast wordt het als bad practice beschouwd omdat juist objecten daarvoor bedoelt zijn.
Die miste ik net
Nog een laatste vraag: waarom werk onderstaande niet?
1
2
3
4
5
| var polls = []; polls[ ['multiple choice', 'hoe gaat het met u?', ['heel goed', 'goed', 'gaat wel', 'slecht']], ['open vraag', 'wat vind u van het weer?'] ]; |
Dit werkt wel:
1
2
| polls[0] = ['multiple choice', 'hoe gaat het met u?', ['heel goed', 'goed', 'gaat wel', 'slecht']]; polls[1] = ['open vraag', 'wat vind u van het weer?']; |
[ Voor 58% gewijzigd door Reveller op 18-02-2007 00:31 ]
"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."
Intentionally left blank
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
| <div id="poll" style="width: 150px; height: 210px; background: yellow"></div> <script> var poll = [ {'type' : 'radio', 'ques' : 'hoe gaat het met u?', 'ansr' : ['heel goed', 'goed', 'gaat wel', 'slecht'] }, {'type' : 'check', 'ques' : 'waarom gaat het zoals het gaat?', 'ansr' : ['omdat het zo is', 'weet ik niet', 'zeg ik niet'] }, {'type' : 'open', 'ques' : 'wat vind u van het weer?' }, {'type' : 'note', 'note' : 'Bedankt voor uw medewerking!' } ]; var html = ''; function getQuestion(i) { switch (poll[i]['type']) { case 'radio': html = poll[i]['ques'] + '<br>'; for (j = 0; j < poll[i]['ansr'].length; j++) { html += '<input type="radio">' + poll[i]['ansr'][j] + '<br>'; } break; case 'check': html = poll[i]['ques'] + '<br>'; for (j = 0; j < poll[i]['ansr'].length; j++) { html += '<input type="checkbox">' + poll[i]['ansr'][j] + '<br>'; } break; case 'open': html = poll[i]['q'] + '<br>'; html += '<textarea></textarea>'; break; case 'note': html = '<p>' + poll[i]['n'] + '</p>'; break; } return html; } function init() { div = document.getElementById('poll'); div.innerHTML = getQuestion(0); } </script> <script>init();</script> |
Ik krijg alleen een error dat "div geen properties heeft". Ik snap niet waarom niet, want de div wordt als eerste gedefinieerd. Kan iemand mij uitleggen wat ik fout doe?
"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."
En waarom trouwens die globals? getQuestion is uitermate geschikt als method van polls:
1
2
3
4
5
| polls.getQuestion = function(i) { switch (this[i]['type']) { //... } }; |
En die html variabele als local in getQuestion definieren. Globale variabelen is gewoon vies.
Verder zal ik maar niet beginnen over het opbouwen en uitpoepen van html in innerHTML
[ Voor 4% gewijzigd door _Thanatos_ op 18-02-2007 02:32 ]
日本!🎌
Verwijderd
Ik neem aan dat dit in IE is? IE heeft de neiging om elementen met een ID beschikbaar te stellen als een global variable in JavaScript. Het zou kunnen dat dit conflicteert met jouw poll variabele.Reveller schreef op zondag 18 februari 2007 @ 01:21:
Ik heb nu dit:
JavaScript:
1 2 3 4 5 <div id="poll" style="width: 150px; height: 210px; background: yellow"></div> <script> var poll = [ ... ]; </script>
Ik krijg alleen een error dat "div geen properties heeft". Ik snap niet waarom niet, want de div wordt als eerste gedefinieerd. Kan iemand mij uitleggen wat ik fout doe?
Overigens doet deze code het bij mij in IE7 wel gewoon.
[ Voor 5% gewijzigd door Verwijderd op 18-02-2007 12:46 ]
Nee, het werkt niet in FF. Ook als ik de naam van de div verander in "polldiv", krijg ik dezelfde error..?!Verwijderd schreef op zondag 18 februari 2007 @ 12:43:
[...]
Ik neem aan dat dit in IE is? IE heeft de neiging om elementen met een ID beschikbaar te stellen als een global variable in JavaScript. Het zou kunnen dat dit conflicteert met jouw poll variabele.
edit:
Overigens doet deze code het bij mij in IE7 wel gewoon.
_Thanatos_ had gelijk: ik heb nu het script in de head gezet en met een onload aangeroepen. Nu werkt het wel
[ Voor 11% gewijzigd door Reveller op 18-02-2007 15:21 ]
"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."
Intentionally left blank
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
| <html>
<head>
<script>
var poll = [
{'type' : 'radio',
'ques' : 'hoe gaat het met u?',
'ansr' : ['heel goed', 'goed', 'gaat wel', 'slecht']
},
{'type' : 'check',
'ques' : 'waarom gaat het zoals het gaat?',
'ansr' : ['omdat het zo is', 'weet ik niet', 'zeg ik niet']
},
{'type' : 'open',
'ques' : 'wat vind u van het weer?'
},
{'type' : 'note',
'note' : 'Bedankt voor uw medewerking!'
}
];
var html = '';
var item = 0;
var answers = [];
function getQuestion(i) {
switch (poll[i]['type']) {
case 'radio':
html = poll[i]['ques'] + '<br>';
for (j = 0; j < poll[i]['ansr'].length; j++) {
html += '<input type="radio" name="check-'+ i +'" onclick="updatePoll(); storeAnswer('+ i +', '+ j +')">' + poll[i]['ansr'][j] + '<br>';
}
break;
case 'check':
html = poll[i]['ques'] + '<br>';
for (j = 0; j < poll[i]['ansr'].length; j++) {
html += '<input type="checkbox" name="radio-'+ i +'">' + poll[i]['ansr'][j] + '<br>';
}
html += '<input type="button" onclick="updatePoll()" value=">">'
break;
case 'open':
html = poll[i]['ques'] + '<br>';
html += '<textarea id="text-'+ i +'"></textarea>';
html += '<input type="button" onclick="updatePoll(); storeAnswer('+ i +', document.getElementById(\'text-'+ i +'\').value)" value=">">';
break;
case 'note':
html = '<p>' + poll[i]['note'] + '</p>';
break;
}
return html;
}
function storeAnswer(question, answer) {
answers[question] = answer;
}
function sendAnswers() {
msg = answers.join('|');
alert(msg);
}
function updatePoll() {
div = document.getElementById('poll');
html = getQuestion(item);
div.innerHTML = html;
item++;
if (item == (poll.length)) {
setTimeout("div.style.display = 'none'", 1000);
sendAnswers();
}
}
</script>
</head>
<body>
<div id="poll" style="width: 150px; height: 210px; background: yellow"></div>
<script>updatePoll();</script>
</body>
</html> |
In principe werkt het zoals ik wil: de vragen worden 1 voor 1 gesteld, en de antwoorden kunnen worden opgeslagen in de answers global variabele. Uiteindelijk wil ik deze string antwoorden naar een server verzenden. Het probleem is nu alleen dat ik een error krijg als ik tekst in de textarea (vraag 3) zet en deze submit:
Maar dit element bestaat wel; het wordt in regel 43 aangemaakt. Of bestaat dit niet, omdat ik het via de DOM moet aanmaken?document.getElementById("text-2") has no properties
"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."
Een array is een lijst met dingen die oplopend genummerd zijn. Het leuke van een array is dat ze heel snel aan het begin en eind dingen kunnen verwijderen of toevoegen. Het opzoeken van iets in een array is ook erg snel. De keys in een array zijn dus altijd integers.
Daarnaast heb je ook nog maps, waarbij de keys niet meer integers zijn. (Deze heten ook wel associatieve arrays). Deze zijn net iets minder snel.
In de meeste scripttalen zul je echter zien dat er eigenlijk geen verschil is tussen de twee. In javascript kan je probleemloos een array definieren:
1
| a = [4, 8, 15]; |
en 'm dan opeens als hashmap (of in js-taal: object) gebruiken:
1
| a["lost"] = true; |
De assignment-code voor arrays en maps is ook hetzelfde, var[property] = value;
In javascript is het enige verschil de initialisatie, met {} maak je een map en met [] een array.
Als je ooit in sterk getypeerde talen als Java/C/Haskell gaat werken zul je zien dat de twee toch niet helemaal hetzelfde zijn. Maar zoals gezegd, in script-talen hoef je je er niet al te druk over te maken.
Intentionally left blank
Je hebt helemaal gelijk.crisp schreef op zondag 18 februari 2007 @ 18:08:
Een Array als hashmap gebruiken maakt het niet meteen een Object. Feit is dat Array een speciaal type Object is. Elke primitive overerft in javascript van Object
En? Omdat jij het nu zegt is het zo? Graag iets meer onderbouwing graag
[ Voor 12% gewijzigd door André op 18-02-2007 19:54 ]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
| <html>
<head>
<script>
var item = 0;
var poll = [
{'type' : 'radio',
'ques' : 'hoe gaat het met u?',
'ansr' : ['heel goed', 'goed', 'gaat wel', 'slecht']
},
{'type' : 'note',
'note' : 'Bedankt voor uw medewerking!'
}
];
poll.radio = function(i) {
div = document.getElementById('polldiv');
for (i = 0; i < poll[i]['ansr'].length; i++) {
var input = createNode('input', {'type' :'radio', 'name' : 'radio-'+ i, 'onclick' : 'poll.update'});
var text = document.createTextNode('blaat');
div.appendChild(input);
div.appendChild(text);
}
}
poll.question = function(i) {
switch (poll[i]['type']) {
case 'radio': poll.radio(i); break;
case 'note' : poll.note(i) ; break;
}
}
poll.update = function() {
div = document.getElementById('polldiv');
poll.question(item);
item++;
if (item == (poll.length)) {
setTimeout("div.style.display = 'none'", 1000);
}
}
function createNode(type, options) {
var el = document.createElement(type);
for (var key in options) {
el.setAttribute(key, options[key]);
}
return el;
}
</script>
</head>
<body>
<div id="polldiv" style="width: 150px; height: 210px;"></div>
<script>poll.update();</script>
</body>
</html> |
Ik probeer dus de eerste poll-vraag weg te schrijven, zodat het er in de browser zo uit ziet:
1
2
3
4
5
6
7
8
| +---------------------+ | Hoe gaat het met u? | | | | O heel goed | | O goed | | O gaat wel | | O slecht | +---------------------+ |
krijg alleen de foutmelding "poll[i].ansr has no properties". Ik snap alleen niet waarom niet - de variabele is gedeclareerd en de lengte van poll = 2. Waarom leest de functie hem dan niet? Heeft het te maken met de scope oid?
"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."
Note ook dat dit niet werkt in IE:
1
2
| var input = document.createElement('input'); input.setAttribute('name', 'foo'); |
Intentionally left blank
Wat ik vooral niet snap is het volgende: als iemand een paar jaar geleden iets als een polletje in javascript moest maken, schreef hij een collectie functies in een bestand genaamd poll.js:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| var pollQuestions = ['hoe gaat het?', 'waarom gaat het?']; function initPoll() { output = createPoll(); } function createPoll() { for (i = 0; i > pollQuestions.length; i++) { createQuestion(pollQuestion[i]); } } function createQuestion(question) { return '<p>' + question + '</p>'; } |
Tegenwoordig zie ik veel javascripts van de vorm:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| var pollQuestions = ['hoe gaat het?', 'waarom gaat het?']; function poll() { var self = this; this.output = this.createPoll(); } poll.prototype.createPoll = function() { for (i = 0; i > pollQuestions.length; i++) { this.createQuestion(pollQuestion[i]); } } poll.prototype.pollQuestion = function(question) { this.question = '<p>' + question + '</p>'; } |
Maar ik zie ook (zonder prototype):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| var pollQuestions = ['hoe gaat het?', 'waarom gaat het?']; function poll() { var self = this; this.contents = this.createPoll(); } poll.createPoll = function() { for (i = 0; i > pollQuestions.length; i++) { this.createQuestion(pollQuestion[i]); } } poll.pollQuestion = function(question) { this.question = '<p>' + question + '</p>'; } |
Wat is nu precies het verschil tussen deze 3 methoden? Wat zijn de voor- en nadelen? In welke situatie gebruik je welke manier?
"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."
Verwijderd
Ik raad je aan om eens Clays object tutorial te lezen. Ik snap het overigens wel hoor, objects in JavaScript worden zelden twee keer op dezelfde manier gebruikt, en dan heb je ook nog eens talloze manieren om objecten, hun properties en hun methods te declareren. Het is niet bijzonder eenvoudig.Reveller schreef op maandag 19 februari 2007 @ 17:42:
Kan iemand mij misschien kort en bondig uitleggen wat het voordeel is van prototyping en OO schrijven in javascript? Als ik op Google zoek naar artikelen hierover, kom ik weinig eenvoudige teksten tegen. De meeste artikelen beginnen met "we gaan er vanuit dat je al (een gedegen) kennis hebt van objecten en OO programmeren in javascript", wat dus niet zo is.
Kort gezegd: als je een groep functionaliteiten logisch kunt bundelen in een object heeft dat een hoop voordelen, vooral als je meerdere (verschillende) instanties van dat soort objecten in een pagina combineert en/of meerdere verschillende objecten in een pagina combineert en laat samenwerken.
Het verschil tussen wel of niet prototype gebruiken ligt iets moeilijker. Grofweg: als je iets prototyped is het geen property of method van een instantie van een object maar van de mal waaruit dat object is gemaakt.
[ Voor 26% gewijzigd door Verwijderd op 19-02-2007 19:12 ]
Hier weer hetzelfde verhaal: "Deze tutorial gaat er vanuit dat je bekend bent met de basis van javascript. Dat wil zeggen; Het gebruik en de werking van variabelen (zoals het verschil tussen globale en lokale variabelen etc) en methoden."Verwijderd schreef op maandag 19 februari 2007 @ 19:07:
[...]
Ik raad je aan om eens Clays object tutorial te lezen. Ik snap het overigens wel hoor, objects in JavaScript worden zelden twee keer op dezelfde manier gebruikt, en dan heb je ook nog eens talloze manieren om objecten, hun properties en hun methods te declareren. Het is niet bijzonder eenvoudig.
Het is zeker dat er maar 1 poll per pagina komt. Ik zal nooit meerdere instanties van een poll aanroepen. Is OO programmeren dan wel nodig?Kort gezegd: als je een groep functionaliteiten logisch kunt bundelen in een object heeft dat een hoop voordelen, vooral als je meerdere (verschillende) instanties van dat soort objecten in een pagina combineert en/of meerdere verschillende objecten in een pagina combineert en laat samenwerken.
Oef...daar ga ik eens op googlenHet verschil tussen wel of niet prototype gebruiken ligt iets moeilijker. Grofweg: als je iets prototyped is het geen property of method van een instantie van een object maar van de mal waaruit dat object is gemaakt.
"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."
Verwijderd
Lees het nou maar. Aan je code te zien heb je genoeg kennis om het te kunnen begrijpen. In ieder geval het stuk tot aan overerving.Reveller schreef op maandag 19 februari 2007 @ 19:15:
Hier weer hetzelfde verhaal: "Deze tutorial gaat er vanuit dat je bekend bent met de basis van javascript. Dat wil zeggen; Het gebruik en de werking van variabelen (zoals het verschil tussen globale en lokale variabelen etc) en methoden."
OO is nooit nodig. Er is niets wat je met OO kunt bereiken wat je niet ook zonder kunt. OO is echter vaak veel makkelijker.Het is zeker dat er maar 1 poll per pagina komt. Ik zal nooit meerdere instanties van een poll aanroepen. Is OO programmeren dan wel nodig?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| var poll = [ {'type' : 'radio', 'ques' : 'hoe gaat het met u?', 'ansr' : ['heel goed', 'goed', 'gaat wel', 'slecht'] }, {'type' : 'note', 'note' : 'Bedankt voor uw medewerking!' } ]; function pollRadio(i) { div = document.getElementById('polldiv'); for (i = 0; i < poll[i]['ansr'].length; i++) { var input = createNode('input', {'type' :'radio', 'name' : 'radio-'+ i, 'onclick' : 'pollUpdate'}); var text = document.createTextNode('blaat'); div.appendChild(input); div.appendChild(text); } } function createNode(type, options) { var el = document.createElement(type); for (var key in options) { el.setAttribute(key, options[key]); } return el; } pollRadio(0); |
"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."
Verwijderd
Je gebruikt de variabele i heel raar en dubbel, ik weet niet eens hoe ik het het beste kan uitleggen.Reveller schreef op maandag 19 februari 2007 @ 20:59:
waarom krijg ik bij onderstaande code de error "poll.[i].ansr has no properties"?
1
2
3
4
5
6
| function pollRadio(iPoll) { div = document.getElementById('polldiv'); for (var i = 0; i < poll[iPoll]['ansr'].length; i++) { // whatever } } |
Probeer ook var te gebruiken voor je locale variabelen, anders worden ze global.
"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."