Bei Klick auf Link Dialogbox
Sebastian
- javascript
Hallihallo.
Ich möchte bei Klick auf einen Link eine Dialogbox aufrufen mit den Buttons [OK] und [Abbrechen].
Bei Wahl von [Abbrechen] soll auf der aktuellen Seite geblieben werden. Bei [OK] soll ein Formular an die verlinkte Seite geschickt werden.
Dazu habe ich eine Funktion geschrieben, die ich mit OnClick auslöse:
<a href="irgendwas.html" OnClick="checkdialog()">Klick</a>
Problem:
Egal was man anklickt - [OK] oder [Abbrechen] - wird der Link aufgerufen, ohne dass checkdialog() Zeit zur Ausführung hat.
Wenn ich das href-Attribut weglasse, funktioniert es, aber ich hab nicht die linktypische Formatierung.
Gibt es irgendeine elegantere Lösung, wie man dieses Vorhaben umsetzen könnte?
Vielen Dank
MfG Sebastian
Hallo,
Ich möchte bei Klick auf einen Link eine Dialogbox aufrufen mit den Buttons [OK] und [Abbrechen].
sieh Dir http://de.selfhtml.org/javascript/objekte/anzeige/bsp_confirm_weiter.htm und http://de.selfhtml.org/javascript/objekte/anzeige/window_confirm.htm an! Wenn diese Möglichkeit nicht für Dich in Betracht kommt, weil Du auf externe Dokumente verweist, kannst Du auch folgendes nutzen:
<a href="index.html" onclick="if(!confirm('Mein Web verlassen')){return false}">test</a>
Gruß aus Berlin!
eddi
Jaja. Das confirm() ist mir bekannt. Den verwende ich auch in meiner checkdialog()-Funktion.
Sinn der Sache ist folgender:
Bei Klick auf den Link wird ein entsprechender Eintrag aus einer MySQL-Datenbank gelöscht. Damit das nicht versehentlich passieren kann, wenn man zum Beispiel den Link aus der History anklickt, wird bei Klick auf [OK] noch ein verstecktes Formular mitgesendet, so dass die verarbeitende Datei nur löscht, wenn $_POST gesetzt ist. Damit kann man den Eintrag wirklich nur löschen, wenn man den Link auf dieser Seite anklickt.
Klickt man [OK] wird das Formular gesendet, bei [Abbrechen] passiert gar nichts.
Dabei soll das ganze auch noch wie ein Link aussehen. Dazu muss ich allerdings href setzen. Wenn ich das gesetzt habe, wird dieser Link unabhängig von dem Dialog geladen. Wenn ich es nicht setze, hab ich nicht die linktypische Formatierung. Die könnte ich zwar nachträglich anpassen, aber ich hab keine Ahnung wie ich dem Mauszeiger sage er soll sich verändern, wenn man drüber ist.
Deswegen wollte ich wissen, ob es vielleicht eine elegantere Lösung gibt.
Re:
Klickt man [OK] wird das Formular gesendet, bei [Abbrechen] passiert gar nichts.
Du hast die beiden Beispiele nicht angesehen oder nachvollzogen. Dort hast Du bereits zwei Lösungsansätze. Was erwartest Du jetzt noch?
Dabei soll das ganze auch noch wie ein Link aussehen.
Wenn Du ein Formular meinst verwenden zu müssen, beschäftige Dich mit Stylesheets!
Dazu muss ich allerdings href setzen. Wenn ich das gesetzt habe, wird dieser Link unabhängig von dem Dialog geladen. Wenn ich es nicht setze, hab ich nicht die linktypische Formatierung. Die könnte ich zwar nachträglich anpassen, aber ich hab keine Ahnung wie ich dem Mauszeiger sage er soll sich verändern, wenn man drüber ist.
Nutze einen herkömmlichen Link und XMLHttoRequest (vgl. W3C), aber bis dahin hast Du zu verstehen, was onclick="return(false);" bewirkt! (vermutlich ist das Dein Verständnisfehler.)
Deswegen wollte ich wissen, ob es vielleicht eine elegantere Lösung gibt.
Was ist Dir an if(!confirm('Mein Web verlassen')){return false}
nicht elegant genug?
Gruß aus Berlin!
eddi
Doch. Ich habe die "beiden" Beispiele voll und ganz nachvollzogen. In diesem einen Beispiel gibt es ne Seite A und ne Seite B. Von Seite A aus wird Seite B aufgerufen. Auf Seite B ist ein confirm(). Bei true zeigt es den Inhalt an, bei false gehts mit history.back() zurück zu Seite A.
Was ich anstrebe ist allerdings, dass bei Klick auf ein Objekt auf Seite A das confirm() kommt und bei false auch auf Seite A bleibt. Nur bei true soll es auf Seite B gehen und nebenbei noch ein paar $_POST-Daten an die Seite übergeben.
Das bekomme ich auch soweit hin, nur dass eben der Mausezeiger nicht wie bei einem Link zum Pointer wird. DAS ist das eigentlich Ziel, das ich erreichen möchte. Wenn ich gleich einen Link als Objekt benutze, habe ich das oben beschriebene Problem.
Sinn ist der:
User möchte was löschen. Klickt auf den Button. Bekommt Meldung ("Wollen Sie wirklich löschen etc.").
[Abbrechen] -> nichts passiert. User bleibt auf der Seite.
[OK] -> User kommt auf die nächste Seite. Script erkennt &_POST-Daten und löscht Eintrag.
Wenn der User zufällig nun aus seiner History auf die Lösch-Seite kommt, dann wird verweigert, weil keine $_POST-Daten.
Wenn ich es so wie in den "beiden" Beispielen mache, dann bekommt der User bei einem zufälligen Aufruf die confirm()-Meldung auf der Lösch-Seite. Wenn jetzt schon Tage zwischen dem eigentlichen Aufruf dazwischenliegen und er sich nicht mehr daran erinnert was das ist und halt mal auf [OK] drückt, dann wird etwas versehentlich gelöscht.
Um abzusichern, dass ein User nur absolut bewusst löscht, soll das Lösch-Script nur funktionieren, wenn er von Seite A darauf zugreift.
Wie bereits erwähnt, es funktioniert. Ich möchte nur noch einen Pointer-Mauszeiger, wenn man mit der Maus über dem entsprechenden Link ist.
Entschuldigung.
Edit:
Ich habe einen Teil deines Posting überlesen. Ich dachte du meintest mit den beiden Beispielen, die beiden Links und war etwas verwirrt, das das ein und derselbe Fall ist.
Bei dem Code, den du gepostet hast, hab ich das Problem, dass ich noch nicht genau weiß, wie ich die $_POST-Daten übermitteln soll.
Ich habs jetzt gelöst, indem ich den Cursor auf Pointer setze. Falls jemand dennoch ne Idee hat wie man es mit nem Link lösne könnte, immer her damit.
Viel Dank für die Hilfe.
Hi Sebastian,
wäre vielleicht ganz hilfreich gewesen, wenn du mal deine Funktion checkdialog()
preisgegeben hättest.
Gibt die denn auch wirklich false
zurück, wenn auf "Abbrechen" geklickt wird?
Und dann mußt du das false
, das deine Funktion (hoffentlich) zurückgibt auch noch an den Link weitergeben:
<a href="irgendwas.html" OnClick="return checkdialog()">Klick</a>
gruß
peter
Hallo,
Doch. Ich habe die "beiden" Beispiele voll und ganz nachvollzogen. In diesem einen Beispiel gibt es ne Seite A und ne Seite B. Von Seite A aus wird Seite B aufgerufen. Auf Seite B ist ein confirm(). Bei true zeigt es den Inhalt an, bei false gehts mit history.back() zurück zu Seite A.
Was ich anstrebe ist allerdings, dass bei Klick auf ein Objekt auf Seite A das confirm() kommt und bei false auch auf Seite A bleibt. Nur bei true soll es auf Seite B gehen...
Wie bereits angeführt, bewirkt dies <a href="Seite_B.html" onclick="if(!confirm('blub')){return false}">test</a>
.
...und nebenbei noch ein paar $_POST-Daten an die Seite übergeben.
Wie bereits angeführt, lässt sich dies durch einen Link und ein XMLHttoRequest-Objekt per JavaScript bewerkstelligen.
Das bekomme ich auch soweit hin, nur dass eben der Mausezeiger nicht wie bei einem Link zum Pointer wird. DAS ist das eigentlich Ziel, das ich erreichen möchte.+
Wie bereits angeführt, ist Stylesheets hier die Lösung: cursor:pointer
Wenn ich gleich einen Link als Objekt benutze, habe ich das oben beschriebene Problem.
Du schreibst aber dem zum trotz, "Das bekomme ich auch soweit hin". Was denn nun?
Wenn der User zufällig nun aus seiner History auf die Lösch-Seite kommt, dann wird verweigert, weil keine $_POST-Daten. Wenn ich es so wie in den "beiden" Beispielen mache, dann bekommt der User bei einem zufälligen Aufruf die confirm()-Meldung auf der Lösch-Seite.
Wenn ein XMLHttoRequest-Objekt genutzt wird, besteht diese Sorge nicht mehr.
Wenn jetzt schon Tage zwischen dem eigentlichen Aufruf dazwischenliegen und er sich nicht mehr daran erinnert was das ist und halt mal auf [OK] drückt, dann wird etwas versehentlich gelöscht.
Das ist Humbug, den Du da durchblicken lässt. Sowas vereitelt man mit einer Session serverseitig. Warum nutzt Du keine?
Um abzusichern, dass ein User nur absolut bewusst löscht, soll das Lösch-Script nur funktionieren, wenn er von Seite A darauf zugreift.
Ein XMLHttoRequest-Objekt hinterlässt keine Einträge im history, was ein deutlicher Vorteil ist. Auch ein per POST abgerufenes Dokument ist im history nebst POST-Daten abgelegt. Somit kann ein Nutzer zwei identische Aufrufe starten (auch das könnte eine Session abfangen).
Wie bereits erwähnt, es funktioniert.
Du gestattest, dass ich Bedenken habe? Danke!
Gruß aus Berlin!
eddi
Hi,
Was ist Dir an
if(!confirm('Mein Web verlassen')){return false}
nicht elegant genug?
Daß es falsch ist?
Wenn man ok klickt (also "verlassen"!), gibt confirm true und durch das ! die Bedingung false, also wird kein Returnwert zurückgegeben und die Seite verlassen
Wenn man Abbruch klickt (also "NICHT verlassen"), gibt confirm false zurück, durch das ! ist die Bedingung true, es wird return false ausgeführt und die Seite nicht verlassen.
Daß es noch einfacher geht?
return confirm('Mein Web verlassen')
cu,
Andreas
Hallo Andreas,
Wenn man ok klickt (also "verlassen"!), gibt confirm true und durch das ! die Bedingung false, also wird kein Returnwert zurückgegeben und die Seite verlassen
Wenn man Abbruch klickt (also "NICHT verlassen"), gibt confirm false zurück, durch das ! ist die Bedingung true, es wird return false ausgeführt und die Seite nicht verlassen.
Mein Web verlassen : [abbrechen]
Rückgabewert confirm : false
if-Prüfung ergibt : true -> if(true){return(false);)
return : (wird ausgeführt)
Endergebtnis : Mein Web verlassen -> [abbrrechen] -> Seite wird beibehalten
Mein Web verlassen : [ok]
Rückgabewert confirm : true
if-Prüfung ergibt : false -> if(false){return(false);)
return : (wird nicht ausgeführt)
Endergebtnis : Mein Web verlassen -> [ok] -> andere Seite wird aufgerufen
Daß es noch einfacher geht?
return confirm('Mein Web verlassen')
Das allerdings schon ;)
Gruß aus Berlin!
eddi