Autor Zpráva
joe
Profil
Ahoj,

doporučuje se, aby v samotném HTML bylo co nejméně JavaScriptu a tak se přidávají události automaticky, tj. že se projdou například všechny odkazy a u těch, který vyhovují, se přidá třeba nějaká ta událost.
Není lepší přidávat události přímo do kódu, přece než se projdou všechny některé elementy, může to nějakou dobu trvat, ne?

Nebo se bojím zbytečně? :-)
Jan Tvrdík
Profil
Bojíš se zbytečně, protože to přiřazení událostí zabere jen zlomek sekundy.
joe
Profil
Jan Tvrdík
Ok, ale co když po načtení (onload) procházel nejenom odkazy, ale i víc elementů. Případně existuje něco i pro JavaScript, co spočítá jak trval skript dlouho?
ah01
Profil
1) o čas se bojíš zbytečně, musel bys dělat opravdu velké kejkle, aby to bylo poznat

2) mnohem znatelnější ale je jestli svůj skript spouštíš na onload nebo ondomready

3) měřit můžeš buď pomocí Firebug (doplněk do FF) nebo třeba přímo
var end, start = new Date();
... nějaký časově náročný kód ...
end = new Date();
alert((end - start) + " ms")
joe
Profil
ah01
1) ok
2) Kde jinde bych měl skript spouštět, když má například k nějakým odkazům přidat nějakou událost?
Třeba na konec stránky přidat:
<script> funkce(); </script> ?
3) jak jednoduché :) K tomu FireBugu, znám ho dobře na CSS, ale na JS ne, nikde jsem neobjevil nějaký čas, jak dlouho probíhá skript. Teď jsem našel čas na záložce Net, ale tím asi délku trvání nějaké funkce nezjistím nebo ano?

ah01 & Jan Tvrdík
Díky.
Chamurappi
Profil
Reaguji na joa:
Pracuješ-li s „živou“ kolekcí získanou pomocí metod DOMu (třeba getElementsByTagName či childNodes), může být z hlediska výkonu efektivnější vyrobit si na kejkle její „mrtvou“ napodobeninu v poli. Živá kolekce je totiž připravená kdykoliv změnit své složení a prohlížeč může ověřovat její složení častěji, než je vhodné.
joe
Profil
Chamurappi
Ok, budu na to myslet.

Ještě mám takovou otázku.

Když přidávám událost pomocí addEventListener / attachEvent (v IE) a přidám ji na nějaký odkaz a teď bych chtěl, aby když kliknu, tak se provedla funkce, ale na adresu v href se už nepřesměrovalo.

Tedy něco jako
function test() { alert('Nejde to!'); }

<a href="http://example.com" onclick="test(); return false;">Example.com</a>

Jen s tím rozdílem, že tam "přidávám"
<a href="http://example.com" onclick="test(this);">Example.com</a>


Tak jak mám funkci test upravit? Zkoušel jsem nastavit returnValue z event na false, ale tak mi to nefunguje a stejně to skočí na example.com.
joe
Profil
Už jsem našel co jsem hledal - preventDefault a returnValue.
los
Profil *
Oveľa efektívnejšie než priradenie udalosti každému elementu je spracovávať udalosti rodičovského elementu. Konkrétny element, ktorý danú udalosť vyvolal, je vo vlastnosti udalosti target/srcElement.
joe
Profil
los
Ale jak mám "rozdělit" ty, kterým chci dát událost rodičovského elementu a kterým ne. Můj problém byl, že jsem přidal událost odkazu (tedy rodičovskému prvku obrázku, který byl v odkazu), ale po kliknutí na odkaz v obrázku, mi JavaScript hlásil, že klikám na obrázek a já jsem chtěl, aby mi hlásil, že klikám na odkaz. Možná jsi to napsal dobře a jen to nechápu, to je možné :-)
los
Profil *
Napr. chceš obsluhovať kliknutie všetkých odkazov, ktoré majú atribút class rovný "test". V tom prípade bude obsluha udalosti v nadradenom elemente vyzerať napr. takto (netestované, môžu tam byť chyby):

element.onclick = function(e) {
  e = e || window.event;

  for (var anchor = e.target || e.srcElement; anchor; anchor = anchor.parentNode)
    if (anchor.tagName == "A" && anchor.className == "test") {
      alert(anchor.innerHTML);
      return false;
    }
}

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

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