Autor Zpráva
siklka
Profil
Zdravím,

jsem začátečník co se týče scriptů. Mám script na náhodné zobrazování 4 bannerů. Problém je, že se zobrazí jeden banner klidně 4x místo jednou a zbylé 3 jiné. Můžete mi prosím poradit, jak mám upravit script, aby se jeden banner zobrazil jen 1 a né více krát?

děkuji

 <SCRIPT Language="JavaScript">
  <!--
  Pics = new Array(0); new Array(1);
              new Array(2); new Array(3);
              new Array(4);new Array(5);
              new Array(6);new Array(7);
              ...
  Pics[0] = '<A HREF="http://odkaz" target="_blank" >'+
    '<IMG SRC="http://adresa banneru" ALT="první banner" Border=0></A>';  
Pics[1] = '<A HREF="http://odkaz" target="_blank" >'+
    '<IMG SRC="http://adresa banneru" ALT="drůhý banner" Border=0></A>';  
    .....
           
  // -->
</SCRIPT>



<SCRIPT LANGUAGE="JavaScript">
  <!--
  document.write("<right>");
  document.write(Pics[Math.floor(Math.random() * Pics.length)]);
  document.write(Pics[Math.floor(Math.random() * Pics.length)]);
  document.write(Pics[Math.floor(Math.random() * Pics.length)]);
  document.write(Pics[Math.floor(Math.random() * Pics.length)]);
  document.write("<BR><SMALL>Náhodný banner</SMALL><BR>");
  document.write("</right>");
  // -->
</SCRIPT>
Sir Tom
Profil
siklka:
Také zdravím,

nejdříve - chybně deklaruješ pole - správně je:

var Pics = new Array();
a to stačí...

poté do tohoto pole vkládej odkazy <A> takto (uvozovky na konci a na začátku, uvozovky uprostřed jsou napsány jako \"):

Pics[0] = "<A HREF=\"http://odkaz\" target=\"_blank\" ><IMG SRC=\"http://adresa banneru\" ALT=\"první banner\" Border=\"0\"></A>";

A poté z těchto 4 můžeš zobrazit jeden náhodný:

<SCRIPT LANGUAGE="JavaScript">
  <!--
  document.write("<right>");
  document.write(Pics[Math.floor(Math.random() * Pics.length)]);
  document.write("<BR><SMALL>Náhodný banner</SMALL><BR>");
  document.write("</right>");
  // -->
</SCRIPT>
siklka
Profil
jenže já chci zobrazit 4 náhodné z 20 bannerů, proto tam mám 4x
  document.write(Pics[Math.floor(Math.random() * Pics.length)]);
  document.write(Pics[Math.floor(Math.random() * Pics.length)]);
  document.write(Pics[Math.floor(Math.random() * Pics.length)]);
  document.write(Pics[Math.floor(Math.random() * Pics.length)]);

ale problém je, že každý ( document.write(Pics[Math.floor(Math.random() * Pics.length)]);) si vybere podle svého a nekouká na to co vybral ten předtím, takže se pak klidně zobrazí 1 banner více krát a já nevím jak to ošetřit
DarkMeni
Profil
Z pole bannerů si buď vytvořit další pomocné pole, nebo ten vybraný banner odstranit po náhodném vybrání v základním poli, aby nemohl být vybrán 2x.
var pics = [
  'http://adresa.com/obrazek0.jpg',
  'http://adresa.com/obrazek1.jpg',
  'http://adresa.com/obrazek2.jpg',
  'http://adresa.com/obrazek3.jpg',
  'http://adresa.com/obrazek4.jpg',
  'http://adresa.com/obrazek5.jpg',
  //...
  'http://adresa.com/obrazek19.jpg'
];
function nahodne_bannery(pocet){
  //S pomocným polem, který má být stejné jako základní, ale bude se z něj odstraňovat:
  var pomocne_pole = pics, html_vystup = '';
  for(var pruchod = 0; pruchod < pocet; pruchod++){
    var random_int = Math.floor(Math.random() * pomocne_pole['length']);
    html_vystup += '<a href="'+pomocne_pole[random_int]+'" target="_blank"><img src="'+pomocne_pole[random_int]+'" alt="banner"></a>';
    delete pomocne_pole[random_int]; //Možná je na odstraňování prvků z pole jiná metoda, ale toto má myslim fungovat taky
  }
  document.getElementById('misto_pro_bannery').innerHTML = html_vystup;
  //Nebo místo zapisování do elementu, který musí existovat (jinak to háže chyby), s id "misto_pro_bannery" se to může zapsat rovnou do dokumentu na místo provádění skriptu metodou document.write, ale to při použítí časovačů (třeba pro dynamickou změnu) přepíše celý dokument. Pak je jediná možnost použít metody document.getElement(s)ById(Name nebo Class)...
  return true;
  //nebo místo toho vrátit html výstup jako výsledek funkce a pak s tím ještě něco třeba udělat:
  //return html_output;
}
nahodne_bannery(4);
//nebo při vrácení html výstupu jako výsledku funkce:
//document.write(nahodne_bannery(4));
Taky to jde zapsat do funkce, a pak se pomocní pole vytvářet nemusí, nebo to jde napsat i bez pomocného pole pro jednorázové použití. Záleží na tom co se s tim bude dít dál, jestli se mají dynamicky měnit nebo se zobrazí jen jednou po načtení a pak už se pořadí časovačem měnit nebude (to je to jednorázové použití).
siklka
Profil
děkuji za snahu mi to vysvětlit, ale ztratila jsem se už na začátku po nadefinování adres obrázků

scripty se učí jako samouk po chvilkách, ale vidím, že mi to ještě nějakou chvíli dá než se do toho dostanu natolik, abych si něco vytvořila nebo aspoň poupravit ke svému
Giga
Profil *
siklka

Asi najskôr vyrieš algoritmus a až po tom rieš, ako to zapíšeš.

Napr.: Pri načítaní poľa bannerov každému priradíš náhodné číslo.
Pole zoradíš podľa tých náhodných čísiel. Potom už len postupne zobrazuješ
štvorice po sebe nasledujúcich bannerov.
DarkMeni
Profil
siklka:
nadefinování adres obrázků
Potom je ten skript zabalenej do funkce, aby se mohl zavolat třeba víckrát (při časování - aby se ty banery třeba každou minutu měnily), ale taky to jde zjednodušit na jednorázové použití, kde by ten kód bral asi jen 5 řádků (+ další řádky s definicí adres k obrázkům). Na jakpsatweb.cz v sekci JavaScript o tom, co jsem napsal do ukázky, jak by to mohlo vypadat, něco bude (minimálně tam jsou popsané funkce a cykly (for). Jinak zápis pole['length'] pochopí javascript stejně jako pole.length, a delete proměnná (teď si nejsem jistý syntaxí - jestli delete(proměnná) nebo s mezerou: delete proměnná) odstraní tu proměnnou.

Ale nejlepší asi bude, jak psal Giga, si vymyslet algorytmus s metodama, který znáš, a pak to podle něj zapsat, a až objevíš třeba efektivnější metodu, tak ten kód tak trochu přepsat.

A ne vždicky má klient javascript zapnutý, takže jestli tam ty banery musí být, tak by nebylo špatný je dát do html (nebo php, podle toho v čem píšeš) zabalené v nějakém elementu s id, aby se pak daly přepsat na náhodné, jinak s tím document.write (nebo novější, lepší ale asi složitější přístup k elementům přes document.getElementById...), když bude mít klient vypnutý javascript nehne.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: