Autor Zpráva
qwqwqw
Profil *
Zdravím, jen tak si experimentuji z JS a zajímá mně jestli mohu vytvořit pole (Array) z prvků -názvů jednoduchých funkcí (např. změna barvy, velikosti písma...). A potom jak ty náhodně zamíchané prvky pole - funkce přiřadit do klikacích nadpisů.
Díky za pomoc a rady.Nejsem odborník, jen si o prázdninách trošku hraju s JS.

var a;
a = new Array ( "funkcea()", "funkceb()", "funkcec()" )

for(i=a.length;i--;) a.push(a.splice(Math.floor(Math.random() * (i+1)),1)[0]);

document.getElementById("jedna").onclick="a[0]";
document.getElementById("dva").onclick="a[1]";
document.getElementById("tri").onclick="a[2]";
Kajman
Profil
Při nastavení onclicku nedávejte kolem pole uvozovky, aby se tam dal string z toho pole.
Radek9
Profil
qwqwqw:
Děláš to zbytečně složitě celé. Pár tipů:

1) Funkce nikdy (vážně nikdy) nedávej do řetězce. Můžeš mít úplně v pohodě pole funkcí. Taky se preferuje zápis pomocí hranatých závorek (místo new Array):
var a = [funkcea, funkceb, funkcec]
Mimochodem, není potřeba všem těm funkcím dávat název a potom je dávat do pole. Můžeš je rovnou definovat jako anonymní funkce uvnitř toho pole:
var a = [
  function () {
    // akce A
  },
  function () {
    // akce B
  },
  function () {
    // akce C
  },
]

2) Ačkoli ten tvůj zápis pole opravdu zamíchá, není to z toho úplně zřejmé. Taky to není úplně efektivní (neustále zmenšuješ a zvětšuješ velikost pole). Pokud máš malé pole, přijde mi čistší (ačkoli to stále není úplně efektivní, ale to je problém spíš u větších polí) použít sort:
a.sort(function () {
  return Math.random() - 0.5
  // Funkce Math.random vrací číslo od 0 do 1.
  // Odečteme 0.5, aby byl výsledek se stejnou pravděpodobností kladný, nebo záporný.
  // To zapříčiní, že se všechny prvky náhodně poprohazují.
})
Ono to nemá úplně dobré statistické vlastnosti, ale jak říkám, pro malá pole je to dostačující. Pokud bys chtěl něco pořádného a efektivního, tak použij Knuth-Fisher-Yates:
function knuthfisheryates(arr) {
  for (var i = 0; i < arr.length; ++i) {
    var j = Math.trunc(Math.random() * (i + 1))
    var tmp = arr[i]
    arr[i] = arr[j]
    arr[j] = tmp
  }
  return arr
}

knuthfisheryates(a)

3) Jak už psal Kajman, ty do onclicku nechceš přiřadit řetězec "a[x]", ale přímo prvek z toho pole. Takže takhle:
document.getElementById('jedna') = a[0]
document.getElementById('dva') = a[1]
document.getElementById('tri') = a[2]
Jistě si ale všimneš, že to není úplně pěkný zápis. Pokud bys přidával více prvků, musel bys přidat více řádků a více idček. To se dá řešit vícero způsoby. Buď zachováš id, dáš ty elementy taky do pole a projdeš to cyklem:
var b = [
  document.getElementById('jedna'),
  document.getElementById('dva'),
  document.getElementById('tri'),
]
for (var i = 0; i < a.length; ++i) {
  b[i].onclick = a[i]
}
Nebo těm elementům dáš stejnou třídu (v kódu nejakatrida) a vybereš je rovnou jako kolekci:
var b = document.querySelectorAll('.nejakatrida')
for (var i = 0; i < a.length; ++i) {
  b[i].onclick = a[i]
}
Kajman
Profil
Raději ověřit i počet elementů.
var b = document.querySelectorAll('.nejakatrida')
for (var i = 0; i < a.length && i < b.length; ++i) {
  b[i].onclick = a[i]
}

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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

0