Autor Zpráva
Jcas
Profil *
Dobrý den
Měl jsem tady v diskuzi dotaz, při kterým jsem tvořil script.
Omlouvám se že zakládám další téma, ale když je v diskuzi moc příspěvků, tak přestávají chodit reakce, ale hlavně tento dotaz myslím nesouvisí s předchozí debatou (i když se jedná o stejný script)

Vytvořil jsem scrip na plynulou výměnu obr. (celých div). Výsledný script je na konci diskuze.

http://diskuse.jakpsatweb.cz/?action=vthread&forum=8&topic=110254


Funguje výborně, ale neznám souvislosti.
1.Nevím jestli to není "prasácký script" a jestli jej mohu s klidným svědomým používat na netu.
2.Nevím co to bude dělat, když někdo bude mít vypnutý javascript
3.Hlavně nevím, jestli to nebude velké zatížení na PC.
3a. událost napojím např. na klik a je to v poho. ¨Script je volán jen jednou
3b. onload - takhle script volá třeba 10 div současně. Mně to funguje, ale můžu to takto používat?
_es
Profil
Jcas:
Asi sa treba hlavne snažiť pochopiť, ako ten skript funguje, čo by snáď u teba mohlo platiť.
Menší návrh na zlepšenie: http://diskuse.jakpsatweb.cz/.sandbox/?action=vthread&forum=8&topic=106539#eval
Chamurappi
Profil
Reaguji na Jcase:
ad 1) Viz _es. Myslím, že ten skript je napsaný zbytečně složitě a nešikovně, ale nemám chuť ho přepisovat.
ad 2) Nebude dělat vůbec nic. Když není zapnutý JavaScript, nevykonává se JavaScript :-) … můžeš si to zkusit.
ad 3) Máš tam nulový delay, ten skript se bude vykonávat maximální rychlostí, jakou mu počítač/prohlížeč dovolí, což mi připadá jako nesmysl.
Jcas
Profil *
Ten nulový delay máš na mysli při samotném volání funkce alpha_show?
_es
Profil
Jcas:
Myslí lokálnu premennú delay vo funkcii AlphaFade.alpha_show, ktorú máš nastavenú na 0 a predávaš ju do rôznych volaní setTimeout.
Prečo sa to celé nesnažíš rozmeniť "na drobné" a pochopiť, ale stále tu dávaš na posúdenie nejaký nevzhľadný kus kódu?
Mimochodom, vzniká ti pri tom nedeklarovaná globálna premenná alphac.
Jcas
Profil *
Nechápu
viz "Prečo sa to celé nesnažíš rozmeniť "na drobné" a pochopiť, ale stále tu dávaš na posúdenie nejaký nevzhľadný kus kódu? "

Od počátku se snažím pitvat script řádek po řádku a pochopit, co kterej příkaz dělá. Co dělám špatně?
_es
Profil
Jcas:
Od počátku se snažím pitvat script řádek po řádku a pochopit, co kterej příkaz dělá. Co dělám špatně?

A čo ti teda bráni aplikovať všetky tie rady?
Ak by si si trochu lepšie naštudoval syntax JS z nejakej knihy, alebo aj napríklad z dokumentácie Mozilly - odkazy v kóde, tak by si nemusel tak tápať.
Jcas
Profil *
Takže nevhodně použité setTimeout.
Nesmyslně definováno delay na 0.
A je chyba, že tam je nedeklarovaná proměná.

= prostudovat dokumentaci a identifikovat, proč jsem udělal tyto chyby (možná jsem část převzal z nabídnutého kódu jako vzoru). Prostudovat dokumentaci, jak se to dělá správně.

Už mi chybí teda pouze pořádná ČESKÁ dokumentace.
Witiko
Profil
Jcas:
Už mi chybí teda pouze pořádná ČESKÁ dokumentace.

Raději se začni připravovat na to, že u většiny programovacích jazyků nalezneš dokumentaci pouze v angličtině. Chceš se učit programovací jazyky, začni s normálním jazykem, principy jsou podobné. Je tu pak samozřejmě několik knih, ale ty rychle zastarávají, pokud vím není na trhu o javascriptu momentálně nic aktuálního.

Okomentovaný script:
<script type="text/javascript">

var AlphaFade =
  {
  alpha_show : function (kdo, num, pocet)                          
    {
    var id = kdo + num;                                                             //odchycení id objektu, který chcu měnit
    var e = document.getElementById(id).style;                
   
    if (e.opacity == 0.1 || e.filter == "alpha(opacity=10)")           //podmínka pro zjištění, jestli budu zeslabovat, nebo zesilovat
      {
      from = 0; // !! NEDEKLAROVANÁ GLOBÁLNÍ PROMĚNNÁ
      to = 100; // !! NEDEKLAROVANÁ GLOBÁLNÍ PROMĚNNÁ
      direction=1; // !! NEDEKLAROVANÁ GLOBÁLNÍ PROMĚNNÁ
      }
    else {
      from = 100; // !! NEDEKLAROVANÁ GLOBÁLNÍ PROMĚNNÁ
      to = 0; // !! NEDEKLAROVANÁ GLOBÁLNÍ PROMĚNNÁ
      var direction=-1; // !! NEDEKLAROVANÁ GLOBÁLNÍ PROMĚNNÁ
      }
//    if (!duration) duration = 3000;
//    if (!from) from = 100;
//    if (!to) to = 100;
    var totalframes = 100;
    var step = 22;
    var delay = 0;
    var frame = 0; // pryč s tímhle
    alphac=from;  // !! NEDEKLAROVANÁ GLOBÁLNÍ PROMĚNNÁ, pokud má jít o proměnnou lokální dostupnou pouze uvnitř funkce, definovat pomocí var keywordu. Pokud globální definovat pomocí var keywordu mimo funkci.

    while (frame < totalframes) 
    // for(var frame = 0; frame < totalframes; frame++)
      {
      frame++; // pryč s tímhle
      alphac=alphac+(1*direction); // alphac += direction;
      setTimeout("AlphaFade.set_alpha('"+id+"',"+alphac+")", delay);
      /* 
      
      (function(id, alphac) {
        window.setTimeout(function(){
          AlphaFade.set_alpha(id,alphac);
        }, delay);
      })(id, alphac);
      
      Lexikální uzávěr, způsobí, že funkce bude pracovat s proměnnou
      alphac předanou jí jako argument, ne alphac, která se během
      cyklu mění.
      
      */
      delay=delay+step;
      }
    setTimeout("AlphaFade.set_alpha('"+id+"',"+to+");", delay);
    
      /* 
      
      (function(id) {
        window.setTimeout(function(){
          AlphaFade.set_alpha(id, to);
        }, delay);
      })(id);
      
      
      */
      
    if (alphac == 100 && num == '1')                                    //podmínka odchytí okamžik, kdy se opět zviditelnil první objekt
      {
      num++;
         while (num < pocet)                                                     //cyklus vrátí vše do původního stavu
         // for cyklus prosím?
         {
         var id = kdo + num; // lokální proměnná id již je deklarována, proč ji deklarujeme znovu... a několikanásobně?
         setTimeout("AlphaFade.set_alpha('"+id+"', "+alphac+");", delay);
         
        /* 
        
        (function(id) {
          window.setTimeout(function(){
            AlphaFade.set_alpha(id, alphac);
          }, delay);
        })(id);
        
        
        */
         
         num++;
         }
      setTimeout("AlphaFade.alpha_show('"+kdo+"',"+1+", "+pocet+");", 3000);   
      
         /* 
        
        (function(kdo, pocet) {
          window.setTimeout(function(){
            AlphaFade.alpha_show(kdo, 1, pocet);
          }, delay);
        })(kdo, pocet);
        
        
        */
      
      }
      else                                                                             //při všech ostatních situací se vola funkce change
      {
      setTimeout("AlphaFade.change('"+kdo+"', "+num+", "+pocet+");", delay); 
      
        /* 
        
        (function(kdo, num, pocet) {
          window.setTimeout(function(){
            AlphaFade.change(kdo, num, pocet);
          }, delay);
        })(kdo, num, pocet);
        
        
        */
      
      }
    },
  set_alpha : function (obj,opacity)                                        //funkce, která definuje opacity objektu na základě parametru
    {                                                                                // který obdrží při volání.
    var object = document.getElementById(obj).style;
    object.opacity = (opacity / 100);
    object.MozOpacity = (opacity / 100);
    object.KhtmlOpacity = (opacity / 100);
    object.filter = "alpha(opacity=" + opacity + ")";
    },
  change : function (kdo,num,pocet)                                        //funkce, která změní id, aby jsme mohli provádet show
    {                                                                                //s dalším objektem
    num ++;
    if (num<pocet)                                                                //zjistíme, jestli jsou už všechy objektu zprůhledněny,
      {                                                                                //kromě posledního
      setTimeout("AlphaFade.alpha_show('"+kdo+"', "+num+", "+pocet+");", 3000);    
      
        /* 
        
        (function(kdo, num, pocet) {
          window.setTimeout(function(){
            AlphaFade.alpha_show(kdo, num, pocet);
          }, 3000);
        })(kdo, num, pocet);
        
        
        */
        
      }
    else 
      {                                                                                //pokud ano, zavolá se show tak, aby se zviditelnil první objekt.
      var id = kdo + '1';
      setTimeout("AlphaFade.set_alpha('"+id+"', 10);", 3000);
      setTimeout("AlphaFade.alpha_show('"+kdo+"', "+1+", "+pocet+");", 3000);
      
        /* 
        
        (function(id, kdo, pocet) {
          window.setTimeout(function(){
            AlphaFade.set_alpha(id, 10);
            AlphaFade.alpha_show(kdo, 1, pocet);
          }, 3000);
        })(id, kdo, pocet);
        
        
        */
      
      }
   }
  }
</script>


Definice intervalů a timeoutů - nedefinovat funkci pomocí řetězce, v případě potřeby je vždy možné použít lexikální uzávěr v případě že je třeba zachovat pro funkci předávanou timeoutu / intervalu proměnné v tom stavu v jakém byly po zavolání funkce. Mé komentáře ale neřeší celkový problém scriptu, kterým je špatný návrh. Reference na veškeré funkce jsou uloženy v prostém objektu AlphaFade, nicméně objektovost vůbec nevyužívají a pracují s globálními proměnnými, což ve mně vyvolává tíživý pocit, že script nemůže obsluhovat více případů současně. Prasácké je rovněž řešení číslování divu, které by šlo krásně "neprasácky" vyřešit předáním názvů v poli, kdyby byl script napsán objektově.
_es
Profil
Witiko:
Je tu pak samozřejmě několik knih, ale ty rychle zastarávají, pokud vím není na trhu o javascriptu momentálně nic aktuálního.
Sú aj v češtine veľmi dobré a aktuálne knihy.
Staršia kniha, už netlačená, v ktorej je podrobne vysvetlená syntax samotného jadra JavaScriptu, môže byť užitočnejšia, než "aktuálna" kniha so zbierkou aktuálnych skriptov.
Witiko
Profil
_es:
môže byť užitočnejšia, než "aktuálna" kniha so zbierkou aktuálnych skriptov

Souhlasím, on ale sháněl dokumentaci v češtině. Aktuálně neznám knihu, která by zahrnovala veškeré funkce aktuální specifikace ECMA.
_es
Profil
Witiko:
Aktuálně neznám knihu, která by zahrnovala veškeré funkce aktuální specifikace ECMA.
Nemáš to trochu popletené?
O "aktuálnom" ECMA-262 3. edície je veľa veľmi starých kníh.
Witiko
Profil
_es:
O "aktuálnom" ECMA-262 3. edície je veľa veľmi starých kníh.

Nemýlím li-se, před nedávnem (v dubnu?) již byla vydaná verze ECMA-262-5 ke které je již dostupná dokumentace, ačkoliv zatím nevěřím v podporu prohlížečů.

http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf
_es
Profil
Witiko:
již byla vydaná verze ECMA-262-5 ke které je již dostupná dokumentace, ačkoliv zatím nevěřím v podporu prohlížečů.
Takže o tú asi Jcasovi nešlo.
Naozaj ti jasné, čo je ECMA Script a čo ostatné veci?
Witiko
Profil
Naozaj ti jasné, čo je ECMA Script a čo ostatné veci?

ECMA Script je aktuálně přijat jako standard ve verzi ECMA-262-3, ano. Nicméně očekávám, že dojde k přechodu na verzi ECMA-262-5, pokud je tohle to, co jsi myslel. Mluvil jsem ale i o nastavbových funkcích, které přinesl Javascript 1 - 2.
_es
Profil
Witiko:
pokud je tohle to, co jsi myslel
Nie, myslel som to, že ECMA script je univerzálny jazyk nezávislý od prehliadača.
A tie aktuálne knihy sa zaoberajú práve tými aktuálnymi ostatnými vecami - napríklad DOM, BOM a pod., s ktorými ECMA nemá nič spoločné.
Jcas
Profil *
Děkuji mockrát
Takže jdu studovat a zkusím to znova od začátku.

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:

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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

0