Random vertonen

Status
Niet open voor verdere reacties.

motower

Gebruiker
Lid geworden
10 aug 2004
Berichten
472
Hallo, ik wil graag een script voor het volgende ....
Ik heb op een pagina 3 tabellen met daarin een foto, tekst en link naar externe website. In totaal heb ik ong. 25 van die tabellen dus ik wil ze graag op die ene pagina random laten verschijnen. Dus elke keer dat de bezoeker de site bezoekt dat ie dan 3 andere ziet.
Ben ik zo een beetje duidelijk?
 
Ja, dat heb ik wel gevonden, maar ik zoek iets waardoor ik meer content kan plaatsen (tabel met image, tekst, link).
Ik dacht wel aan een script voor elke keer/dag een andere pagina, dan maak ik gewoon 3 iframes waarin dan elke keer/dag een andere pagina te zien is, maar dat kon ik niet vinden.
 
Als je de inhoud van die grotere <div>'s in een <iframe> zet (of beter in een: <object data=".../wissel-1.htm">), dan kan het javascript in plaats van het wisselen van de src van het img nu de src van het iframe of de data-waarde van het object wisselen.

Als je drie van deze randommers naast elkaar hebt, kan je het 3 keer doen. Alleen even de variabelen voor de gevonden random van de eerste en de tweede vasthouden, en die verbieden voor de tweede en derde.
Anders zou er "teveel random" kunnen gebeuren: 2 of drie keer dezelfde toevallige inhoud naast elkaar. ;)
 
Hmmmmmm, ik heb dit ..... en ik zou eigenlijk niet weten hoe aan te passen.

<script language="JavaScript">
<!--


function random_imglink(){
var myimages=new Array()
myimages[1]="uitgelicht/01.jpg"
myimages[2]="uitgelicht/2.jpg"
myimages[3]="uitgelicht/3.jpg"
myimages[4]="uitgelicht/4.jpg"
myimages[5]="uitgelicht/5.jpg"
myimages[6]="uitgelicht/6.jpg"
myimages[7]="uitgelicht/7.jpg"

var imagelinks=new Array()
imagelinks[1]="../arrangementen01.html"
imagelinks[2]="../arrangementen02.html"
imagelinks[3]="../arrangementen03.html"
imagelinks[4]="../arrangementen04.html"
imagelinks[5]="../arrangementen05.html"
imagelinks[6]="../arrangementen06.html"
imagelinks[7]="../arrangementen07.html"

var ry=Math.floor(Math.random()*myimages.length)

if (ry==0)
ry=1
document.write('<a href='+'"'+imagelinks[ry]+'"'+'><img src="'+myimages[ry]+'" border=0></a>')
}

random_imglink()
//-->
</script>
 
Hoi motower,
Om beter de gedachten te kunnen bepalen, en concrete aanknopingspunten (html/css) voor het script te zien: heb je een link naar een testpagina waarop 3 van deze "foto, tekst en link" elementen staan?

php
Verder zit ik te denken aan php in plaats van javascript, dan hoef je niet met iframe's of ingevoegde objecten te werken, maar kan het met php-includes. Voordeel (behalve kortere codes): je hoeft tevoren de hoogte van zo'n "foto, tekst en link" element niet op te geven > ze mogen verschillend van hoogte zijn, en als ze naast elkaar staan, passen ze zich aan aan de hoogste.
Kan je php draaien bij je provider?

no tables!
O ja, ik denk ook aan met css gestylde <div>'s in plaats van tabellen. Dat maakt de html een stuk overzichtelijker (en kleiner).
Dan heb je 3 <div>'s naast of onder elkaar, waar je de toevalsmachine een vulling aan laat geven, en de gelukkig gekozen <div>'s kunnen er met een php-include bij getrokken worden.

meervoudige random-functie
Voor het niet-helemaal-toevallig trekken van een tweede random-getal (dat namelijk niet gelijk mag zijn aan het eerste, anders komen er twee dezelfde naast/onder elkaar!) is het nodig het eerste random-getal even apart te zetten, en dan bij het tweede random-getal te kijken of dat gelijk is aan het eerste.

Zo ja, dan mag de tweede waarde niet gebruikt worden, en moet het random-trekken voor het tweede element nog een keer > net zolang totdat een verschillende waarde gevonden is.

Bij 3 elementen moet er na de goede 2e waarde op dezelfde manier voor de 3e gecheckt worden: dan mag de derde waarde niet gelijk zijn aan de eerste of de tweede.

Een voorbeeld van het systeem:
  • Test: dubbele-random-functie-zonder-terugleggen.php.
  • Hier zijn maar drie mogelijkheden genomen voor een waarde (i.p.v. de ca. 25 die het bij jou moeten worden), zodat je niet heel erg veel moet klikken om toevallig tegen twee dezelfde random getrokken waarden op te lopen.
  • Maar met 25 of 100 verschillende mogelijkheden doet ie het ook.
  • Leuk om te zien bij flink klikken:
    soms lukt het wel 4 of 5 keer niet om een afwijkende tweede random te trekken. :)
  • Dit moet dus nog uitgebreid worden voor het derde element dat er nog naast/onder moet komen.
Maar weer even terug naar af: testpagina'tje?

Met vriendelijke groet,
CSShunter
 
Oef, dat is "een hele mond vol"!
Ik weet niets van php en voor wat betreft de div's .... daar moet ik me inderdaad eens in verdiepen om van de tabellen af te komen.
Helaas staat de pagina niet on-line.
(hmmmm, ik kan niet zo veel positiefs beantwoorden hè)
 
Vakken vullen, maar niet bij AH

Hoi motower,
Ja, php is een geheel eigen taal. Maar het kan ook met javascript.
De <div>'s (d.w.z. het gebruik van css, en scheiding van de html-structuur en de css-opmaak) moet je je zeker eens in gaan verdiepen: dat geeft veel flexibiliteit aan je pagina's, en de html wordt er veel mooier / eenvoudiger van. Ook heel makkelijk aan te passen: als iets in de opmaak je niet bevalt, maak je één verandering in het css-stylesheet, en het werkt meteen door op alle pagina's van de site. Dat is andere koek dan dat je in alle tabellen van alle pagina's moet duiken om die ene verandering door te voeren!
In het begin komt er nogal veel tegelijk aan css-eigenschappen op je af, maar als je daar eenmaal doorheen bent, wordt het echt heel leuk! :)

De lijst met mogelijkheden
Wat er met javascript nodig is, is om te beginnen de definitie van een serie array's om de verschillende delen van de in te pluggen blokken te kunnen vangen:
Als je per in te voegen cel- of div-blok hebt: een link, een image, een kopje en een stukje tekst, dan wordt het bv.:
[JS]var link_url= new Array();
var link_img= new Array();
var link_kop= new Array();
var link_txt= new Array();[/JS]
Dan kan je een rijtje aanmaken met de essentiële gegevens van je 25 opties, bv.:
[JS]link_url[0] = "www.mijnprachtigefotosite.nl";
link_img[0] = "images/alpenOchtend.jpg";
link_kop[0] = "Mooi hè?";
link_txt[0] = "Klik op bovenstaande link om van deze foto en andere prachtige foto's te genieten!";

link_url[1] = "www.degraseter.nl";
link_img[1] = "images/potjeKoken.jpg";
link_kop[1] = "Niet te versmaden";
link_txt[1] = "Er gaat niets boven eigen potje koken. Maak éénpans-gerechten met smaak!";

enz.[/JS]
NB: in het DOM (Document Object Model) van de html krijgt het eerste element altijd een 0 en niet een 1!

Van lijst naar html-code
De html-structuur van zo'n blokje is steeds hetzelfde, en de inhoud kan er in gedropt worden met een functie:
[JS]function vulVak(n, rnd){
var inh = '<p class="wissel-link"><a href="http:\/\/'+link_url[rnd]+'"><img src="'+link_img[rnd]+'" alt=""><br>';
inh += '<span>'+link_url[rnd]+'<\/span><\/a>';
inh += '<div class="wissel-txt">';
inh += ' <h2>'+link_kop[rnd]+'<\/h2><p>'+link_txt[rnd]+'<\/p><\/div>';
var vak = document.getElementById('vak-'+n); //pak nu het betreffende vak bij zijn lurven
vak.innerHTML = inh; // en vul dat met de klaargezette inhoud
}
[/JS]
Daarin is "n" het eerste, tweede of derde vak dat gevuld moet worden, en "rnd" staat voor het random-getal dat bij dat vak moet passen.
De uitkomst wordt dan bijvoorbeeld voor vak 3 (n=3) en bv. een rnd=2:
HTML:
<div class="wisselvak" id="vak-3">
    <p class="wissel-link"><a href="http:www.blotehemelreizen.nl"><img src="images/alpen.jpg" alt="" /><br />
    <span>www.blotehemelreizen.nl</span></a></p>
    <div class="wissel-txt">
        <h2>Alles geregeld</h2>
        <p>Wilt u echt nergens naar hoeven omkijken? Boek onze geheel verzorgde reizen!</p>
    </div>
</div>
De "classes" die er in staan, zijn de aangrijpingspunten om met css steeds dezelfde opmaak te verzorgen van wat er in zo'n blok komt. Als die eenmaal één keer voor een vak is vastgesteld, hoef je je daar niet meer om te bekommeren; dan gaat alles vanzelf goed.

NB: in de praktijk begin je met de html + css voor de 3 vakken in orde te maken. Daarna ga je dat terugvertalen in het javascript zoals hierboven, zodat het random kan worden ingevuld.

Het trekken van de randoms
Nu moeten we dus aan die 3 verschillende randoms voor de 3 te vullen vakken komen. Een random die al geweest is, mag niet nog eens, anders komen er twee dezelfde vakken naast elkaar. Daar steken we een stokje voor!
De eerste random kan gewoon getrokken worden, pas bij de tweede en derde speelt het eventueel hetzelfde zijn. De tweede mag niet hetzelfde zijn als de eerste. De derde mag eveneens niet hetzelfde zijn als de eerste, maar ook niet hetzelfde als de tweede. Dat kan als volgt:
[JS]var random_1 = Math.floor(Math.random()*aantalDiv); // Output-waarden: 0, 1, 2, ... (aantalDiv - 1)
var random_2;
var random_3;

function randomize2(){
random_2 = Math.floor(Math.random()*aantalDiv); // Output-waarden: 0, 1, 2, ... (aantalDiv - 1)
if (random_2 == random_1){ // als dezelfde uitkomst als random_1
randomize2(); // nog eens proberen (tot niet dezelfde)
}
}

function randomize3(){
random_3 = Math.floor(Math.random()*aantalDiv); // Output-waarden: 0, 1, 2, ... (aantalDiv - 1)
if ((random_3 == random_1)||(random_3 == random_2)){ // als dezelfde uitkomst als random_1 of random_2
randomize3(); // nog eens proberen (tot niet dezelfde)
}
}
[/JS]
NB: ook hier is de eerste random-waarde: 0 en niet 1. Dat loopt gelijk op met de waarden in de arrays (dus alle opties krijgen één nummer lager dan het aantal opties), en ze komen allemaal aan de beurt.

Opstarten
Nu alles klaar staat, moet vervolgens moet het handeltje in de goede volgorde aan de praat gebracht worden. Daar maken we weer een mooie functie voor:
[JS]function goRandom(){
vulVak(1,random_1); // random_1 was al gemaakt, vak 1 kan meteen gevuld worden
randomize2(); // random_2 trekken
vulVak(2,random_2); // vak 2 vullen n.a.v. random_2
randomize3(); // random_3 trekken
vulVak(3,random_3); // vak 3 vullen n.a.v. random_3
}[/JS]
Die functie moet automatisch gaan draaien als de pagina ingeladen is (niet eerder, want dan staan de vakken <div class="wisselvak" id="vak-1"> enz. nog niet in de html, en dan kan het script niets met zo'n id doen):
[JS]window.onload = function(){
goRandom();
}[/JS]

De noscript-variant
In principe zouden we nu in de html kunnen volstaan met lege vakken:
HTML:
<div class="wisselvak" id="vak-1">
</div>
<div class="wisselvak" id="vak-2">
</div>
<div class="wisselvak" id="vak-3">
</div>
... want via het script worden ze met op maat gesneden "innerHTML" gevuld.
Maar als dan in een browser javascript niet ondersteund wordt of niet aan staat, is er helemaal niets te zien. Dus vullen we de 3 vakken met 3 opties naar keuze: die worden getoond als er geen javascript is. Zodra het javascript aan de gang gaat, wordt deze inhoud vervangen door die van het script.

Klaar en testen maar
Succes!
CSShunter
 
Laatst bewerkt:
csshunter heeft een prima oplossing.. als code-schoonheids puntjes kan ik er dit nog bijvoegen:

je kunt ook je data in json doen in 1x;

Code:
<html>
<head>
<script type="text/javascript"><!--
var allContent = [
  {
     image : '/path/to/image.jpg',
     url : '/path/to/someurl.html',
     kop : 'bla bla',
     text : 'blie blie'
  },
  { ...repeat vorige blok } //GEEN "," na het blok als het het laatste blok is.. IE vind dat niet leuk
];

function vulVak(n, rnd){
    var inh = '<p class="wissel-link"><a href="'+allContent[rnd].url+'"><img src="'+allContent[rnd].image+'" alt=""><br>';
    inh    += '<span>'+allContent[rnd].url+'<\/span><\/a>';
    inh    += '<div class="wissel-txt">';
    inh    += '   <h2>'+allContent[rnd].kop+'<\/h2><p>'+allContent[rnd].text+'<\/p><\/div>';
    var vak = document.getElementById('vak-'+n); 
    vak.innerHTML = inh;                
}

function goRandom() {
  var random_1 = Math.floor(Math.random()*allContent.length);
  var random_2 = Math.floor(Math.random()*allContent.length);
  while (random_2 == random_1){ 
  // als dezelfde uitkomst als random_1
  // nog eens proberen (tot niet dezelfde)
        random_2 = Math.floor(Math.random()*allContent.length);   
  };
  var random_3 = Math.floor(Math.random()*allContent.length); 
  while ((random_3 == random_1)||(random_3 == random_2)){
      random_3 = Math.floor(Math.random()*allContent.length); 
  };

  vulVak(1,random_1);
  vulVak(2,random_2);
  vulVak(3,random_3);
}
--></script>
</head>
<body onload="goRandom()">
<div class="wisselvak" id="vak-1">
</div>
<div class="wisselvak" id="vak-2">
</div>
<div class="wisselvak" id="vak-3">
</div>
</body>
</html>
 
Wauauauwwwww, wat een hulp! Echt geweldig en hartstikke bedankt!!!!
Ik ga er mee aan de slag, vandeweek druk, maar ik ga er zeker werk van maken.
Ik laat het jullie nog weten .....
 
Finishing touch

Wat er nog bij hoort:
  • De images precies op maat maken, zodat die geen overbodige extra laadtijd souperen.
  • Om de inhoud van de wisselvakken nog een <noscript>...</noscript> plaatsen, zodat de 3 default vakken (met name de images daarin) niet ingeladen hoeven te worden als javascript aan staat. Geeft ook weer snellere doorkomst. Scheelt ook geflits in IE (7 in elk geval).
  • In de css kunnen de classes binnen de vakken <div class="wisselvak"> gemist worden door het anders op te schrijven. Maakt ook de function vulVak(n, rnd){...} kleiner en overzichtelijker.
In het javascript heb ik de if-loops vervangen door while (zoals in de code van rajmv hierboven), dat is een stuk mooier.
De json-notatie heb ik niet overgenomen, om de pedagogische didactiek van m'n eerdere post niet te verstoren. ;)
Gegroet!
CSShunter
 
Aangepast ???

Hallo!
Nou ik ben een stuk opgeschoten, maar heb nog een paar vragen waar ik niet uitkom. Ik heb alles ingevuld en ze i.p.v. naast elkaar, onder elkaar geplaatst en de css aangepast.
Wat me niet lukt (ik heb een aantal dingen geprobeerd) is ....

- om de link naar de website onder de tekst te plaatsen
- alle inhoud rechts van de foto
- ik heb een vierde erbij geplaatst, maar die gaat toch soms dubbel met een van de andere

Het voorbeeld http://beautyfarms.nl/test-random.html
css: http://beautyfarms.nl/style-random.css

Kunnen jullie me nog wat verder helpen?
 
Daar gaan we! (even uit m'n hoofd, niet getest).

de link naar de website onder de tekst plaatsen
en alle inhoud rechts van de foto

html
In de html de vorm wijzigen in:
HTML:
<div class="wisselvak" id="vak-1">
   <noscript>
      <a href="http://www.thermae2000.nl"><img src="images/dn/thermaephoto.jpg" alt="Thermae2000" /></a>
      <div>
         <h2>Thermae 2000 - Valkenburg aan de Geul</h2>
         <h3>Een van de grootste wellnesscentra</h3>
         <p>Thermae 2000, als een van de grootste wellnesscentra van Nederland, is ...<br />
         <br /><a href="http://www.thermae2000.nl">www.thermae2000.nl</a></p>
      </div>
   </noscript>
</div>
(enz. voor de andere wisselvakken)

=======
css
Toevoegen aan de css (voor de hoofdzaken):
Code:
.wisselvak {
   ...
   clear: left;
   }
.wisselvak img {
   float: left; 
   margin-right: 10px;
   }

=======
javascript
De function vulVak(n, rnd) aanpassen tot:
[JS]function vulVak(n, rnd){
var inh = '<a href="http:\/\/'+link_url[rnd]+'"><img src="'+link_img[rnd]+'" alt=""><\/a>';
inh += '<div><h2>'+link_kop[rnd]+'<\/h2><h3>'+link_slogan[rnd]+'<\/h3>';
inh += '<p>'+link_txt[rnd]+'<br \/><br \/>';
inh += '<a href="http:\/\/'+link_url[rnd]+'">'+link_url[rnd]+'<\/a><\/p><\/div>';
var vak = document.getElementById('vak-'+n); // pak nu het betreffende vak bij zijn lurven
vak.innerHTML = inh; // en vul dat met de klaargezette inhoud
}[/JS]
Aangepast op de nieuwe html-/css-structuur, met o.a. de link onder de tekst.
Ook de slogans in de <h3>'s moesten er nog bij! :)

=======
ik heb een vierde erbij geplaatst, maar die gaat toch soms dubbel met een van de andere
Klopt! ;)
javascript
Nu staat er in de while bij de var random4 alleen: als de willekeurig getrokken waarde random4 gelijk is aan die van de eerder getrokken 1 of 3 (2 staat er niet bij) moet er opnieuw getrokken worden.
De 2 moet er dus ook bij (de || staat in javascript voor "of"):
[JS]while ( (random_4 == random_1) || (random_4 == random_2) || (random_4 == random_3) ){
random_4 = Math.floor(Math.random()*aantalDiv); // nogmaals een random_4 trekken
}[/JS]
Dat zou 'm moeten zijn.

Met vriendelijke groet,
CSShunter
 
Hoi motower,
Ja, je bent er bijna.
Wat ik niet wist, was dat er op dezelfde pagina nog een jQuery-script gebruikt wordt voor een slideshow. De initialisatie van die slideshow doorkruist die van de random-wisselaar.
Is op te lossen. :)
Het random-script verhuis je vanuit de <head> naar helemaal onderaan, vlak voor de </body></html>.
De functie
[JS]...
window.onload = function(){
goRandom();
}[/JS]
kan nu vervallen, en vervangen worden door alleen:
[JS]...
goRandom();[/JS]
Toelichting: door het onderaan zetten moeten alle andere dingen wel eerst gedownload zijn, dus de window.onload is niet meer nodig, en de goRandom() kan meteen getriggerd worden bij het bereiken van dat punt in het script.



Vlag in top?
Met vriendelijke groet,
CSShunter
_________
PS: doet u ook nog even de 37 html-errors wegwerken, voordat je aan het vlaggentouw trekt? ;)

PS-2: over de tabellen-in-tabellen-in-tabellen voor de opmaak en over de fixed font-size zal ik deze keer maar eens heel erg zwijgen. :P

[edit]Voor de finishing touch heb ik in de function vulVak(n, rnd) nog even een title="naar website" opgenomen, die je als tooltip ziet als je over een image bij een item hovert. Zie broncode.[/edit]
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan