aasahMedlem sedan mars 20033 451 inlägg
Jag har en countdown högst upp på mina sidor på siten. Denna countdown fungerar fläckfritt överallt utom på min korsordslösarsida, där den av någon outgrundlig anledning inte syns! Den finns i källan, och ser identiskt likadan ut som på de sidor där den syns, så min gissning är att de extra JS-funktioner som finns på denna enda sida på något sätt gömmer den. Någon som har en idé om var felet kan vara?
<!--- Countern --->
<center><P><script type="text/javascript" src="http://www.tydal.nu/aasah/js/countDown.js?v=0"></script><ilayer id="countdownnsmain" width=&{countdownwidth}; height=&{countdownheight}; bgColor=&{countdownbgcolor}; visibility=hide><layer id="countdownnssub" width=&{countdownwidth}; height=&{countdownheight}; left=0 top=0></layer></ilayer></P></center>
Eftersom den inte syns ens när sidan är nyladdad, så antar jag att det måste vara initiate som blockerar, den körs vid sidladdning. Men hur är det möjligt?
function initiate() {
var knappEl = document.getElementById('wordBoxLetterButton');
var letterEl = document.getElementById('wordBoxLetter');
knappEl.disabled = true;
letterEl.value = '';
letterEl.disabled = true;
for (var i = 0; i < 6; i++) {
var ordEl = document.getElementById('wordBoxWord'+i);
knappEl = document.getElementById('wordBoxButton'+i);
knappEl.disabled = true;
ordEl.value = '';
ordEl.disabled = true;
}
var currBox = document.getElementById('currentClue');
currBox.style.display = "none";
currHint = document.getElementById('currentHint');
currHint.style.display = "none";
}
Vad annat kan vara fel?
Sidan i fråga Countdown:ern borde synas mellan menyn och översta Headern, (och finns där i källan).
aasahMedlem sedan mars 20033 451 inlägg
OK, ni fattar inte heller varför det inte funkar. Några tips om hur man trollar fram eländet?
headbugMedlem sedan sep. 2006858 inlägg
Vad händer om du på prov kommenterar bort de möjligen störande andra javascripten?
jawbreakerMedlem sedan jan. 2003294 inlägg
Problemet är nog att din window.onload = initiate skriver över window.onload = start_countdown (som finns i countDown.js).
Går det inte bara anropa start_countdown()-funktionen överst i initiate()-funktionen på just den sidan istället?
aasahMedlem sedan mars 20033 451 inlägg
jawbreaker skrev:
Problemet är nog att din window.onload = initiate skriver över window.onload = start_countdown (som finns i countDown.js).
Går det inte bara anropa start_countdown()-funktionen överst i initiate()-funktionen på just den sidan istället?
Det lät ju som en vettig hypotes... Men tyvärr verkar det inte funka?
function initiate() {
start_countdown; //Startar countdownern? start_countdown(); funkar inte heller
var knappEl = document.getElementById('wordBoxLetterButton');
var letterEl = document.getElementById('wordBoxLetter');
knappEl.disabled = true;
letterEl.value = '';
letterEl.disabled = true;
for (var i = 0; i < 6; i++) {
var ordEl = document.getElementById('wordBoxWord'+i);
knappEl = document.getElementById('wordBoxButton'+i);
knappEl.disabled = true;
ordEl.value = '';
ordEl.disabled = true;
}
var currBox = document.getElementById('currentClue');
currBox.style.display = "none";
currHint = document.getElementById('currentHint');
currHint.style.display = "none";
}
Eller menade du något annat? Countern syns fortfarande inte.
headbugMedlem sedan sep. 2006858 inlägg
Nej, man måste tänka lite längre.
En websida kan bara hantera 1 st window.onload.
Men eftersom countDown.js och dess onload ligger i en includad fil så kan vi inte ändra där. Och ropar man på onload innan countDown.js så pajjar countdownen (som vi ser här).
Och ropar man på countDown.js först och initiate() sedan så kommer initiate() inte att laddas.
Det man brukar göra då är att skriva något i stil med
function start() {
function1();
function2();
}
window.onload = start;
Men det går inte här heller utan att få kontroll över start_countdown()
Så det som jag tror man får göra är att kopiera countDown.js till countDown2.js och ta bort window.onload=start_countdown(), skapa sin egen start()-funktion och lägga in både start_countdown() och initiate() i den.
:h
jawbreakerMedlem sedan jan. 2003294 inlägg
Nja, det är sant att bara en window.onload kommer köras. Däremot kan man ha flera window.onload på sidan, det är bara det att det endast är en av dem som kommer köras, och det bör väl vara den som ligger sist i koden. Åtminstone tror jag att det är den sista som gäller - jag har faktiskt aldrig testat.
Det som händer i det här fallet borde vara följande, gissar jag:
1. I countDown.js-filen finns raden window.onload = start_countdown; Där talar du om att funktionen start_countdown() ska köras när fönstret har laddats. Funktionen kommer dock inte köras förrän sidan faktiskt laddats in helt.
2. En bit ner på sidan finns sedan window.onload = initiate; Här anges att funktionen initiate() ska köras istället för start_countdown(). Den raden som finns i countDown.js gäller helt enkelt inte längre.
3. Ytterligare längre ner på sidan finns en tredje window.onload upptäckte jag precis. Denna rad talar om att en tredje funktion ska köras när sidan laddats. Det är endast denna tredje funktion som körs i det här fallet. Eller? Alltså hideAllHints(289,293); Vet du om den körs?
Egentligen borde du nog kunna ha kvar din countDown.js som den är, och ta bort window.onload = initiate;
Sedan ändrar du
<script type="text/javascript">
window.onload = function() {
hideAllHints(289,293);
}
</script>
till
<script type="text/javascript">
initiate();
hideAllHints(289,293);
</script>
och lägger detta script-block efter den sista div-taggen på sidan, precis innan den avslutande body-taggen. Då borde det inte bli några problem med dina script tycker jag. Om det inte finns några andra window.onload i övriga js-filer då :-)
headbugMedlem sedan sep. 2006858 inlägg
Hoppla, håller med jawbreaker :)
jawbreakerMedlem sedan jan. 2003294 inlägg
Fast egentligen tycker jag det är bättre att, som headbug skrev innan, inte ha någon window.onload i de javascriptfiler som inkluderas. Det är så svårt att få överblick över vad som egentligen händer på sidan då känns det som.
Jag gillar bättre att endast ha funktioner i de inkluderade .js-filerna - men utan att någon kod körs direkt i dem - och sedan istället anropa de funktioner som behövs i den html-fil man inkluderar js-filerna i.
I det här fallet alltså ingen window.onload = start_countdown; i countDown.js, och så i html-filen samlar man ihop de funktionsanrop som ska köras när sidan laddas:
window.onload = function()
{
start_countdown();
initiate();
hideAllHints(289,293);
}
Men om du tar bort window.onload = start_countdown; från countDown.js måste du se till att ha motsvarande kodsnutt i alla andra filer som inkluderar countDown.js, och det kanske är jobbigt att fixa till?
Annars finns även sådana här lösningar att titta på. Den innebär egentligen att man ersätter window.onload = funktionsnamn; med addEvent(window, "load", funktionsnamn); Det går då att dynamiskt lägga till flera funktioner som ska anropas när sidan är färdigladdad. Då skulle du kunna skriva addEvent(window, "load", initiate); och addEvent(window, "load", function() { hideAllHints(289,293); }); i din sida istället för dina window.onload = ... Och countDown.js bör kunna vara som den är, med sin window.onload intakt. Rätt smidigt.
Där har du lite att välja på :)
aasahMedlem sedan mars 20033 451 inlägg
Tack för mycket uttömmande svar, jag ska strax se om jag kan fixa till det baserat på era råd. :birp
Det som, givet denna utredning, verkar mest skumt är kanske att bevisligen körs både initiate och hideAllHints i dagsläget. Enda strulet är den inkluderade filens onload. Jag trodde det funkade med flera eftersom de ligger i varsin div, men det är ju fortfarande samma sida så det verkar ju inte särskilt troligt när man tänker efter.
jawbreaker skrev:
Den innebär egentligen att man ersätter window.onload = funktionsnamn; med addEvent(window, "load", funktionsnamn); Det går då att dynamiskt lägga till flera funktioner som ska anropas när sidan är färdigladdad. Då skulle du kunna skriva addEvent(window, "load", initiate); och addEvent(window, "load", function() { hideAllHints(289,293); }); i din sida istället för dina window.onload = ... Och countDown.js bör kunna vara som den är, med sin window.onload intakt. Rätt smidigt.
Jo det vore ju på sitt sätt den klart smidigaste lösningen, men om jag förstod min JS-bok rätt så förstår inte alla webbläsare den varianten? Det verkade vara ett himla krångel för att få det att funka för både IE och FF?
Om man nu verkligen bara har EN onload, spelar det någon roll om den ligger först eller sist i skriptet? Bakgrunden till frågan är att som det funkar nu (vilket det gör för alla andra sidor) så kan jag avkommentera en enda rad i min header-fil, vilken alla sidor inkluderar, för att ta bort countern. Smidigt till tusen! Men om jag lägger in start_countdown i en onload-function i det här specifika skriptet, så vill det till att jag kommer ihåg att plocka bort den om ca ett halvår när countern försvinner... Därför vore det enklare OM det gick att lägga även denna funktion i header-filen. Men i så fall hamnar den nästan först i body. Spelar det någon roll?
jawbreakerMedlem sedan jan. 2003294 inlägg
aasah skrev:
Jo det vore ju på sitt sätt den klart smidigaste lösningen, men om jag förstod min JS-bok rätt så förstår inte alla webbläsare den varianten? Det verkade vara ett himla krångel för att få det att funka för både IE och FF?
Nja, det finns ingen standardfunktion som fungerar likadant i alla webbläsare än, tyvärr. Inte såvitt jag vet i alla fall. Men titta på länken i mitt tidigare inlägg så har du en funktion som heter addEvent(). Den är skriven för att fungera för flera webbläsare, så det ska inte vara något problem att använda den. Jag har testat i IE, Firefox och Opera för Windows, och den fungerar.
Och om du bara har en window.onload ska det inte spela någon roll var den ligger. Lägger du till addEvent()-funktionen på din sida så ska du kunna ha kvar window.onload i countDown.js, som sagt, och sedan använda addEvent() för att koppla på dina andra funktioner som ska köras när sidan laddar.
aasahMedlem sedan mars 20033 451 inlägg
Jaha, ja, nu blev det riktigt intressant... Nu ligger följande sist i källan:
</div></div>
<script type="text/javascript">
window.onload = function() {
start_countdown();
initiate();
hideAllHints(289,293);
}
</script><br clear="all"><BR><hr class="hrKarm">
<div id="foot">...endast text och länkar...</div>
</body></html>
Detta är källans enda onload. Resultatet blev att countern plötsligt syns, vilket var trevligt! Men i gengäld körs inte hideAllHints... :q :q :q :q Om jag måste välja är det countdownern som inte ska synas, men varför i all världens dar körs bara två av funktionerna?
start_countdown() - visar countdownern. Detta kan jag leva utan, men det är irriterande.
initiate - "Disable:ar" formen, vilket är nödvändigt efter som den måste vara kopplad till ett aktivt ord i korsordet för att inte generera JS-fel. Och när sidan laddar är inget ord aktivt.
hideAllHints gör precis vad det låter som och gömmer alla hjälpsamma extra ledtrådar som gör korsordet lättare att fylla i. De ska inte synas med mindre än att man vill det. (Dessa extra ledtrådar visas som blå kursiva ord under respektive ordbeskrivning.)
jawbreakerMedlem sedan jan. 2003294 inlägg
var knappEl = document.getElementById('wordBoxLetterButton');
i initiate()-funktionen verkar bli fel. Det finns ingen knapp med det id:t?
aasahMedlem sedan mars 20033 451 inlägg
jawbreaker skrev:
var knappEl = document.getElementById('wordBoxLetterButton');
i initiate()-funktionen verkar bli fel. Det finns ingen knapp med det id:t?
Åh! Det är bra när man uppdaterar skriptet när man lägger till knappar!!! Tusen tack!!! :birp
Nu funkar det, härligt!
Har markerat det svar som löste det verkliga problemet, till skillnad från rena klanteriet som gjorde att det inte verkade funka.
jawbreakerMedlem sedan jan. 2003294 inlägg
Fint att det löste sig till slut :bire