webForumDet fria alternativet

Funktion för bannerrotation

7 svar · 1 479 visningar · startad av MickeA.com

MickeA.comMedlem sedan feb. 20034 441 inlägg
#1

Tjena hej,

Står still i huvudet... Jag är ute efter en funktion för att visa banners som ska skrivas ut med javascript. Såhär har jag gjort:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title> new document </title>
<meta name="generator" content="editplus" />
<script type="text/javascript">
	var Curr = 0;
</script>
</head>

<body>

<div>Inledande text före banner 1...</div>
<!-- BANNER -->
<div><script type="text/javascript" src="test.php"></script></div><br />

<div>Mer text mellan bilderna....</div>
<!-- BANNER -->
<div><script type="text/javascript" src="test.php"></script></div><br />

<div>Text som visas längst ner på sidan...</div>

</body>
</html>

test.php ser ut såhär:

<?php
$Arr = array(
	array(
		"id" => 1,
		"link" => "http://www.google.se",
		"image" => "img1.jpg"
	),
	array(
		"id" => 2,
		"link" => "http://msn.com",
		"image" => "img2.jpg"
	),
);
?>
var temp = <?php echo json_encode($Arr);?>;

function shuffle(sourceArray) {
    for (var n = 0; n < sourceArray.length - 1; n++) {
        var k = n + Math.floor(Math.random() * (sourceArray.length - n));

        var temp = sourceArray[k];
        sourceArray[k] = sourceArray[n];
        sourceArray[n] = temp;
    }
}
for(var i = 0; i <= temp.length - 1; i++){
	if(Curr == temp[i]['id']){
		delete temp[i];
		break;
	}
}

shuffle(temp);
var foo = temp[0];
document.write("<img src=\"" + foo['image'] + "\" alt=\"" + foo['link'] + "\" />");

Curr = foo['id'];

Vad som då ska hända är...

Banners ska slumpas fram i php-filen som genererar javascript. Samma banner ska inte kunna visas två gånger, utan när den första hämtas så ska den "låsas", så att nästa objekt ska slumpas fram. Koden ovan fungerar "ibland", vissa gånger visas bild 1 / 2, men ibland får jag ett felmeddelande som inte säger någonting.

Kan någon hjälpa mig att komma vidare?

Tack!

Danne VMedlem sedan aug. 20068 090 inlägg
#2

MickeA.com skrev:

Banners ska slumpas fram i php-filen som genererar javascript. Samma banner ska inte kunna visas två gånger, utan när den första hämtas så ska den "låsas", så att nästa objekt ska slumpas fram. Koden ovan fungerar "ibland", vissa gånger visas bild 1 / 2, men ibland får jag ett felmeddelande som inte säger någonting.

Kan någon hjälpa mig att komma vidare?

Tack!

Ingen hjälp per se, men eftersom jag borrat i det här en del själv så kan jag ju dela med mig av erfarenheten...

Faktum är att det där med roterande banners inte är så enkelt som man först frestas att tro. Det finns en jädra massa frågor som man normalt inte alls tänker på först men som blir ganska uppenbara så småningom, t.ex:

  • Vad menar du med "inte två gånger"? Att samma banner inte ska kunna visas två ggr per session? Eller per sida?
  • Ska dom laddas när sidan laddas, eller ska dom laddas med jämna mellanrum även om en sida inte laddas om?
  • Och vad ska hända om du t.ex. har 10 banners och alla har visats en gång, ska det bli tomt i bannerutrymmet då, eller ska dom börja om från början?

Ska man få annonserna att rotera till 100% "rättvist" (alla ska visas lika ofta osv) så blir det alltså till slut alldeles för invecklat. De flesta brukar därför nöja sig med att låta annonserna slumpas fram - punkt slut. Om en av dom råkar visas några ggr oftare per dygn så må det vara hänt. I långa loppet jämnar det ut sig.

Och då finns det ju en gäng hyfsade rotators därute att plocka ner och använda alldeles gratis - eller i vart fall billigt...

MickeA.comMedlem sedan feb. 20034 441 inlägg
#3

Jösses vad du krånglar till det... Jag är inte ute efter ett helt rotationssystem som du beskriver utan en mycket enkel pryl:

Som man kan tyda av koden ovan så ska samma fil generera två bilder, och självklart får det inte bli samma bilder på bägge ställena. Bilderna ska INTE bytas ut förrän man laddar om sidan.

voigtann1Medlem sedan juni 20019 519 inlägg
#4

Kan det vara olika banners från din test.php (med någon Querystring eller så)?

Fast det borde inte vara något problem:
Kolla om en global variabel (en array kanske) finns, om inte så skapar du den första gången du kör test.php, om den finns så kollar du om id:et finns i arrayn, om den gör det, slumpar igen, annars rendera ut den och pushar in ID:et i din array.

För just nu skriver du över arrayn varje gång du kör test.php filen.

eller om det är samma objekt hela tiden:

if(typeof temp === "undefined"){
    temp = <PHP>
}

istället för temp = <PHP> bara.

nitro2k01Medlem sedan aug. 20039 342 inlägg
#5

Hmm, din nuvarande blandar runt alla element i arrayen bara för att välja ut ett element. Onödigt! :)

För övrigt, behöver du verkligen id till något? json_encode i sig skapar en vanlig JS-array, alltså [a,b,c,d] osv, och då får du id på köpet. Sen kanske id kommer från databasen och behövs till något annat...

Här är en mer generisk kodsnutt som klarar av valfritt antal banners och valfritt antal placeringar på sidan.

// A generated array with banners
var temp = <?php echo json_encode($Arr);?>; 

// This creates a new, empty array if lastBanners is undefined.
var lastBanners = lastBanners || [];

// Safety counter to prevent an infinite loop, for example if there are fewer banners than the number of times the ad is shown on the page.
// (Will end the loop after 50 iterations.)
var counter = 50;

// Generate random values until you hit one that is not in the list.
do{
	bannerIndex = parseInt(Math.random()*temp.length);
}while(lastBanners.indexOf(bannerIndex) != -1 && --counter>0)

// Save the current banner value for later.
lastBanners.push(bannerIndex);

// Get the selected banner object.
foo = temp[bannerIndex];

// Print the selected banner
document.write("<img src=\"" + foo['image'] + "\" alt=\"" + foo['link'] + "\" />");
voigtann1Medlem sedan juni 20019 519 inlägg
#6

lite ändringar kanske:

counter kan väl sättas till temp.length
Sen om inte ett bannerIndex hittas så kommer du få JS fel (kommer bara vara om första gången om temp är helt tom dock.

MickeA.comMedlem sedan feb. 20034 441 inlägg
#7

nitro2k01 skrev:

Här är en mer generisk kodsnutt som klarar av valfritt antal banners och valfritt antal placeringar på sidan.

Som en jävla dans, tack som fan!

;)

nitro2k01Medlem sedan aug. 20039 342 inlägg
#8

voigtann1 skrev:

counter kan väl sättas till temp.length

Dålig idé eftersom slumpgeneratorn kan behöva hålla på längre än så. Tänk om du får id för en använd banner 5 gånger i rad?
Däremot borde man göra helt "rätt", men jag får inte betalt för detta. :)

voigtann1 skrev:

Sen om inte ett bannerIndex hittas så kommer du få JS fel (kommer bara vara om första gången om temp är helt tom dock.

Nja, då kommer du ju få fel varje gång, om inte arrayen av någon outgrundklig anledning är tom fösta gång men inte nästa gång.

För övrigt. Jag anser att det är lite onödigt att inkludera samma fil på flera ställen. Jag skulle nog personligen ha stoppat all koda i en include överst och sen göra ett funktionsanrop längre ner. Och bort med "temp"! Reviderad kod:

// A generated array with banners
banners = <?php echo json_encode($Arr);?>; 

// This creates a new, empty array.
lastBanners = [];

function printBanner(){
	// Safety counter to prevent an infinite loop, for example if there are fewer banners than the number of times the ad is shown on the page.
	// (Will end the loop after 50 iterations.)
	var counter = 50, bannerIndex, foo;

	// Generate random values until you hit one that is not in the list.
	do{
		bannerIndex = parseInt(Math.random()*banners.length);
	}while(lastBanners.indexOf(bannerIndex) != -1 && --counter>0)

	// Save the current banner value for later.
	lastBanners.push(bannerIndex);

	// Get the selected banner object.
	foo = banners[bannerIndex];

	// Print the selected banner
	document.write("<img src=\"" + foo['image'] + "\" alt=\"" + foo['link'] + "\" />"); 
}

Sedan anropar du printBanner() vid behov.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title> new document </title>
<meta name="generator" content="editplus" />
<script type="text/javascript" src="test.php"></script>
</head>

<body>

<div>Inledande text före banner 1...</div>
<!-- BANNER -->
<div><script type="text/javascript">printBanner();</script></div><br />

<div>Mer text mellan bilderna....</div>
<!-- BANNER -->
<div><script type="text/javascript">printBanner();</script></div><br />

<div>Text som visas längst ner på sidan...</div>

</body>
137 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)