Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » HTML / XML / XHTML » Java-Script, Dynamische Generierung, Event-Handler

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
27.04.2010, 11:10 Uhr
~FreiherrEintritt_
Gast


Ich versuche, mit JavaScript Elemente aus zwei Tabellen hin und her zu schieben:

- zwei HTML Tabellen A und B
- Array aus Elementen, entweder "zugeordnet" (Tabelle A) oder "nicht zugeordnet" (B)
- jede Zeile in Tabelle A enthält "-" Button zum Entfernen eines Elements (=> Verschiebung nach B)
- jede Zeile in Tabelle B enthält "+" Button zum Hinzufügen eines Elements (=> Verschiebung nach A)

=> Problem: Dynamische Generierung von HTML Elementen und Java-Script Eventhandlern


Ansatz:

C++:
var lst = array(); // Array aus Elementen, wir zu Beginn von <body> gefüllt

function drawTables(doc) {
    // Pointer auf bereits existierende Tabllen
    var tabA = doc.getElementById("tabA");
    var tabB...
    
    // alle Zeilen in A und B löschen
    ...
    
    // Zeilen neu aufbauen
    for(var i=0; i<lst.length; i++) {
        var newLine = doc.createElement("tr");
        
        // Inhalt hinzufügen
        var cellName = doc.createElement("th");
            var txtName = doc.createTextNode("..");
            cellName.appendChild(txtName);
        var cellNochwas...
            ...
        
        var cellOption = doc.createElement("th");
        var imgOption = doc.createElement("img");
        var tab;
        
        if("gehört zu A oder B") {    // info steht in lst-Array
            imgOption.src = "remove Button";
            imgOption.onclick = function(){ removeElement(doc, i); };
            tab = tabA;    
        } else {
            imgOption.src = "add Button";
            imgOption.onclick = function(){ addElement(doc, i); };
            tab = tabB;
        }
        
        // zeile der Tablle hinzufügen
        cellOption.appendChild(imgOption);        
        newLine.appendChild(cellOption);
        tab.appendChild(newLine);
    
    }
}


function add/removeElement(doc, index) {
    // ändert lst Array gemäß den neuen Zurodnungen
    drawTables(doc);
}



Das ganze soll so funktionieren, dass die <img> tags die Funktionen removeElement und addElement mit den entsprechenden i-Parametern aufrufen, um sich selbst hinzuzufügen oder zu entfernen.

Allerdings kommt in den beiden Funktionen als index immer die gleiche Zahl an, nämlich lst.length, so als würde die Variable i nach der Schleife bestehen bleiben und als Übergabeparameter genommen werden.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
27.04.2010, 11:57 Uhr
~toxic
Gast


hi,
da du "i" in deiner funktion übergibst, ist das logischerweisse erst nachdem die schleife durchlaufen wurde, also 'lst.length'.
du musst in der onclick-funktion irgendwie über die id an den index kommen, und den dann übergeben.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
27.04.2010, 16:03 Uhr
~FreiherrEintritt_
Gast



Zitat von ~toxic:

du musst in der onclick-funktion irgendwie über die id an den index kommen


ja, das ist genau das Problem

nur leider hat so was

C++:
for(var i=0; i<lstInd.length; i++) {
    // ...
    var imgOption = doc.createElement("img");
        imgOption.id = lstInd[i]["ID"];
        imgOption.onclick = function() { removeFromRisk(doc, i); };
        // oder
        imgOption.onclick = function() { removeFromRisk(doc, lstInd[i]["ID"]); };
    // ...
}


den Effekt, dass während der Abarbeitung der for-Schleife zwar in imgOption.id der "momentane" i-Wert, in der onclick-Funktion aber der Variablenname i gespeichert wird. Und dann passiert das, was du gesagt hast, nämlich dass der letzte i-Wert vom Ende der Schleife genommen wird.

Wie kann ich in der Funktion konkrete i-Werte eintragen lassen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
27.04.2010, 23:42 Uhr
~toxic
Gast


naja, du gibst ja jedem img eine ID mit ( lstInd[i]["ID"] ), diese muss deine function aus dem angeglicktem img auslesen (this.id), und darüber musst du dann eben den index aus der lstInd holen

Code:
imgOption.onclick="alert(this.id)";

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
28.04.2010, 08:48 Uhr
~FreiherrEintritt_
Gast


Vielen Dank!

Allerdings darf die Zuweisung kein String sein:

C++:
imgOption.onclick = function() { alert(this.id); };

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
28.04.2010, 11:47 Uhr
~toxic
Gast


ja, üblicherweisse schreibt man da auch nur den funktionsnamen hin, und nicht die ganze funktion
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ HTML / XML / XHTML ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: