php.de

Zurück   php.de > Webentwicklung > JavaScript, Ajax und mehr

JavaScript, Ajax und mehr dynamisches Scripten und Interaktion auf Clientebene

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 02.04.2011, 20:36  
Benutzer
 
Benutzerbild von ALEC23
 
Registriert seit: 25.08.2009
Beiträge: 80
PHP-Kenntnisse:
Anfänger
ALEC23 befindet sich auf einem aufstrebenden Ast
Standard Inputfelder dynamisch erzeugen und entfernen

Hallo zusammen,

folgende Aufgabe habe ich mir gestellt:

Für ein Formular möchte ich ein optionales Feld haben, in dem ich verschiedene Stationen (max. 5) einer Route eingeben kann und diese auch nach Belieben löschen kann.

Struktur:
| Station(Ort) | Umkreis | entfernen
Weitere Station hinzufügen

Der Ansatz:
PHP-Code:
        <script type="text/javascript">

            var 
stationNumber 1;
            var 
foo true;

            function 
createInputField()
            {
                var 
inputField document.createElement("div");

                
inputField.className 'type-text clearfix';
                
inputField.innerHTML '<input type="text" name="stationDistance_' stationNumber '" id="stationDistance_' stationNumber '"';

                return 
inputField;
            }

            function 
createSelectField()
            {
                var 
selectField document.createElement("div");

                
selectField.className   'type-select';
                
selectField.innerHTML   '<select name="station_' stationNumber '" id="station_' stationNumber '">\n'
                                        
+'  <option value="foo">bar</option>\n'
                                        
+'  <option value="foo">bar</option>\n'
                                        
+'  <option value="foo">bar</option>\n'
                                        
+'  <option value="foo">bar</option>\n'
                                        
+'  <option value="foo">bar</option>\n'
                                        
+'  <option value="foo">bar</option>\n'
                                        
+'</select>\n'

                
return selectField;
            }

            function 
createDeleteButton()
            {
                var 
deleteButton document.createElement("div");

                
deleteButton.className 'type-button';
                
deleteButton.innerHTML '<button type="button" name="deleteStation_' stationNumber '" id="deleteStation_' stationNumber '" onclick="deleteStation(this)">Eintrag entfernen</button>';

                return 
deleteButton;
            }

            function 
addStationButton()
            {
                var 
addStation document.getElementById("addStation")
                var 
addStationButton document.createElement("div");

                
addStationButton.className 'foo';
                
addStationButton.innerHTML '<input type="button" id="station_btn" onclick="createStation()" value="Weitere Stationen hinzuf&uuml;gen" />';

                
addStation.appendChild(addStationButton);
            }

            function 
createStationItem()
            {
                var 
stationItem document.createElement("div");

                
stationItem.id "station_" stationNumber;
                
stationItem.className "station";

                var 
input_field createInputField();
                var 
select_field createSelectField();
                var 
delete_btn createDeleteButton();

                
stationItem.appendChild(input_field);
                
stationItem.appendChild(select_field);
                
stationItem.appendChild(delete_btn);
               
                return 
stationItem;
            }

            function 
createStation()
            {
                var 
quantity document.getElementById("stations").childNodes.length;
                var 
maxQuantity 5;

                var 
stations document.getElementById("stations");
                var 
specificItem createStationItem();            

                if(
quantity <= maxQuantity)
                {
                    
stations.appendChild(specificItem);
                    
stationNumber++;

                    if(
quantity > (maxQuantity-1))
                    {
                        var 
buttonNode document.getElementById("addStation");
                        
buttonNode.parentNode.removeChild(buttonNode);
                    }
                }
                
            }

            function 
deleteStation(obj)
            {
                
document.getElementById('stations').removeChild(obj.parentNode.parentNode);
                  
                var 
quantity document.getElementById("stations").childNodes.length;
                var 
maxQuantity 5;

                if(
quantity maxQuantity)
                {
                    if(!
document.getElementById("station_btn"))
                        {
                          
addStationButton();
                        }
                }
              
            }

        
</script>

    </head>
    
    <body>
        <div id="wrapper">
            <div id="stations" class="clearfix">

            </div>
            
        </div>
        <div id="addStation">
           <input type="button" id="station_btn" onclick="createStation()" value="Weitere Stationen hinzuf&uuml;gen" />
        </div>
    </body> 
Jetzt habe ich zwei Fragen zu dem Script:

Wenn ich das Maximum der möglichen Stationen erreicht habe, lösche ich ja den station_btn. Nun möchte ich natürlich, wenn wieder die Möglichkeit besteht eine neue Station zu wählen (durch entfernen einer oder mehrerer Stationen), der Button wieder verfügbar ist. Dafür habe die Funktion addStationButton(). Jetzt war mein Ansatz, das ich bei jedem Klick des Entfernen Buttons prüfe, ob der station_btn vorhanden ist.

Wenn ich z.B.

PHP-Code:
var quantity document.getElementById("stations").childNodes.length;
var 
maxQuantity 5;

if(
quantity maxQuantity)
{
    if(!
document.getElementById("station_btn"))
    {
        
addStationButton();
    }


in die deleteStation()-Funktion mit reinnehme, dann funktionieren zwar alle Test-Alerts, aber der Button wird nicht mit hinzugefügt. Habt Ihr da eine Idee, woran das liegen könnte?

Desweiteren würde ich gerne wissen, ob ich den obigen Code evtl. schlanker und übersichtlicher gestalten kann? Wichtig war mir, das ich die ganzen CSS-Klassen mit reinbringen kann und aus diesem Grund habe ich die Funktionen gemacht. Evtl. Array & for-Schleife?

Danke und liebe Grüße.
ALEC23 ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 02.04.2011, 21:47  
Erfahrener Benutzer
 
Registriert seit: 28.05.2008
Beiträge: 2.094
PHP-Kenntnisse:
Fortgeschritten
rudygotya ist einfach richtig nettrudygotya ist einfach richtig nettrudygotya ist einfach richtig nettrudygotya ist einfach richtig nettrudygotya ist einfach richtig nett
Standard

Zitat:
Desweiteren würde ich gerne wissen, ob ich den obigen Code evtl. schlanker und übersichtlicher gestalten kann? Wichtig war mir, das ich die ganzen CSS-Klassen mit reinbringen kann und aus diesem Grund habe ich die Funktionen gemacht. Evtl. Array & for-Schleife?
->>> jQuery Hab grad wenig Zeit, aber ich würde dir gerne noch createDocumentFragment ans Herz legen. Evtl willst du deine Funktionen noch in ein Objekt packen?

A la
PHP-Code:
Station = function ( cfg ) {};
Station.prototype = {
   
add : function () {},
   
remove : function () {},
   
update : function () {}

Ansonsten sieht das echt hübsch aus


Grüße


Basti
__________________
++++ Wieder einer ins Netz gegangen: Phishers Fritz zufrieden ++++
Blog
rudygotya ist offline   Mit Zitat antworten
Alt 03.04.2011, 00:20  
Benutzer
 
Benutzerbild von ALEC23
 
Registriert seit: 25.08.2009
Beiträge: 80
PHP-Kenntnisse:
Anfänger
ALEC23 befindet sich auf einem aufstrebenden Ast
Standard

Hallo Basti,

danke schonmal für Deine Anregungen. Schaue mir gerade das DocumentFragment an und bin mal ein wenig am "rumspielen". Das DocumentFragment kannte ich bis jetzt noch nicht, aber so wie ich das jetzt verstanden habe, kann ich im document ein Fragment quasi temporär erstellen und dort meine Knoten einhängen - in diesem Fall die benötigten Elemente des Input-Feldes, des Select-Feldes und des Buttons. Muss mir das aber mal noch weiter anschauen und noch ein wenig nachlesen.

Die Struktur mit dem Objekt gefällt mir auch recht gut, nur muss ich gestehen, das ich mit Prototypen und generell mit Vererbung in Javascript noch nicht so fit bin. Werde mir das auch nochmal genauer anschauen, denn anfangs dachte ich auch an ein Objekt, das ich dann einfach abhängig der zulässigen Stationen (maxQuantity) instanziere. Aber was Du mir als Objektbeispiel geschrieben hast ist mir soweit schlüssig und werde das mal ausprobieren - danke.

jQuery habe ich erstmal nach hinten geschoben, weil ich unbedingt meine Javascript-Kenntnisse erweitern will.

Leider konnte ich immer noch nicht den Button wieder einhängen - mal sehen... Wird noch!

Danke und liebe Grüße
ALEC23 ist offline   Mit Zitat antworten
Alt 03.04.2011, 17:25  
Benutzer
 
Benutzerbild von ALEC23
 
Registriert seit: 25.08.2009
Beiträge: 80
PHP-Kenntnisse:
Anfänger
ALEC23 befindet sich auf einem aufstrebenden Ast
Standard

Hallo zusammen,

rudygotya hat mich auf auf createDocumentFragment() gebracht. Konnte den Code auch noch etwas schlanker gestalten und das ist mein Ansatz:

PHP-Code:
<script type="text/javascript">
      
            function 
createItem (fieldElementfieldClassfieldInnerHTML)
            {
                var 
document.createElement(fieldElement);

                
k.className fieldClass;
                
k.innerHTML fieldInnerHTML;

                return 
k;
            }
            
            function 
create() 
            {
                var 
fragment        document.createDocumentFragment();
                var 
selectField     createItem("<div>""meineKlasse1"'<div>Hallo1</div>');
                var 
inputField      createItem("<div>""meineKlasse2"'<div>Hallo2</div>');
                var 
deleteButton    createItem("<div>""meineKlasse3"'<div>Hallo3</div>');

                
fragment.appendChild(selectField);
                
fragment.appendChild(inputField);
                
fragment.appendChild(deleteButton);

                var 
stations document.getElementById('stations');
                
stations.appendChild(fragment);
            }

        
</script> 
Das klappt soweit schon ganz gut.

Bei der Arbeit mit Objekten gehen die "Test-Alerts" soweit, nur leider schlägt das Anhängen fehl - hier der Ansatz mit Objekt:

PHP-Code:
            function Station()
            {
               
this.create();
            }

            
Station.prototype = {

                
fragment        document.createDocumentFragment(),
                
stations        document.getElementById('stations'),

                
createItem : function (param1param2param3)
                {                   
                    var 
document.createElement(param1);

                    
k.className param2;
                    
k.innerHTML param3;

                    return 
k;
                },

                
create : function()
                {
                    var 
selectField this.createItem('<div>''meineKlasse1''<div>Hallo1</div>');
                    
this.fragment.appendChild(selectField);
                    
this.stations.appendChild(this.fragment);
                }
            }

            var 
bar = new Station(); 
Könnt' Ihr mir vielleicht sagen, warum ich das nicht angehängt bekomme? Ich vermute mal, das ich einen Fehler beim Zuweisen der Parameter von createItem() mache...

Danke schonmal und Grüße

EDIT: @ Nikosch

Code:
this.stations is null
[Bei diesem Fehler anhalten] this.stations.appendChild(this.fragment);
Mist - ich muss nochmal schauen. Vorhin hat der das nicht angezeigt... ;-(

Geändert von ALEC23 (03.04.2011 um 17:58 Uhr). Grund: Debuggen hat nochmal andere Sichtweise eröffnet.
ALEC23 ist offline   Mit Zitat antworten
Alt 03.04.2011, 17:47  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Zitat:
nur leider schlägt das Anhängen fehl
Bitte Fehlermeldungen posten.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 03.04.2011, 18:09  
Benutzer
 
Benutzerbild von ALEC23
 
Registriert seit: 25.08.2009
Beiträge: 80
PHP-Kenntnisse:
Anfänger
ALEC23 befindet sich auf einem aufstrebenden Ast
Standard

PHP-Code:
create : function()
                {
                    var 
stations    document.getElementById("stations");
                    var 
selectField this.createItem('<div>''meineKlasse1''<div>Hallo1</div>');
                    
this.fragment.appendChild(selectField);
                    
stations.appendChild(this.fragment); 
                } 
Jetzt funktioniert es. Aber eins verstehe ich nicht:

var stations = document.getElementById("stations"); funktioniert innerhalb der Funktion. Wenn ich stations wie oben beschrieben deklariere geht das nicht. Aber fragment findet er doch auch?
ALEC23 ist offline   Mit Zitat antworten
Alt 03.04.2011, 18:11  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

document.getElementById('stations') ist vermutlich zur Definitionszeit noch nicht verfügbar.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 03.04.2011, 18:23  
Benutzer
 
Benutzerbild von ALEC23
 
Registriert seit: 25.08.2009
Beiträge: 80
PHP-Kenntnisse:
Anfänger
ALEC23 befindet sich auf einem aufstrebenden Ast
Standard

MEGA - das war's. Ich habe mal die create()-Funktion aus dem Konstruktor genommen und die Funktion auf den Button gelegt. Jetzt habe ich die var-Deklaration wieder aus der createFunktion genommen und direkt im Objekt initialisiert. Läuft!

Super, dann kann ich mal weiter an der Objektumsetzung arbeiten. Vielen Dank.
ALEC23 ist offline   Mit Zitat antworten
Alt 03.04.2011, 19:57  
Benutzer
 
Benutzerbild von ALEC23
 
Registriert seit: 25.08.2009
Beiträge: 80
PHP-Kenntnisse:
Anfänger
ALEC23 befindet sich auf einem aufstrebenden Ast
Standard

So - ich konnte das nun weiter vereinfachen und habe folgenden Ansatz:

PHP-Code:
function Station() {}

            
Station.prototype = {

                
fragment        document.createDocumentFragment(),
                
stations        document.getElementById("stations"),

                
createItem : function (param1param2param3)
                {                   
                    var 
document.createElement(param1);

                    
k.className param2;
                    
k.innerHTML param3;

                    return 
k;
                },

                
create : function()
                {   
                    var 
fields = new Array();

                    
fields[0] = new Array('<div>''myClass0''<div>Hallo0</div>');
                    
fields[1] = new Array('<div>''myClass1''<div>Hallo1</div>');
                    
fields[2] = new Array('<div>''myClass2''<div>Hallo2</div>');

                    for (var 
0fields.lengthi++)
                    {
                        var 
this.createItem(fields[i][0], fields[i][1], fields[i][2]);
                        
this.fragment.appendChild(f);
                    }
                    
stations.appendChild(this.fragment);
                }
            }

            var 
bar = new Station(); 
Was mir jetzt gar nicht gefällt, ist das Initialisieren des Arrays und der Deklarieren der Werte innerhalb der create-Funktion. Wie würdet Ihr das umsetzen? Würde den Code gerne so schlank wie möglich halten...

Grüße
ALEC23 ist offline   Mit Zitat antworten
Alt 03.04.2011, 20:05  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Beschreib doch noch mal genau, was der Sinn des Ganzen ist.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
selectfelder dynamisch erzeugen sdako PHP Tipps 2010 7 19.07.2010 23:46
PDF Dateien dynamisch aus HTML erzeugen? mexican PHP Tipps 2010 10 28.04.2010 20:03
[Erledigt] Bilder dynamisch erzeugen ohne gdlib Sniper_Kotaro PHP Tipps 2009 12 02.11.2009 14:52
[Erledigt] dynamisch ein input element erzeugen xstefxanx JavaScript, Ajax und mehr 7 04.04.2009 13:10
Links dynamisch erzeugen philipp.p PHP Tipps 2008 7 03.04.2008 14:31
Smarty/quickform: Variablen Namen dynamisch erzeugen ? Toxo HTML, Usability und Barrierefreiheit 1 31.10.2007 16:55
Tool um (Spiel)Klassen zu erzeugen Martin13 PHP-Fortgeschrittene 6 05.09.2007 02:25
SQL Abfrage erzeugen/ string bearbeitung easy PHP Tipps 2007 20 28.03.2007 22:12
Checkboxen dynamisch in Tabelle erzeugen nussbaum PHP Tipps 2007 4 21.01.2007 16:50
Bild erzeugen meisterigel PHP Tipps 2006 5 28.03.2006 14:43
array keys mit eval erzeugen ff-webdesigner PHP-Fortgeschrittene 4 22.10.2005 18:44
Pulldown Menü dynamisch aus Datei erzeugen PHP Tipps 2005-2 14 20.10.2005 11:18
Uploadfelder dynamisch erzeugen und abfragen PHP Tipps 2005-2 1 03.06.2005 23:01
textfelder dynamisch erzeugen PHP Tipps 2004 7 19.08.2004 12:53

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
javascript input erzeugen, formularfelder dynamisch hinzufügen, felder dynamisch hinzufügen, javascript eingabefelder dynamisch hinzufügen, javascript input erstellen, javascript input felder erstellen, inputfelder dynamisch erzeugen, html eingabefelder dynamisch hinzufügen, formularfelder dynamisch hinzufügen und löschen, input dynamisch erzeugen, input dynamisch erstellen, document.createelement löschen, dynamisch upload felder, javascript input dynamisch erzeugen, dynamisch mehr felder erzeugen php, dynamisch input-felder erzeugen jquery, javascript input element löschen, input feld löschen php, php dynamisch input-felder, input felder erstellen

Alle Zeitangaben in WEZ +2. Es ist jetzt 09:37 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum