Avatar billede www.denn.dk Nybegynder
30. november 2008 - 14:21 Der er 38 kommentarer og
2 løsninger

getElementById i Internet Explorer

Hej eksperter.

Jeg har et problem med et lille script, der vil opdatere prisen i realtime gennem javascript.

På denne side kan i se min HTML del
http://websimple.dk/dev/index.php?p=bestil
Og her ligger mit JS.
http://websimple.dk/dev/js/pris.js


Det virker fint i Firefox, men af en eller grund virker det ikke i Internet Explorer (tak bill)
Avatar billede olebole Juniormester
30. november 2008 - 15:15 #1
<ole>

Det skyldes Firefox's yderst sloppy forhold til valid DOM-kode. Dette:

    document.getElementById("totalPris").innerHTML=totalPrisText;
    document.getElementById("totalMoms").innerHTML=totalMomsText;
    document.getElementById("totalPrisMoms").innerHTML=totalPrisMomsText;

- bør være:
    document.getElementById("totalPris").value=totalPrisText;
    document.getElementById("totalMoms").value=totalMomsText;
    document.getElementById("totalPrisMoms").value=totalPrisMomsText;

Property'en innerHTML har en masse uhensigtsmæssige sideeffekter, ligesom den aldrig har været valid i forhold til nogen somhelst standard. Siden Explorer 5 og Netscape 6 har der eksisteret langt bedre og valide metoder til at manipulere DOM'en med, så der er ingen grund til at bruge invalide, antikke metoder. Undgå innerHTML  ;o)

Jeg fatter dog ikke, hvordan FF kan finde på at godtage innerHTML til at sætte en value på et input-element, er dog en gåde ... det giver ikke mening.  =)

/mvh
</bole>
Avatar billede www.denn.dk Nybegynder
30. november 2008 - 15:29 #2
Hej Ole.

Jeg tror du har misforstået mit script en smule.

Der hvor jeg sætter innerHTML skriver jeg til en label med et id. Jeg benytter altså ikke et input felt.
Avatar billede montago Praktikant
30. november 2008 - 16:52 #3
det lykkedes da for ham at prædike imod innerHTML ;-)
Avatar billede w13 Novice
30. november 2008 - 16:58 #4
Når det er et label-element, skal det ikke være .value, men .firstChild.nodeValue
Avatar billede www.denn.dk Nybegynder
30. november 2008 - 17:09 #5
w13 - Det virker ikke.

Jeg tror problemet ligger i getElementById - prøv at se den fejl man får af Internet Explorer.
Avatar billede Slettet bruger
30. november 2008 - 17:15 #6
Det ser ud til at du har lidt for mange parenteser i din if-sætning.

if((document.getElementById("nyhedssystem").checked)){
Skal være
if(document.getElementById("nyhedssystem").checked){

Jeg ved ikke kom
Avatar billede Slettet bruger
30. november 2008 - 17:16 #7
Hov...
Jeg ved ikke om det gør forskellen ;)
Avatar billede w13 Novice
30. november 2008 - 17:25 #8
Nej, jeg gik heller ikke ud fra, det ville virke, når innerHTML heller ikke virkede - men firstChild.nodeValue er den gyldige DOM-metode til indsættelse af tekst. Value ville under ingen omstændigheder kunne virke, når det ikke drejer sig om et input-felt.

kaloer>> Nej, den ekstra parentes gør ingen forskel, men der er selvfølgelig heller ingen grund til, at den skal være der.
Avatar billede w13 Novice
30. november 2008 - 17:26 #9
www.denn.dk>> Jeg bruger i øvrigt Mac, så derfor kan jeg ikke se fejlen i Internet Explorer. Har du mulighed for at skrive den her?
Avatar billede w13 Novice
30. november 2008 - 17:27 #10
(firstChild.nodeValue virker i øvrigt kun, hvis der står noget i feltet først, så det kan f.eks. enten være 0 eller &nbsp; - sidstnævnte vil ikke kunne ses.)
Avatar billede www.denn.dk Nybegynder
30. november 2008 - 17:28 #11
Får følgende:

Linje: 17
Tegn: 3
Fejl: Objektet understøttet ikke denne egenskab eller metode.
Avatar billede w13 Novice
30. november 2008 - 17:29 #12
grundPris=2000;
bør i øvrigt være:
var grundPris=2000;
Avatar billede w13 Novice
30. november 2008 - 17:30 #13
Hvilket dokument står der, fejlen sker i? PHP-filen eller JS-filen? (Der plejer at stå en adresse under det, du skriver.)
Avatar billede www.denn.dk Nybegynder
30. november 2008 - 17:31 #14
w13 - ændret nu, men det virker stadigvæk ikke.
Avatar billede www.denn.dk Nybegynder
30. november 2008 - 17:31 #15
w13 -> http://websimple.dk/dev/index.php?p=bestil er filen fejlen sker i.
Avatar billede w13 Novice
30. november 2008 - 17:36 #16
Du bør nok også erklære dine andre variabler. Ret:

var grundPris=2000;

til:

var grundPris=2000;
var nyhedsSystem = nyhedsBrev = galleri = kontaktFormular = opdateringer = 0;
var totalPrisB = totalPrisMomsB = totalPrisText = totalMomsText = totalPrisMomsText = 0;
Avatar billede w13 Novice
30. november 2008 - 17:37 #17
Så kan du også slette alle dine else-sætninger.
Avatar billede w13 Novice
30. november 2008 - 17:46 #18
Jeg ville nok gøre noget i retning af:

function beregnpris() {
    var totalPris = 2000;
    var totalPrisText = totalMomsText = totalPrisMomsText = "";
    var totalMoms = 0;
   
    if (document.getElementById("nyhedssystem").checked) {
        totalPris += 1499;
    }
   
    if (document.getElementById("nyhedsbrev").checked) {
        totalPris += 799;
    }
   
    if (document.getElementById("galleri").checked) {
        totalPris += 1499;
    }
   
    if (document.getElementById("kontaktformular").checked) {
        totalPris += 799;
    }
   
    if (document.getElementById("opdateringer").checked) {
        totalPris += 499;
    }
   
    totalMoms = totalPris*0.25;
   
    totalPrisText = totalPris.replace("/./",",") + " kr";
    totalMomsText = totalMoms.replace(".",",") + " kr";
   
    totalPrisMomsText = totalPris+totalMoms;
    totalPrisMomsText = totalPrisMomsText.replace(".",",") + " kr";
   
    document.getElementById("totalPris").firstChild.nodeValue = totalPrisText;
    document.getElementById("totalMoms").firstChild.nodeValue = totalMomsText;
    document.getElementById("totalPrisMoms").firstChild.nodeValue = totalPrisMomsText;
}

Bemærk, at jeg her bruger firstChild.nodeValue, hvilket som sagt kræver, at du indsætter f.eks. "0" eller "&nbsp;" i både din totalPris-label, din totalMoms-label og din totalPrisMoms-label.
Avatar billede olebole Juniormester
30. november 2008 - 17:47 #19
Sorry, der var jeg vist for hurtig - men det er nu lidt sørgeligt at erfare, at det, at jeg påpeger åbenlyse fejl og tåbeligheder ved en browser (omend, det ikke var, hvad der her forårsagede fejlen), stadig kan provokere visse primitive elementer til at føle sig kaldet til at bidrage med ligegyldigheder.

www.denn.dk >> Hvis du har et element med id="grundPris", vil du på grund af en bug i IE kunne adressere elementet med grundPris. grundPris=0 opfattes altså som forsøg på at sætte elementet lig med 0 - hvilket er vrøvl  =)

Lokale variabler i funktioner bør altid erklæres med var  ;o)
Avatar billede www.denn.dk Nybegynder
30. november 2008 - 18:15 #20
oleBole, det har jeg ikke.

w13 - Tak for dine mere rene kode, men det virker desværre stadigvæk ikke.
Avatar billede www.denn.dk Nybegynder
30. november 2008 - 18:16 #21
- og det virker slet ikke i firefox nu
Avatar billede w13 Novice
30. november 2008 - 18:22 #22
Hvad siger fejlkonsollen så i FF?
Avatar billede montago Praktikant
30. november 2008 - 18:38 #23
totalPris.replace is not a function
[Break on this error] totalPrisText = totalPris.replace("/./",",") + " kr";

du skriver Regex inde i en string... nøjes i stedet med "."
Avatar billede montago Praktikant
30. november 2008 - 18:41 #24
i stedet for at bruge en <label> ville jeg nok bruge et <span> og derefter  bruge innerHTML som ikke forvirre halvt så meget som firstChild().nodeValue

keep it simple
Avatar billede montago Praktikant
30. november 2008 - 18:43 #25
evt ville jeg også præfix mine span-id'er med lbl:

lblTotalPris
lblTotalMoms
Avatar billede w13 Novice
30. november 2008 - 18:44 #26
Jeg foretrækker personligt Keep it real. :)

Men en span er nok mere fornuftigt semantisk set end en label.
Avatar billede www.denn.dk Nybegynder
30. november 2008 - 19:36 #27
Har rettet det iflg. jeres forslag, det virker stadigvæk ikke.

Får følgende fejl stadigvæk
Fejl: totalPris.replace is not a function
Kildefil: http://websimple.dk/dev/js/pris.js
Linje: 28
Avatar billede montago Praktikant
30. november 2008 - 19:44 #28
formegentlig fordi det er en INT

prøv at konvertere den inden du laver replace:

totalPris = (totalPris + "").replace...
Avatar billede montago Praktikant
30. november 2008 - 19:45 #29
eller... ikke INT.. men NUMBER
Avatar billede www.denn.dk Nybegynder
30. november 2008 - 20:08 #30
virker desværre hellere ikke.

Hvis du kigger på følgende side:
http://www.simpelside.dk/bestil_webloesning.php

og kigger i hans javascript, så er det faktisk nødagtigt det samme som jeg gik udfra, før vi lavede ændringerne. Men hans virker i både Firefox og Internet Explorer
Avatar billede montago Praktikant
30. november 2008 - 20:14 #31
totalPrisMomsText er blevet til en NUMBER

du skal (totalPrisMomsText + "") med den inden du kan bruge den som String
Avatar billede montago Praktikant
30. november 2008 - 20:16 #32
lidt regler at huske

var p = "12" + 12 // giver "1212"
var q = "12" * 12 // giver 144
Avatar billede www.denn.dk Nybegynder
30. november 2008 - 20:28 #33
Jeg er ikke helt med på hvad du vil, kan du evt. smide et lille kode snippet?
Avatar billede w13 Novice
30. november 2008 - 20:34 #34
totalPris = (totalPris).replace...
skal være:
totalPris = (totalPris + "").replace...

:)
Avatar billede tjens Nybegynder
30. november 2008 - 20:39 #35
Eller brug dine "kr" til at tvinge den til string:

    totalPrisText = (totalPris  + " kr").replace(".",",");
    totalMomsText = (totalMoms + " kr").replace(".",",");
 
    totalPrisMomsText = totalPris+totalMoms;
    totalPrisMomsText = (totalPrisMomsText+" kr").replace(".",",");
Avatar billede www.denn.dk Nybegynder
30. november 2008 - 20:40 #36
w13 - Du er min redningsmand, smid et svar ;)

Jeg opdagede lige, at onchange ikke fungere helt optimalt i Internet Explorer, men onclick virker uden problemer :)
Avatar billede w13 Novice
30. november 2008 - 21:19 #37
Jeg bør nok dele med Montago, som foreslog løsningen, men her er et svar fra mig. =)
Avatar billede montago Praktikant
30. november 2008 - 21:35 #38
yoo
Avatar billede www.denn.dk Nybegynder
30. november 2008 - 22:05 #39
Forhøjede lige pointsne. Jeg takker mange gange.

Javascript er ikke min bedste ven, endnu :)
Avatar billede w13 Novice
30. november 2008 - 22:16 #40
Tak for points! :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester