1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

Javascript

Discussion in 'Software și sisteme de operare' started by Marius '95, Aug 15, 2012.

  1. Marius '95

    Marius '95 Membru Senior

    Nu-mi place, dar sunt nevoit sa apelez la javascript, ca altfel nu se poate.

    Am o pagina HTML cu un formular. Formularul contine un numar variabil de checkbox-uri si radio-uri.
    Am scris un script care coloreaza checkbox-urile in functie de starea lor: bifate sau nu. Scriptul este apelat de evenimentul OnChange setat la fiecare checkbox.
    Dar unele checkbox-uri vin gata bifate (server-side script). Cum fac sa rulez scriptul pentru fiecare checkbox imediat dupa afisarea paginii astfel incat sa apara gata colorate?


    Intrebarea a 2-a:
    Am checkbox-uri si radio-uri. Stiu sa modific un singur checkbox in functie de starea unui radio: la radio setez onchange=script(checkbox-id). Dar cum fac astfel incat modificarea radio-ului sa bifeze/debifeze mai multe checkbox-uri simultan? Mai exact, cum pot stoca in pagina de web lista de checkbox-uri asociata fiecarui radio?
    Si invers, cum pot modifica culoarea unui radio atunci cand toate checkbox-urile asociate lui au fost bifate?
     
  2. miahi

    miahi Wizzard

    Cele mai simple variante:
    1) apelezi funcția de verificare la evenimentul onload pe html body
    2) faci o funcție pe care o apelezi la onchange + un array care să țină id-urile pentru condiții
     
  3. Marius '95

    Marius '95 Membru Senior

    1) Functia primeste un parametru - ID-ul checkbox-ului pe care trebuie sa-l verifice si sa-i modifice culoarea. Daca o pun la body, ce parametru ii mai dau, ca nu pot sa trec acolo toata lista de ID-uri, sunt sute...
    2) N-am mai facut asa ceva. Cum este cu variable scope la javascript? Pot sa creez array-ul in alta sectiune <script>, abia dupa ce am insirat checkbox-urile?
     
  4. miahi

    miahi Wizzard

    1) poți parcurge liste (http://pietschsoft.com/post/2006/06/01/Javascript-Loop-through-all-elements-in-a-form.aspx). Funcțiile tale ar trebui să ia ca parametru obiectul, nu id-ul lui, pentru că atunci toate call-urile vor fi de forma onchange="myfunction(this);" și nu mai trebuie să înlocuiești acel "this" cu id-uri.
    Dacă ai deja codul pentru verificări, poți parcurge toată lista și pur și simplu apelezi onchange() pe ele.
    2) declari array-ul într-o secțiune script, după care va fi vizibil. Doar să ai grijă ce se întâmplă dacă se activează funcțiile de verificare înainte de a încărca complet pagina (onload = când e încărcat complet, dar să nu mai ai apeluri prin diverse secțiuni script); cel mai bine e să pui secțiunea script care definește așa ceva la începutul html-ului.
     
  5. Marius '95

    Marius '95 Membru Senior

    Multumesc.
     
  6. Xllerator

    Xllerator Colţ Alb

    Dacă mai întîmpini greutăți, postează codul sau măcar un link la pagină.
     
  7. Marius '95

    Marius '95 Membru Senior

    Deci am asa:

    Code:
    In antet:
    <script language="JavaScript" type="text/javascript">
    var packs=new Array();
    function setColor(dstElm){
       var radioState=0; //radio-ul bifat pe linia curenta a tabelului, are 5 variante
       for(i=0;i<=4;i++)if(document.forms['List'].elements['Pay'+dstElm][i].checked==true){radioState=i;continue;} //obtine radio-ul bifat in randul curent
       if( ... ){
          document.getElementById(dstElm).style.color='lime'; //coloreaza randul tabelului: <tr id=dstElm>
          document.forms['List'].elements['Val'+dstElm].style.backgroundColor='lime';} //Val+dstElm este un input text
       alert(dstElm); <-- "L112"
       if(packs.hasOwnProperty(dstElm)){
          alert(packs.dstElm); <-- "undefined"
          for(var key in packs.dstElm){
             alert(key);<-- alert-ul asta nu apare
             ...
    }}}
    </script>
    
    Pe la jumatatea paginii:
    <script language="JavaScript" type="text/javascript">packs.L112=["L113","L114","L1150"];</script>
    
    In consola browserului nu apar erori, randul tabelului si background-ul input-ului se coloreaza, primele 2 alert-uri apar, dar al 3-lea alert nu apare. De ce?

    Banuiesc ca e o problema cu variable scope, dar conform post-ului lui miahi, ar trebui sa mearga.

    LE:
    alert(packs.L112); <-- "L113","L114","L1150"
    alert(dstElm); <-- "L112"
    alert(packs.dstElm); <-- "undefined"

    :capu:
     
  8. Thor

    Thor Membru Senior

    Code:
    alert(packs.dstElm); <-- "undefined"
    
    Din moment ce packs.dstElm e nedefinit, nu cred ca are nici elemente, deci intra in for.

    LE: Te-ai prins.
     
  9. Marius '95

    Marius '95 Membru Senior

    Nu, nu m-am prins. Javascript-ul depaseste capacitatea mea de intelegere. Parca ar fi fost inventat de o femeie.
     
  10. miahi

    miahi Wizzard

    Codul ăla n-o să meargă, pentru că e incorect. Pornești de la premisa că atunci când îi zici packs.dstElm el o să evalueze dstElm ca o variabilă și o să devină packs.L112. Nu așa se face evaluarea.

    În packs.hasOwnProperty(dstElm) el evaluează dstElm ca String și caută după packs.hasOwnProperty("L112"). Însă în packs.dstElm el caută după câmpul numit fix dstElm în obiectul packs. Nu-l găsește, așa că e undefined, și normal că nu intră în for.

    Ceea ce probabil vrei tu e eval("packs." + dstElm). Și citit despre JavaScript Objects.
     
  11. Marius '95

    Marius '95 Membru Senior

    Bine. Deci nu se poate.

    Atunci cum adresez o variabila al carei nume e variabil?

    Exemplu:
    for(index=1;index<=3;index++)alert(PKindex)
    sa rezulte:
    alert(PK1), alert(PK2), alert(PK3)


    PS: I hate objects soooo much!!!
     
  12. miahi

    miahi Wizzard

    Cu eval, am scris mai sus, nu citi în diagonală.

    Vezi și jQuery, poate simplifica lucrurile dacă stai să îl înțelegi.
     
  13. Marius '95

    Marius '95 Membru Senior

    Gata. A mers.
    Multumesc.
     
  14. puterfixer

    puterfixer Administrator

    E plin de femei care înțeleg JavaScript pe rentacoder.com :tongue:
     
  15. wirespot

    wirespot Membru Senior

    Dar de ce cu variabile? Când ai chestii de genul ăsta (set de variabile identificate printr-un număr) primul impuls ar fi să foloseşti un Array.
     
  16. Marius '95

    Marius '95 Membru Senior

    Pai daca array-ul face figuri!?
     
  17. AdrianB1

    AdrianB1 Membru Senior

    Ce vrei sa spui?
     
  18. puterfixer

    puterfixer Administrator

    Lasă inocența, pot să jur că ai văzut și tu The Exorcist. Dă povestea mai încoace cu un sfert de secol și iaca, siliciul poate fi posedat. Desigur, dacă nu-ți sfințești placa de bază fiindcă îți mănâncă memorie :wink: