kostenloser Webspace werbefrei: lima-city


Checkboxen Javascript

lima-cityForumDie eigene HomepageHTML, CSS & Javascript

  1. Autor dieses Themas

    davy

    Kostenloser Webspace von davy

    davy hat kostenlosen Webspace.

    Hallo !

    Ich habe leider wieder ein tag/problem">Problem mit Javascript, wo ich eure Hilfe brauche.

    Also, ich habe mir jetzt ein neues Script gesucht, zum Markieren aller Nachrichten.
    Das Script lautet:

    <script language="JavaScript">
    <!--
    function check_all() {
    	for(i=0;i<=1 - 1;i++) {
    		if(document.getElementById('alle').checked==true) document.getElementById('msg'+i).checked=true;
    		if(document.getElementById('alle').checked==false) document.getElementById('msg'+i).checked=false;
    	}	
    }
    -->
    </script>


    Die Checkbox zum Markieren aller Nachrichten:

    <input type='checkbox' id='alle' onclick='check_all();' />


    Und die Checkbox die bei jeder Nachricht angezeigt wird:

    <input type='checkbox' id='msg0' name='mails[]' value='$Id' />


    Mein Problem: Beim Klicken auf die Checkbox, die alle Nachrichten markieren soll, wird nur die erste markiert.

    Zum Testen hier:
    http://davy.lima-city.de/nachrichten/nachrichten.php
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Ehm...
    for(i=0;i<=1 - 1;i++)

    und da wunderst du dich noch? ;-)
    Ich würde die Element mit dem "name"-Tag ansprechen, das würde (glaube ich) sogar ohne Schleife funktionieren.
  4. Autor dieses Themas

    davy

    Kostenloser Webspace von davy

    davy hat kostenlosen Webspace.

    qap2 schrieb:
    Ehm...
    for(i=0;i<=1 - 1;i++)

    und da wunderst du dich noch? ;-)
    Ich würde die Element mit dem "name"-Tag ansprechen, das würde (glaube ich) sogar ohne Schleife funktionieren.


    Ja, ich dachte mir schon, dass das was damit zu tun hat.


    Wie mache ich das mit dem "name" Tag?
  5. Nein, das mit dem Name würde auch nicht ohne Schleife funktionieren:

    document.getElementByName('mails[]')[0] //Das erste Element mit dem Namen 'mails[]' auf der Seite
    document.getElementByName('mails[]')[1] //Das zweite Element mit dem Namen 'mails[]' auf der Seite


    Ersetze einfach das <=1 - 1 in deiner for-schleife mit einem < n - das n steht dabei für die Anzahl der Checkboxen.
  6. abgesehen davon ist das script ziemlich naiv geschrieben, es prüft zig zustände immer und immer wieder. Wozu gibts Variablen?!? Hier mal eine etwas gereiftere Variante:
    <script type="text/javascript">
    function check_all(){
      var i = 4, // Diese Zahl gibt an wie viele checkboxen du dadurch erreichen willst
          isChecked = document.getElementById('alle'); // Hier wird der zustand der Checkbox "alle" gespeichert
      while(i--){
        document.getElementById('msg'+i).checked = isChecked; // und hier wird der Zustand jeder Checkbox
          // auf den selben Zustand geändert wie der der checkbox "alle"
      }
    }
    </script>


    Auf die weise musst du nicht die ganzen if-Abfragen durchlaufen!
  7. Dass das script naiv geschieben ist würde ich nicht behaupten. Abgesehen davon, kann man dein Script im übrigen auch noch verbessern (wenn man eh schon pingelig ist :D). Warum sollte ich die Anzahl der Checkboxen hart scripten, wenn das Script selbst schauen kann ob es die gibt?
    for (i = 0;document.getElementById('msg'+i) != null;i++)

    Mal davon abgesehen davon, dass ich persönlich dieses while(i--) syntaktisch nicht gerade schön finde hat dein script auch noch einen fehler:
    isChecked = document.getElementById('alle');
    Diese Zeile speichert nicht den Zustand der Checkbox, sondern das Element an sich in der Variable isChecked. Richtig wäre dann wenn schon folgendes:
    isChecked = document.getElementById('alle').checked;
  8. ups da war ich wohl etwas übermüdet... aber vom ding her stimmt das gesagte schon.
    Das while resultiert daraus, dass ich meine scripte schon in der Entstehung versuche zu optimieren und in javascript unterscheiden sich die 3 schleifen for, while, do-while in ihrer geschwindigkeit lediglich bei mehrerern 10000 durchläufen.
    Außerdem erhalte ich den schnellsten schleifendurchlauf bei einer html-collection wenn ich zuerst den length-wert in einer collection abspeicher und dann immer abwärts zähle.
    Den in javasscript ist:
    false === 0 und true === 1 sprich true+true === 2 und weil das !0 ist folgt daraus wieder ein !false == true
    Etwas komisch aber worauf ich hinaus will ist, dass wenn ich als bedingung auf i-- prüfe ist das die schnellstmöglich abfrage, man kann genausogut for(;i--;) schreiben ist genau gleich lang wie while(i--) und unterscheidet sich erst in Bereichen, für die javascript eh nicht gedacht und ausgelegt ist.
  9. [...]Den in javasscript ist:
    false === 0 und true === 1 sprich true+true === 2 und weil das !0 ist folgt daraus wieder ein !false == true[...]


    Ich weiß ja nich wikrlich was du damit jetzt zum Ausdruck bringen willst, jedenfalls ist die aussage dass false === 0 und true === 1 ist definitiv falsch, da false vom typ bool ist und 0 vom typ integer. Wäre nett, wenn du mir die Aussage nochmal genauer erläutern könntest ;-)
  10. alter schwede ich manövrier mich hier zwar etwas in die sch...e aber naja iwie bin ich nicht mehr so fit in den javascript abfragen, ich sollte mal wieder ein paar test-läufe machen...
    Ich wollte eigentlich nur sagen, dass solange i > 0 ist, ist i != false, denn javascript fragt normalerweise immer nur nach == bzw. != und nicht nach === und !== sprich auf diese weise sparen wir uns eine Abfrage, ich demonstriere das mal an einem Beispiel:

    // BSP 1
    var i=document.getElementsByTagName('xyz').lenght
    for(;i--;);
    // hier holt sich Javascript die Anzahl der Knoten im document mit dem
    // nodeName 'xyz' direkt vor dem schleifendurchlauf
    // danach wird i decrementiert und geprüft ob i ein möglicher wert ist sprich
    // es sind ausgeschlossen false,null,undefined,NaN,0,""
    // das macht zwei Berechnungen pro Schleifendurchlauf
    
    // BSP 2 (ich mach das mal absichtlich extrem langsam)
    for(var i=0; i<=document.getElementsByTagName('xyz').lenght-1; i++);
    // hier werden bei jedem Schleifendurchlauf mehrere Berechnungen
    // durchgeführt:
    // 1. Es wird auf das DOM zugegriffen, dass ist sehr langsam, so ziemlich das
    // lahmste was es in Javascript heute gibt, weil das DOM
    // ständig verändert werden kann, inkl. aller Eigenschaften
    // 2. Die Länge wird um 1 reduziert
    // 3. Es wird überprüft ob der Wert nicht so oder so ausgeschlossen werden
    // kann, sprich false,null,undefined,NaN,0,"" ist
    // 4. wird dieser bereits auf tauglichkeit geprüfte wert mit dem
    // Vergleichsausdruck mit i verglichen
    // 5. am ende von jedem durchlauf wird i um 1 erhöht


    Das Ergebnis ist also dass in der ersten Variante bedeutend weniger gerechnet wird und zweitens die zeitintensiven Zugriffe aus das DOM auf einen einzigen Zugriff reduziert werden

    Beitrag zuletzt geändert: 7.4.2010 13:16:14 von nemoinho
  11. Ok. Das gibt jetzt ein bissel mehr Sinn :biggrin: Jetzt kapier ich au was du meinst. Danke :D
  12. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!