Avatar billede misleh Nybegynder
29. maj 2012 - 12:37 Der er 8 kommentarer

Validering af Javascript.

Hej Eksperter.

Jeg har kodet et nedtællings ur, men da Javascript koden står mellem </body> </html>, vil den ikke valideres på w3c validerings side.
Hvis jeg sætter koden i head'eren tæller nedtælleren ikke ned, og hvis man sætter javascript koden i et dokument for sig selv, virker dette heller ikke.

please help me :)


<html>

<head>
<style>.background {
    border-style: none;
    width: 62px;
    height: 58px;
}
.numbers {
    border-style: none;
    background-color: #292929;
    padding: 0px;
    width: 62px;
    height: 42px;
    text-align: center;
    font-family: Arial;
    font-size: 34px;
    font-weight: normal;    /* options are normal, bold, bolder, lighter */
    color: #f18b49;    /* change color using the hexadecimal color codes for HTML */
    margin-top:200px;
    margin-left:18%;
}
.title {    /* the styles below will affect the title under the numbers, i.e., "Days", "Hours", etc. */
    border: none;   
    padding: 0px;
    margin: 0px 3px;
    width:10%;
    text-align: center;
    font-family: Arial;
    font-size: 10px;
    font-weight: normal;    /* options are normal, bold, bolder, lighter */
    color: #999999;    /* change color using the hexadecimal color codes for HTML */
    background-color: #000000;
    margin-top:203px;
    margin-left:18.5%;
}
#form {    /* the styles below will affect the outer border of the countdown timer */
    width: 50%;
    height: 80px;
    border-style: solid;    /* options are none, dotted, dashed, solid, double, groove, ridge, inset, outset */
    border-width: 2px;
    border-color: #666666;  /* change color using the hexadecimal color codes for HTML */
    background-color: #000000;
    padding: 5px;
    margin-left:26%;
    margin-top:50px;
   
}
.line {
    width: 62px;
    height: 2px;
    z-index: 15;
}

</style>
</head>
<body>


       
       
                   
<div id="form">
<div class="numbers" id="count2" style="position: absolute; top: 10px; height: 60px; padding: 15px 0 0 10px; background-color: #000000; z-index: 20;"></div>
<div class="numbers" id="dday" style="position: absolute; left: 69px; top: 21px;" ></div>

<div class="numbers" id="dhour" style="position: absolute; left: 141px; top: 21px;" ></div>
<div class="numbers" id="dmin" style="position: absolute; left: 213px; top: 21px;" ></div>
<div class="numbers" id="dsec" style="position: absolute; left: 285px; top: 21px;" ></div>

<div class="title" id="days" style="position: absolute; left: 66px; top: 73px;" >Dage</div>
<div class="title" id="hours" style="position: absolute; left: 138px; top: 73px;" >Timer</div>
<div class="title" id="minutes" style="position: absolute; left: 210px; top: 73px;" >Minutter</div>
<div class="title" id="seconds" style="position: absolute; left: 282px; top: 73px;" >Sekunder</div>
</div><!--form-->




</body>

<script language="javascript" type="text/javascript">


/*  Change the items below to create your countdown target date and announcement once the target date and time are reached.  */
var current="Så er ølfesten skydt i gang!";        //—>enter what you want the script to display when the target date and time are reached, limit to 20 characters
var year=2013;        //—>Enter the count down target date YEAR
var month=05;          //—>Enter the count down target date MONTH
var day=23;          //—>Enter the count down target date DAY
var hour=15;          //—>Enter the count down target date HOUR (24 hour clock)
var minute=00;        //—>Enter the count down target date MINUTE
var tz=+1;           

/*  DO NOT CHANGE THE CODE BELOW!    */
var montharray=new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");

function countdown(yr,m,d,hr,min){
theyear=yr;themonth=m;theday=d;thehour=hr;theminute=min;
var today=new Date();
var todayy=today.getYear();
if (todayy < 1000) {
todayy+=1900; }
var todaym=today.getMonth();
var todayd=today.getDate();
var todayh=today.getHours();
var todaymin=today.getMinutes();
var todaysec=today.getSeconds();
var todaystring1=montharray[todaym]+" "+todayd+", "+todayy+" "+todayh+":"+todaymin+":"+todaysec;
var todaystring=Date.parse(todaystring1)+(tz*1000*60*60);
var futurestring1=(montharray[m-1]+" "+d+", "+yr+" "+hr+":"+min);
var futurestring=Date.parse(futurestring1)-(today.getTimezoneOffset()*(1000*60));
var dd=futurestring-todaystring;
var dday=Math.floor(dd/(60*60*1000*24)*1);
var dhour=Math.floor((dd%(60*60*1000*24))/(60*60*1000)*1);
var dmin=Math.floor(((dd%(60*60*1000*24))%(60*60*1000))/(60*1000)*1);
var dsec=Math.floor((((dd%(60*60*1000*24))%(60*60*1000))%(60*1000))/1000*1);
if(dday<=0&&dhour<=0&&dmin<=0&&dsec<=0){
document.getElementById('count2').innerHTML=current;
document.getElementById('count2').style.display="inline";
document.getElementById('count2').style.width="390px";
document.getElementById('dday').style.display="none";
document.getElementById('dhour').style.display="none";
document.getElementById('dmin').style.display="none";
document.getElementById('dsec').style.display="none";
document.getElementById('days').style.display="none";
document.getElementById('hours').style.display="none";
document.getElementById('minutes').style.display="none";
document.getElementById('seconds').style.display="none";
return;
}
else {
document.getElementById('count2').style.display="none";
document.getElementById('dday').innerHTML=dday;
document.getElementById('dhour').innerHTML=dhour;
document.getElementById('dmin').innerHTML=dmin;
document.getElementById('dsec').innerHTML=dsec;
setTimeout("countdown(theyear,themonth,theday,thehour,theminute)",1000);
}
}

countdown(year,month,day,hour,minute);

</script>


</html>
Avatar billede kentora Nybegynder
29. maj 2012 - 12:55 #1
Det er fordi du i dit script kalder funktionen direkte - det er fint hvis det står efter <body>, da de områder den så ændrer på er initialiseret.

Derfor skal du flytte:

countdown(year,month,day,hour,minute);

Ned til onload i din body. Her er den endelige kode, der virker på jsFiddle:

http://jsfiddle.net/37b9E/

Håber det hjælper.
Avatar billede olebole Juniormester
29. maj 2012 - 13:20 #2
<ole>

@kentora: Der er tale om en HTML-validator. Den er rystende ligeglad med, hvordan en funktion kaldes indenfor SCRIPT tags. En evt. JS-validator ville såmænd heller ikke have brokket sig, da funktionen kaldes helt korrekt  =)

Fejlen skyldes, at SCRIPT tags skal stå i HEAD eller BODY elementet. I misleh's kode er de skrevet efter BODY taggets afslutning. Det må de ikke være.

Desuden er language attributten forlængst deprecated, så language="javascript" skal slettes - og så skal man huske at angive en Doc-Type:

<!DOCTYPE html>
<html>
<head>
... osv, osv ...

/mvh
</bole>
Avatar billede kentora Nybegynder
29. maj 2012 - 13:33 #3
Ole, hvis du læser koden igennem [jsFiddle], så er koden skrevet oppe i headeren. Problemet er at <body> ikke er indlæst, og dermed ikke de divs der bruges i koden, og derfor kan koden ikke køre. Derfor er kaldet til funktionen flyttet ned i onLoad. :)
Avatar billede misleh Nybegynder
29. maj 2012 - 13:51 #4
Nu virker med tællings uret med Kentora's metode, html validering vil ikke validere denne linje:
<body onLoad="countdown (year,month,day,hour,minute); ">
Avatar billede jakobdo Ekspert
29. maj 2012 - 14:50 #5
Hvad hvis du skriver det med små bogstaver: onload="...">
Avatar billede olebole Juniormester
29. maj 2012 - 15:45 #6
@kentora: Jaja, der er skam ikke noget i vejen med din ændring - borset fra, at den heller ikke validerer  =)

HTML-koden kan fint validere med scriptet i BODY elementet. Det kræver bare, det er korrekt sat ind - og så vil scriptet også virke fint.

Der er heller ikke noget galt med at indsætte scriptet i HEAD, men det er ikke nødvendigt for validiteten. Gør man det, er det dog helt korrekt, at funktionen først må kaldes, når elementerne er tegnet.

Til gengæld vil din kode på jsfiddle.net udløse flere andre valideringsfejl - og validiteten var jo netop spørgers problem  =)
Avatar billede montago Praktikant
30. maj 2012 - 09:30 #7
i stedet for
<body onLoad="countdown (year,month,day,hour,minute); ">
som er nasty

så skriv i JS

window.onload = function(){ countdown (year,month,day,hour,minute); };

hvis der er flere funktioner som skal starte onload skal eventet registreres anderledes.
Avatar billede misleh Nybegynder
31. maj 2012 - 10:44 #8
Jeg har fået det hele til at validere :)
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
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

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