Ich habe jetzt viele Tage herum probiert
Was genau hast du denn probiert? Zeig doch mal was du bisher hast
Ich habe jetzt viele Tage herum probiert
Was genau hast du denn probiert? Zeig doch mal was du bisher hast
Hei!
Beides ist theoretisch möglich. Wenn du das Formular über mehrere Dateien verteilst, brauchst du wieder PHP. In dem Fall musst du nämlich mit einer Session arbeiten. Sessions sind PHP Variablen, die auch beim wechsel der Unterseiten verfügbar bleiben. So löst man zum Beispiel Logins (daher auch der Begriff Login-Session).
Ich würde der Einfachheit halber mit einer Seite arbeiten. Die verschiedenen Schritte kannst du dann in DIV Elemente packen, wobei du die gerade nicht relevanten Teile des Formulars ausblendest.
Der HTML Aufbau könnte zum Beispiel so aussehen:
<form name="Warenkorb" method="post">
<div class="step-container" id="step1">
<p>Teil 1 des Formulars</p>
<!-- Formularfelder aus Schritt 1 -->
<button class="step-navigation-button" data-target="1">Weiter</button>
</div>
<div class="step-container" id="step2">
<p>Teil 2 des Formulars</p>
<!-- Formularfelder aus Schritt 2 -->
<button class="step-navigation-button" data-target="0">Zurück</button>
<button class="step-navigation-button" data-target="2">Weiter</button>
</div>
<div class="step-container" id="step3">
<p>Teil 3 des Formulars</p>
<!-- Formularfelder aus Schritt 3 -->
<button class="step-navigation-button" data-target="1">Zurück</button>
<input type="submit" value="Absenden">
</div>
</form>
Alles anzeigen
Dann werden über CSS die Container bis auf den ersten ausgeblendet:
Es wird jetzt nur der erste Container angezeigt.
Auffgefallen sind bestimmt die neuen Attribute der Buttons:
In den data-* Attributen kann man für den Benutzer nicht relevante Daten speichern, also zum Beispiel Werte, die wichtig für eine Javascript Funktion sind. Der Aufbau ist immer der selbe, man beginnt mit data- und ist dann kreativ. In diesem Fall wählte ich data-target, weil der Wert die Nummer des Ziel-Containers beinhaltet. ALles zum data- Attribut hier.
Auslesen kann man wie folgt:
var element = document.getElement...;
var data = element.dataset.target; // dataset.[alles hinter "data-"]
Jetzt müssen nur noch die 4 Buttons eingelesen und mit EventListenern versehen werden. Außerdem müssen die (in diesem Fall 3) Container eingelesen werden.
var step_container = document.getElementsByClassName("step-container");
var buttons = document.getElementsByClassName("step-navigation-button");
for (var i = 0; i < buttons.length; i++)
{
buttons[i].addEventListener("click", function (e) {
e.preventDefault();
});
}
Alles anzeigen
Zeile 7 könnte neu sein. Die Variable e enthält Event-relevante Daten (definiert in Zeile 6). Mittels preventDefault() wird das Standardverhalten des Browsers gestoppt. Wenn man dies also zum Beispiel auf einen a-Tag anwendet, wird die Funktionalität komplett aufgehoben, beim Klick wird nichts passieren.
Manche Browser laden bei Buttons ohne value-Atribut die Seite neu, was das Formular leeren könnte.
Anmerkung: Es ließe sich selbstverständlich statt data- auch einfach value verwenden, aber wieso nicht mal zwei neue Dinge lernen? Außerdem ist das auch eine Sache von Geschmack. Ich habe lange Zeit Windows Apps programmiert, neben C# auch mit HTML und Javascript, da gewöhnt man sich die data-Attribute an, die sind extrem wertvoll.
Jetzt bleibt nur noch das Auslesen des data-Tags und das entsprechende Anzeigen und Verbergen der betroffenen Elemente, einfach in die Schleife einfügen:
var target = e.target.dataset.target;
for (var i = 0; i < step_container.length; i++)
{
if(target == i)
step_container[i].style.display = "block";
else
step_container[i].style.display = "none";
}
Alles anzeigen
Hier übrigens auch wieder Stil-Frage. Folgt nach einee if oder else Abfrage nur ein Befehl, kann man sich die { ... } (Befehlsblock) sparen, hilft bei Übersicht.
Das onload Eventnicht vergessen und dann einfach mal ausprobieren:
window.onload = function ()
{
var buttons = document.getElementsByClassName("step-navigation-button");
var step_container = document.getElementsByClassName("step-container");
for (var i = 0; i < buttons.length; i++)
{
buttons[i].addEventListener("click", function (e) {
e.preventDefault();
var target = e.target.dataset.target;
for (var i = 0; i < step_container.length; i++)
{
if(target == i)
step_container[i].style.display = "block";
else
step_container[i].style.display = "none";
}
});
}
}
Alles anzeigen
Das alt-Attribut erzeugt auch keinen Tooltip, sondern wird angezeigt wenn das Bild nicht geladen werden kann. Was du suchst ist das title-Attribut.
Hallo HTML-Anfaenger, zunächst ein mal vielen Dank für deine ausführliche Problembeschreibung.
Ich empfehle dir zuerst, deinen Javascript Code möglichst aus dem HTML Code herauszuhalten. Besonders wenn verschiedene Personen an einem Werk arbeiten ist eine saubere Trennung hilfreich. Dabei möchte ich dir natürlich gerne helfen. Zunächst habe ich deinen Code etwas abgeändert und eine solide Basis geschaffen.
Wegen der Übersicht habe ich viele für unser Vorhaben unnötige Informationen herausgenommen, die du hinterher natürlich wieder einfügen kannst.
Außerdem habe ich sämtliches Javascript entfernt, dafür habe ich den Buttons aussagekräftigere Namen gegeben, den Aufbau erkläre ich später.
Zusätzlich hat jeder Button die Klasse "action_button" erhalten, auch das wird weiter unten geklärt.
Bis dahin der Code:
<!DOCTYPE html>
<html lang="de">
<head>
<title>WEINFIRMA</title>
<meta charset="utf-8" />
<style>
body {
background-color: #66CCFF;
}
input, textarea, select {
border: 2px solid #333333;
background: #FFFFFF;
font: bold 11px Verdana, Arial, Helvetica, sans-serif;
color: #000000;
}
td {
font: bold 14px Verdana, Arial, Helvetica, sans-serif;
color: #000000;
}
</style>
<script>
</script>
</head>
<body>
<form name="Warenkorb" method="post">
<label><b>Warenkorb</b></label>
<table>
<tr>
<td>Produktname</td>
<td>Produktanzahl</td>
<td>Produktpreis</td>
<td></td>
</tr>
<tr>
<td>Rotwein 1</td>
<td>
<input type="text" name="anzahl_rotwein1" readonly="readonly" value="0" />
</td>
<td></td>
<td>
<input type="button" class="action_button" name="anzahl_rotwein1-increase" value="+" />
<input type="button" class="action_button" name="anzahl_rotwein1-decrease" value="-" />
</td>
</tr>
<tr>
<td>Rotwein 2</td>
<td>
<input type="text" name="anzahl_rotwein2" readonly="readonly" value="0" />
</td>
<td></td>
<td>
<input type="button" class="action_button" name="anzahl_rotwein2-increase" value="+" />
<input type="button" class="action_button" name="anzahl_rotwein2-decrease" value="-" />
</td>
</tr>
<tr>
<td>Weißwein 1</td>
<td>
<input type="text" name="anzahl_weisswein1" readonly="readonly" value="0" />
</td>
<td></td>
<td>
<input type="button" class="action_button" name="anzahl_weisswein1-increase" value="+" />
<input type="button" class="action_button" name="anzahl_weisswein1-decrease" value="-" />
</td>
</tr>
<tr>
<td>Weißwein 2</td>
<td>
<input type="text" name="anzahl_weisswein2" readonly="readonly" value="0" />
</td>
<td></td>
<td>
<input type="button" class="action_button" name="anzahl_weisswein2-increase" value="+" />
<input type="button" class="action_button" name="anzahl_weisswein2-decrease" value="-" />
</td>
</tr>
</table>
<input type="submit" value="Bestellvorgang fortsetzen">
</form>
<footer>
Copyright © 2015 Impressum Kontakt
</footer>
</body>
</html>
Alles anzeigen
Sämtlichen Javascript Code fügen wir nun in den Script-Tag (Zeile 24-26) ein.
Jetzt zum Programm an sich:
Elemente auswählen
Du fragst dich nun sicher, woher Javascript jetzt wissen soll wann ein Button geklickt wird. Dafür benutzen wir Selektoren aus dem document-Objekt von Javascript und so genannte EventListener. EventListener machen genau das selbe wie zum Beispiel ein onclick Attribut im HTML Code.
Selektieren:
document.getElementById();
document.getElementsByClassName();
document.getElementsByName();
document.getElementsByTagName();
Es fällt direkt auf, dass beim Wort "Element" in den letzten 3 Fällen der Plural genutzt wird, das bedeutet im Klartext: Es können mehrere Elemente zurückgegeben werden. Wenn die Seite 3 p-Elemente beinhaltet, resultiert document.getElementsByTagName("p"); in einem Array mit allen 3 Elementen. Ein Array ist eine Variable, die mehrere Variablen enthalten kann. Alles dazu kannst du hier nachlesen.
EventListener:
// var meinElement enthält ein durch document.getElement... selektiertes Element
meinElement.addEventListener("click", function(e){
// Was passieren soll, wenn das Element geklickt wird
});
Der Aufbau wird dir auf den ersten Blick eventuell sehr fremd vorkommen, wenn man ein paar mal damit gearbeitet hat ist das Ding aber gar nicht mehr so schwer. Bei Klick wird eine anonyme Funktion aufgerufen. Das heißt eine Funktion ohne Namen, alles zu Funktionen kannst du hier lesen.
Reihenfolge
Javascript wird im obigen Code nun vor dem HTML Code verarbeitet. Das heißt wenn wir Selektoren (document.getElement...) benutzen, gehen die ins Leere, da die HTML Elemente noch nicht geladen sind. Entweder packen wir den Javascript Code hinter den HTML Code, oder wir nutzen einen kleinen Trick:
Auch hier wieder eine anonyme Funktion, welche durch einen EventListener (dies mal auf noch eine andere Art) ausgelöst wird. Nämlich genau dann, wenn der gesamte Fensterinhalt geladen ist.
Aufbau des Scripts
Zuerst den Ablauf klarmachen:
Punkt 1 ist hier der absolut schwierigste für Anfänger.
Wie Elemente mittels Javascript ausgelesen werden ist bereits klar, also kann damit auch angefangen werden. Jeder wichtige Button hat die Klasse "action_button", also bietet sich getElementsByClassName an:
window.onload = function(){
var buttons = document.getElementsByClassName("action_button");
}
In der Javascript Konsole (hier unter Punkt 3 eine Erläuterung) enthält die button Variable nun 8 button-Elemente:
HTMLCollection [
0: <input.action_button>,
1: <input.action_button>,
2: <input.action_button>,
3: <input.action_button>,
4: <input.action_button>,
5: <input.action_button>,
6: <input.action_button>,
7: <input.action_button>
]
Wenn man jetzt einen EventListener hinzufügen will, muss man das Array zunächst in einer Schleife durchlaufen. Eine Schleife führt eine bestimmte Aktion bis zu einem gewünschten Ereignis immer wieder aus. Da die Elemente des Arrays mit Zahlen in aufsteigender Abfolge angesprochen werden können, empfiehlt sich die for-Schleife (alle Infos hier
Zum nachvollziehen:
In Kombination mit dem EventListener:
// Warten bis alle Inhalte geladen sind
window.onload = function () {
// Alle benötigten Elemente einlesen
var buttons = document.getElementsByClassName("action_button");
// Das Array durchlaufen und EventListener hinzufügen
for(var i = 0; i < buttons.length; i++)
{
buttons[i].addEventListener("click", function (e) {
// Was passiert beim Klicken
});
}
}
Alles anzeigen
Nach dem Klick
Jetzt sind drei Dinge interessant:
Hier kommt das veränderte name-Attribut der Buttons ins Spiel, dort sind alle Informationen enthalten:
Vor dem Bindestrich steht das Input Element, dahinter die Aktion. Diese beiden Informationen müssen nun extrahiert werden, dazu wird erst das Element benötigt:
In der Konsole geprüft enthält die target-Variable nun nach dem Klicken (z. B.):
Als nächstes das name-Attribut auslesen:
buttons[i].addEventListener("click", function (e) {
var target = e.target;
var name = target.getAttribute("name");
});
Die Konsole meldet:
Als nächstes muss dieser String (Zeichenkette) aufgeteilt werden. Dafür gibt es in Javascript die split()-Funktion:
buttons[i].addEventListener("click", function (e) {
var target = e.target;
var name = target.getAttribute("name");
var info = name.split("-");
});
Die Konsole zum Inhalt von "info":
Jetzt kann das betroffene Input Element selektiert werden:
Da ein Array zurückgegeben wird (siehe weiter oben), wird am Ende noch das 0-te Element ausgewählt. Es wäre auch Möglich statt dem name-Tag mit ID's zu arbeiten, da der name-Tag in einem Input Feld aber sowieso nötig ist, ist diese Lösung sogar einfacher (wenn man sie verstanden hat).
Mit dem von Javascript zur Verfügung gestellten .value-Attribut lässt sich das Input Feld nun auslesen und bearbeiten, vorher wird entschieden ob hoch oder herunter gezählt wird:
if(info[1] == "increase")
{
input_element.value = parseInt(input_element.value) + 1;
}
else
{
input_element.value = parseInt(input_element.value) - 1;
}
Achtung! Der value-Wert vom Input Feld gibt einen String zurück, daher erst mittels parseInt() in einen Integer umwandeln und dann damit rechnen.
Weniger als 0 Einträge im Warenkorb machen keinen Sinn, daher einfach eine kurze Überprüfung mit einbauen:
if(info[1] == "increase")
{
input_element.value = parseInt(input_element.value) + 1;
}
else
{
if (parseInt(input_element.value) - 1 >= 0)
{
input_element.value = parseInt(input_element.value) - 1;
}
}
Alles anzeigen
Und noch ein mal der ganze Javascript Code:
// Warten bis alle Inhalte geladen sind
window.onload = function () {
// Alle benötigten Elemente einlesen
var buttons = document.getElementsByClassName("action_button");
// Das Array durchlaufen und EventListener hinzufügen
for(var i = 0; i < buttons.length; i++)
{
buttons[i].addEventListener("click", function (e) {
// Benötigte Informationen auslesen
var target = e.target;
var name = target.getAttribute("name");
var info = name.split("-");
var input_element = document.getElementsByName(info[0])[0];
// Entscheiden was passiert
if(info[1] == "increase")
{
input_element.value = parseInt(input_element.value) + 1;
}
else
{
if (parseInt(input_element.value) - 1 >= 0)
{
input_element.value = parseInt(input_element.value) - 1;
}
}
});
}
}
Alles anzeigen
Am Anfang sicher viele verwirrende Faktoren aber wenn Fragen offen sind bitte immer raus damit.
Die Zeilen 11-14 lassen sich übrigens zusammenfassen, so müssen nicht 4 Variablen zugewiesen werden (der Garbage-Collector wird es danken):
var info = e.target.getAttribute("name").split("-");
var input_element = document.getElementsByName(info[0])[0];
Ich habe jetzt wirklich viel geschrieben, ich wusste nicht wie viel Grundwissen du besitzt. Wie bereits erwähnt: Wenn du irgendwas nicht verstehen solltest scheue dich nicht nachzufragen.
Bei dem Code handelt es sich noch sehr um "Basics", man kann noch deutlich mehr Dynamik und Funktionalität da reinbringen.
Ohne PHP geht das nicht. Keine Chance. Um eine E-Mail direkt zu verschicken braucht es einen laufenden Mailserver und PHP.
Per Javascript fiele mir z.B. so eine Notlösung ein:
Man kann auch Parameter übergeben:
Da könnte man via Javascript die Formulardaten vorher auslesen und entsprechend eintragen. Problem ist: Der "Kunde" sieht die E-Mail und muss auf senden drücken. Außerdem gibt es hier große Unterschiede in der Handhabung des Befehls durch den Browser.
Man muss halt bedenken, dass dabei ein Array erstellt wird. Die performen natürlich etwas langsamer, was aber nicht unbedingt Schlecht sein muss. Der Vorteil ist halt, dass man auch gleich alles vor dem Bindestrich zur Verfügung hat (falls benötigt).
Am Besten wäre es wenn du sowohl die HTML Datei, als auch die CSS Datei auf deinem Server hochlädst und beide hier verlinkst, das Problem welches du hast scheint mit floating behebbar.
Ohne deinen Code keine Hilfe.
Es ist (zumindest für mich) auch nicht ersichtlich was genau du versuchst.
Dein Fehler sind die fehlenden value Attribute. Ein Option Feld braucht ein value Attribut, deine option Elemente haben keines:
Das ist leicht gelöst, einfach beim Erstellen der Option ein zweites Attribut mit dem gewünschten Value Wert übergeben:
{
unterkategorieAuswahl.options[0] = new Option("-Modell auswählen-");
unterkategorieAuswahl.options[1] = new Option("S3", "S3");
unterkategorieAuswahl.options[2] = new Option("S4", "S4");
}
Dementsprechend auch für die Apple Auswahlfelder anwenden.
Oder eben im HTML Baum außerhalb des Inhaltes platzieren und via CSS anpassen.
Ist das dein kompletter Code? Gab es Fehlermeldungen? Wenn ja welche? Du musst uns schon mehr Informationen liefern, wir können schlecht raten was da schief läuft.
Du hast doch selbst geschrieben, dass vor einer header Funktion nichts ausgegeben werden darf. Warum schreibst du die header Funktion dann hinter eine Ausgabe und nicht davor?
Die beiden Einträge margin:0 und paddin:0 machen an dieser Stelle mehr Probleme als sie lösen.
Hast du da ein konkretes Beispiel?
Was für einen Slider suchst du? Mit dem Stichwort fallen mir hunderte Möglichkeiten ein, etwas genauer musst du werden.
HTML-Seminar.de - mit Videos zum schnellen Lernen, wie man eine Website selbst erstellt.