Javascript

Marius '95

troubleShooter
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?
 
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
 
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?
 
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.
 
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:
 
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.
 
Nu, nu m-am prins. Javascript-ul depaseste capacitatea mea de intelegere. Parca ar fi fost inventat de o femeie.
 
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.
 
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!!!
 
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.
 
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 ;)
 
Am ajuns la partea unde trebuie sa modific ce am scris acu' 10 ani si JS ma omoara desi am comentat, nu doar fiecare functie, ci aproape fiecare linie.

Am o pagina cu un tabel care se presupune ca va ajunge sa fie f. f. lung. Fiecare linie in tabel este un formular care modifica datele de acolo.
Tabelul este stocat intr-o baza de date si unele coloane sunt FK catre alte liste din alte tabele DB.
Vreau un script care, atunci cand userul pune cursorul intr-un input text, i se incarce un iframe cu lista de valori (radio) de unde poate bifa o optiune. Cand input-ul e completat cu ceva valabil (nu aberatii) trebuie sa se faca verde.
Am scris html-urile, am listele, dar m-am impiedicat iar la JS.

Stiu sa deschid iframe-ul corespunzator, stiu sa pre-bifez un radio din iframe cu valoarea preexistenta in input text, stiu sa completez cu JS un camp text in functie de un radio bifat in iframe, dar nu stiu cum sa gasesc care camp text trebuie completat.
Am facut o functie care deschide iframe-ul. Functia e rulata cu onclick pe input text: loadIFrame(list), unde list este lista cu valori posibile pentru input-ul ala.
Am facut o alta functie rulata la click-ul unui radio din lista care sa completeze input text, dar m-am impotmolit la ea. SyncRadio(value), unde value este valoarea care trebuie sa apara in input text. Cum fac sa apara value in acel input text in care facuse click utilizatorul?
 
M-ai pierdut la iframe. Acum 10 ani poate era o idee (nu prea bună), dar acum chiar n-are ce căuta un iframe acolo.

Pe onclick (înainte să deschizi abominabilul iframe) iei id-ul elementului, îl trimiți către pagina aia deschisă, apoi îl folosești la click-ul radio.
Code:
<input id="text1" onclick="onclk(this.id)"/>

function onclk(textId) {
loadIFrame(list, textId) 
}
 
Back
Top