Pagina automatisch herladen om de .. seconden.

  • Onderwerp starter Onderwerp starter rv94
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

rv94

Gebruiker
Lid geworden
15 jan 2011
Berichten
306
Ik heb een javascript die er voor zorgt dat er steeds een random image wordt herladen. Nu wil ik er voor zorgen dat er om de ... seconden deze random image veranderd.

Hierdoor dacht ik zelf aan om dit random image script in een apart bestand te zetten, maar als ik die wil verversen ververst ook de index.html. Ik zou dit liever hebben dat hij alleen de random.php apart ververst. Zodat de gebruiker het niet ziet.

Wie kan me helpen hoe ik dit het beste kan oplossen?
 
Ik heb wel een idee :) Als je nu eens zorgt dat de code in random.php een random plaatje levert iedere keer dat 't script aangeroepen wordt. (Heb je verstand van PHP? Anders kan ik je daarmee misschien ook wel wat op weg helpen ;))
Dan hoef je met JS alleen nog maar die random.php te herladen, iedere X seconden ;) Dat kan best minimaal op deze manier:

index.htm
HTML:
<html>
    <head>
        <script type="text/javascript" src="random_image.js"></script>
        <script type="text/javascript">
            
            if (typeof main == "function") {
                window.onload = main;
            }
            
        </script>
    </head>
    <body>
        <div id="img_target"></div>
    </body>
</html>

random_image.js
[JS]function partial(f /*, args*/) {
var args = Array.prototype.slice.call(arguments, 1);
return function() {
var _args = [], i = 0, j = 0;
while (i < args.length || j < arguments.length) {
_args = args !== undefined ? args : arguments[j++];
i++;
}
return f.apply(this, _args);
};
}

function main() {

var Settings = {
INTERVAL: 2000,
SOURCE: "random.php",
TARGET: document.getElementById("img_target")
};

var f = partial(setImage, Settings.SOURCE, Settings.TARGET);
f();
setInterval(f, Settings.INTERVAL);

}

var setImage = (function() {
var img;
return function setImage(source, target) {
if (img) {
img.parentNode.removeChild(img);
}
img = new Image();
img.src = source;
target.appendChild(img);
};
})();[/JS]
 
Laatst bewerkt:
Alvast bedankt dat je mij wilt helpen.

Ik heb niet echt veel verstand van PHP daarvoor heb ik er nog te weinig gebruik van gemaakt.
Op internet had ik al een scriptje gevonden om een random image uit een map te halen, maar hiermee gaat het mij niet lukken om het steeds opnieuw op te roepen.
Hier het scriptje wat ik heb gebruikt.

PHP:
<?php 
function getRandomFromArray($ar) { 
    mt_srand( (double)microtime() * 10000 ); 
    $num = array_rand($ar); 
    return $ar[$num]; 
} 

function getImagesFromDir($path) { 
    $images = array(); 
    if ( $img_dir = @opendir($path) ) { 
        while ( false !== ($img_file = readdir($img_dir)) ) { 
            // checks for gif, jpg, png 
            if ( preg_match("/(\.gif|\.jpg|\.png)$/", $img_file) ) { 
                $images[] = $img_file; 
            } 
        } 
        closedir($img_dir); 
    } 
    return $images; 
} 

$root = ''; 
// If images not in sub directory of current directory specify root  
//$root = $_SERVER['DOCUMENT_ROOT']; 

$path = 'images/random/'; 

// Obtain list of images from directory  
$imgList = getImagesFromDir($root . $path); 

$img = getRandomFromArray($imgList); 

?>
 
Hoi rv94,
Eerst even checken wat de bedoeling precies is:
  • Er is een pagina waarop een image-carrousel staat, waarbij de volgorde van de images random moet zijn.
  • Op andere pagina's staat hetzelfde carrousel, en dan moet opnieuw een random volgorde worden bepaald.
  • Bij herladen of terugkomen op een eerdere pagina wordt ook de random opnieuw bepaald.
  • Nadat alle images (in de random volgorde) door het carrousel zijn, moet het carrousel blijven herhalen.
  • Zolang de pagina openstaat, moet de volgorde van de herhaling gelijk zijn aan de random volgorde van de eerste ronde, zodat alle images eerlijk evenveel aan de beurt komen en op gelijke afstand van elkaar zitten (= er mag niet voor de tweede e.v. ronde opnieuw gerandomd worden).

Als dit klopt, dan hoeft er niet ingewikkeld heen en weer gerangeerd te worden tussen javascripts en een php-bestand, maar kan alles met één javascriptje geregeld worden, dat op elke pagina aangeroepen wordt.
HTML:
<body>
    <div id="wisselaar"><img src="images/kasteel.jpg" alt=""></div>
    <!--
    ... (rest van de pagina)
    -->
        
    <script type="text/javascript" src="scripts/random-carrousel.js"></script>
</body>
</html>
Voor als javascript uit mocht staan, is er een standaard-img in de html opgenomen. Als javascript draait, komt daar het carrousel voor in de plaats.

In het script kunnen dan twee functies komen:
  1. Een functie voor het random toewijzen van een volgorde aan de images (dan is daarvoor geen php-bestand nodig).
  2. Een functie voor het carrousel, met gebruikmaking van de bepaalde volgorde.

Volgorde bepalen
Je geeft de map op, waar de images uit gehaald moeten worden.
Je maakt een rijtje van de bestandsnamen van de betreffende images.
[JS]var wisselMap="images/"; // in te vullen image-directory

var wisselImg=new Array();

// het in te vullen lijstje van te gebruiken images:
wisselImg[0]="ochtendalpen.jpg";
wisselImg[1]="eigenpotje.jpg";
wisselImg[2]="alpenkamp.jpg";
wisselImg[3]="arend.jpg";
wisselImg[4]="steenbok2.jpg";
wisselImg[5]="zee.jpg";
wisselImg[6]="kasteel.jpg";[/JS]
Daarmee kan het script aan de slag:
  • Het aantal images wordt bepaald.
  • Er wordt een verzameling aangelegd van de randoms die op een bepaald moment al getrokken zijn (in het begin dus niks).
  • Het aantal al random getrokken images wordt bijgehouden.
  • Er wordt een verzameling aangelegd van de bestandsnamen voor de random volgorde.
[JS]var aantalImg=wisselImg.length;

var geweest=new Array();
for (var i=0; i<aantalImg; i++){ // geen img-nr is nog geweest
geweest="nee";
}
var volgnummer=0;
var toonImg=new Array(); // dit gaat de random volgorde worden[/JS]
Nu kan het random functie gemaakt worden:
  • Voorwaarde is dat nog niet alle random-nummers geweest zijn, want dan hoeft er niets meer getrokken te worden.
  • Er wordt eerst een random getal getrokken tussen de 0 en 1 minder dan het aantal images (had ook 1 en het aantal kunnen zijn, maar de 0 is handig omdat daarmee de script-nummering altijd begint).
  • Als het random-getal nog niet eerder getrokken was, dan wordt via het random-getal de bestandsnaam van het image gekoppeld aan de volgorde-verzameling.
  • Als het random-getal wel eerder getrokken was, dan mag het niet gebruikt worden: dan moet een verse poging gedaan worden om een nog niet getrokken random te plukken.
  • Als alle randoms getrokken zijn, zitten alle bestandsnamen in de verzameling met de willekeurige volgorde.
  • En dan mag het carrousel in werking gaan.
[JS]function goRandom(){
if (volgnummer<aantalImg){ // als nog niet alle images aan de beurt zijn geweest
var random = Math.floor(Math.random()*aantalImg); // output-waarden: 0, 1, 2, ... (t/m aantalImg - 1)
if (geweest[random]=="nee"){ // als random-getal niet eerder getrokken was
toonImg[volgnummer]=wisselImg[random]; // img-volgnummer krijgt random img toegewezen
geweest[random]="ja"; // deze mag niet nog eens getrokken worden
volgnummer=volgnummer+1; // er is er weer eentje afgehandeld
goRandom(); // volgende random gaan trekken voor volgend volgnummer
}
else { // als een nummer al getrokken was, nogmaals nieuwe trekken
goRandom();
}
}
else { // alle nummers zijn geweest, volgorde staat vast
showCarrousel();
}
}[/JS]

Carrousel laten draaien
Voor deze functie is het handig om een setting te maken voor de pauze in seconden:
[JS]var timer=2.5; // in te vullen wissel-tempo in seconden[/JS]
Daarna gaat alles vanzelf:
[JS]var nr=0;
function showCarrousel(){
if (nr==aantalImg){ // als alles geweest is, herhalen in dezelfde volgorde
nr=0;
}
document.getElementById('wisselaar').innerHTML='<img src="'+wisselMap+toonImg[nr]+'" alt="" />';
nr=nr+1;
setTimeout(showCarrousel,timer*1000); // nu in msec
}[/JS]

Tot slot moet de random-functie gaan werken zodra de pagina geopend wordt. Omdat het script helemaal onderaan in de <body> zit, en alles dan al ingeladen is, kan dat "koud" op het eind van het script gezet worden:
[JS]goRandom();[/JS]

En voor het gemak staan de maten van de images in de #wisselaar in de css, dan hoeft dat er niet elke keer via het javascript in gezet te worden:
Code:
#wisselaar img {
	width: ..px;
	height: ..px;
	}

=======
Al met al wordt het dan een javascriptje van nog geen 2kB;

Test: 2 pagina's met hetzelfde script:

En vervolgens kan je het zo mooi gaan maken als je zelf wilt:
  • Een css-preload maken voor de images om geen flitsen te krijgen bij de eerste keer.
  • Met javascript een infader toevoegen voor geleidelijke overgang.
  • Via de css de toegankelijkheid waarborgen als javascript uit staat (zie bv. deze; incl. fader als js wel aan staat).
  • Links toevoegen aan de images.
  • Enz. enz.! :)

Met vriendelijke groet,
CSShunter
 
Hallo csshunter,

Ik denk dat ik mijn vraag niet helemaal duidelijk heb uitgelegd.
Ik heb op de index.html een fadein en fadeout script op 7 verschillende plekken.

Het is me al gelukt dat hij steeds op een andere plek terug komt.
Met een random image script blijft het nu bij 1 plaatje. Deze wisselt alleen als ik F5 doen, maar dan zijn alle 7 de Plaatjes weer het zelfde.

Elke foto duurt er 6500 ms over voordat hij naar de volgende foto gaat. Hierdoor dacht ik als ik alleen het random image script herhaalt na 6500 ms, dat hij bij de volgende fadein een ander plaatje toont. En dat hij aan het eind van de 8 plaatjes weer opnieuw begint. Met weer 7 random plaatjes.

Even kort samengevat.
1 pagina (index.html)
7 verschillende locaties op de zelfde pagina. (elk plaatje staat in een aparte div maar die staan samen in 1 div)

Het enigste probleem is nu dus dat hij steeds het zelfde plaatje laat zien het zou misschien opgelost zijn als ik dat random script 7 keer kopieer en andere naam geef, maar dit is vast in een kort script mogelijk.

Schermafbeelding 2012-06-19 om 17.05.00.jpg
Op de plekken van de stippen moeten de plaatjes komen.
 
Laatst bewerkt:
Hej :)
Je PHP-script is al een eind op weg. Nu alleen nog zorgen dat 't niet de locatie van het plaatje als output heeft, maar het plaatje zelf ;) Dus even de Content-Type aanpassen, en wat rondsnuffelen in de image-functies van PHP...

Test maar eens of je een plaatje ziet als je naar random.php gaat in je browser. Zo niet, dan zie je daar waarschijnlijk meteen een foutmelding die aangeeft waar 't mis gaat :)

random.php
PHP:
<?php

function getRandomFromArray($ar) { 
    mt_srand( (double)microtime() * 10000 ); 
    $num = array_rand($ar); 
    return $ar[$num]; 
} 
function getImagesFromDir($path) { 
    $images = array(); 
    if ( $img_dir = @opendir($path) ) { 
        while ( false !== ($img_file = readdir($img_dir)) ) { 
            // checks for gif, jpg, png 
            if ( preg_match("/(\.gif|\.jpg|\.png)$/", $img_file) ) { 
                $images[] = $img_file; 
            } 
        } 
        closedir($img_dir); 
    } 
    return $images; 
} 


$root = ''; 
// If images not in sub directory of current directory specify root  
//$root = $_SERVER['DOCUMENT_ROOT']; 
 
$path = 'images/random/'; 
 
// Obtain list of images from directory
$imgList = getImagesFromDir($root . $path);
$filename = getRandomFromArray($imgList);

$imageType = exif_imagetype($filename);
header("Content-type: " . image_type_to_mime_type($imageType));

switch ($imageType) {

    case IMAGETYPE_GIF:
        $image = imagecreatefromgif($filename);
        imagegif($image);
        break;

    case IMAGETYPE_JPEG:
        $image = imagecreatefromjpeg($filename);
        imagejpeg($image);
        break;

    case IMAGETYPE_PNG:
        $image = imagecreatefrompng($filename);
        imagepng($image);
        break;
    
}
imagedestroy($image);
 
?>
 
Hoihoi,
@ reactie nr. #5:

Aha, er zijn dus helemaal geen carrousels per locatie: het randommen zelf moet het wisselen veroorzaken!

Als eigenwijzeling was ik intussen ook aan het verder knutselen met mijn huis-tuin-en-keuken-script (zonder php). ;)
Dan moet inderdaad de random-functie steeds opnieuw aangeroepen worden, en niet een carrousel waar images in zetten.
Dat kan in principe eenvoudig:
  • Er is een voorraadbak met x images (bij mij: 12 stuks).
  • Er worden er per ronde 7 random uit getrokken.
  • Die worden in de bijbehorende locatie-div's gezet (ik heb ze in li's, maar dat maakt geen verschil).
  • Na tig seconden (voor de demo: 3.5 sec) wordt alles gereset en opnieuw een random volgorde bepaald, die er weer 7 uitkiest voor plaatsing > er wordt gewisseld.

Resultaat:

Beperkingen:
  • Ik weet niet of je fading-script hier makkelijk in te frommelen is. Eventueel zou er een custom fading-script bij gemaakt moeten worden.
  • Ik weet niet hoeveel images er in je voorraadbak zitten. Als het er honderden zijn, zouden die allemaal met de hand in het lijstje van te gebruiken images in het script moeten worden gezet. Maar dit lijstje is éénmalig, en zou dus ook met php opgevraagd moeten kunnen worden (het randommen gebeurt vervolgens weer met js).
  • Als het een grote voorraadbak is, komen gemiddeld genomen over veel rondes alle images evenveel aan de beurt. Op korte termijn (paginabezoek van 1 minuut = maar 10 ronden) hoeft dat helemaal niet het geval te zijn, en door het terugleggen na elke ronde kan het gebeuren dat er bv. in 3 opvolgende rondes telkens eenzelfde image bij zit, terwijl er genoeg zijn die nog niet werden getoond. - Een partijtje extra script zou dat denkelijk kunnen verhelpen.

... en toen zag ik wat Robin heeft gemaakt.
Dat kan ik niet helemaal volgen, maar als 't werkt, werkt 't! :)

Met vriendelijke groet,
CSShunter
 
Alle bij hartelijk bedankt voor jullie hulp. Het is me gelukt.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan