persistența valorilor checkbox

voturi
2

Am o pagină cu mai multe casete de selectare. Am verifica câteva dintre ele și du-te la pagina următoare, când mă întorc pe această pagină, aceste casete de selectare trebuie să rămână așa cum au fost verificate înainte de a naviga la o altă pagină. Necesitatea de a face acest lucru cu Javascript. Orice indiciu??

Întrebat 20/07/2009 la 16:28
sursa de către utilizator
În alte limbi...                            


3 răspunsuri

voturi
1

Va trebui să le persiste între pagina-cereri. Puteți utiliza sesiuni sau cookie-uri pentru a face acest lucru. Ce tip de server lucrezi și cu ce tip de limbaj server-side?

întrebările anterioare pe SO au adresa de scriere / citire cookie-uri de la JavaScript.

Publicat 20/07/2009 la 16:30
sursa de către utilizator

voturi
4

Dacă sunteți limitat la numai JavaScript și nici o limbă partea de server cred că sunt lăsate să citească / scris cookie-uri pentru a menține starea. Așa cum alții au referit, tehnologiile de partea de server sunt mult mai bine la acest lucru, dar dacă trebuie:

Cod JavaScript pe cookie (referință: http://www.quirksmode.org/js/cookies.html ):

function createCookie(name,value,days) {
    if (days) {
        var date = new Date();
        date.setTime(date.getTime()+(days*24*60*60*1000));
        var expires = "; expires="+date.toGMTString();
    }
    else var expires = "";
    document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
}

function eraseCookie(name) {
    createCookie(name,"",-1);
}
Publicat 20/07/2009 la 16:37
sursa de către utilizator

voturi
0

Nu cred că există vreo modalitate destul de complicat de a face acest lucru fără a avea acces la codul de server-side, deoarece la minim pe care trebuie să instalați codul și , de asemenea , să identifice controalele HTML de exemplu , pentru a le verifica. Ma da cod rezonabil care face ceea ce vrei de mai jos.

Notite importante:

  1. Codul prevede că fiecare casetă este dat un id atribut distinct.
  2. Starea de verificare este stocat într-un cookie numit „JS_PERSISTENCE_COOKIE“. Ar fi mai bine pentru a stoca numele acestui cookie într-o variabilă în loc de codificați într-un cuplu de locuri separate, așa cum am făcut. Ce fel de variabile ar trebui să stocheze numele depinde de aplicație și cerințele dumneavoastră.
  3. Ar fi mai bine să pachet codul din interiorul unui obiect în loc ca o grămadă de funcții libere așa cum am făcut. Cu toate acestea, acest lucru nu este relevant pentru întrebarea inițială.
  4. După ce faceți clic unele casete de selectare, puteți simula „navigarea înapoi la această pagină“ apăsând pe CTRL + F5. F5 singur nu este suficient.

Iată codul și unele HTML mostră pentru testare:

<body onload="restorePersistedCheckBoxes()">
    <input type="checkbox" id="check1" onclick="persistCheckBox(this)" />
    <input type="checkbox" id="check2" onclick="persistCheckBox(this)" />
    <input type="checkbox" id="check3" onclick="persistCheckBox(this)" />
    <input type="button" value="Check cookie" 
           onclick="alert(document.cookie)" />
    <input type="button" value="Clear cookie"
           onclick="clearPersistenceCookie()" />

    <script type="text/javascript">
        // This function reads the cookie and checks/unchecks all elements
        // that have been stored inside. It will NOT mess with checkboxes 
        // whose state has not yet been recorded at all.
        function restorePersistedCheckBoxes() {
            var aStatus = getPersistedCheckStatus();
            for(var i = 0; i < aStatus.length; i++) {
                var aPair = aStatus[i].split(':');
                var el = document.getElementById(aPair[0]);
                if(el) {
                    el.checked = aPair[1] == '1';
                }
            }
        }

        // This function takes as input an input type="checkbox" element and
        // stores its check state in the persistence cookie. It is smart
        // enough to add or replace the state as appropriate, and not affect
        // the stored state of other checkboxes.    
        function persistCheckBox(el) {
            var found = false;
            var currentStateFragment = el.id + ':' + (el.checked ? '1' : '0');
            var aStatus = getPersistedCheckStatus();
            for(var i = 0; i < aStatus.length; i++) {
                var aPair = aStatus[i].split(':');
                if(aPair[0] == el.id) {
                    // State for this checkbox was already present; replace it
                    aStatus[i] = currentStateFragment;
                    found = true;
                    break;
                }
            }
            if(!found) {
                // State for this checkbox wasn't present; add it
                aStatus.push(currentStateFragment);
            }
            // Now that the array has our info stored, persist it
            setPersistedCheckStatus(aStatus);
        }

        // This function simply returns the checkbox persistence status as
        // an array of strings. "Hides" the fact that the data is stored
        // in a cookie.
        function getPersistedCheckStatus() {
            var stored = getPersistenceCookie();
            return stored.split(',');
        }

        // This function stores an array of strings that represents the 
        // checkbox persistence status. "Hides" the fact that the data is stored
        // in a cookie.
        function setPersistedCheckStatus(aStatus) {
            setPersistenceCookie(aStatus.join(','));
        }

        // Retrieve the value of the persistence cookie.
        function getPersistenceCookie()
        {
          // cookies are separated by semicolons
          var aCookie = document.cookie.split('; ');
          for (var i=0; i < aCookie.length; i++)
          {
            // a name/value pair (a crumb) is separated by an equal sign
            var aCrumb = aCookie[i].split('=');
            if ('JS_PERSISTENCE_COOKIE' == aCrumb[0]) 
              return unescape(aCrumb[1]);
          }
          return ''; // cookie does not exist
        }

        // Sets the value of the persistence cookie.
        // Does not affect other cookies that may be present.
        function setPersistenceCookie(sValue) {
            document.cookie = 'JS_PERSISTENCE_COOKIE=' + escape(sValue);
        }

        // Removes the persistence cookie.
        function clearPersistenceCookie() {
            document.cookie = 'JS_PERSISTENCE_COOKIE=' +
                              ';expires=Fri, 31 Dec 1999 23:59:59 GMT;';
        }
    </script>

</body>
Publicat 20/07/2009 la 17:26
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more