Wieso funktioniert javascript bei onsubmit nicht

Liebe/-r Experte/-in,
ich nutze das prototype framework für ein gewolltes Infofenster. Komischerweise gehts bei

[
](javascript:openURLWindow(‚emailoderdrucken.php?id=211‘))

wie es soll.

Ein kurzes alert(„test“); vor und hinter dem openWin wird beides ausgegeben…
Mit

gehts nicht. Das Fenster blitzt kurz auf und wird dann groß.

Der Code eine Bsp Seite:

// The following should be put in your external js file,
// with the rest of your ondomready actions.
window.addEvent(‚domready‘, function(){
$$(‚input.DatePicker‘).each( function(el){
new DatePicker(el);
});
});

function openURLWindow(file)
{
var win = new Window({className: „alphacube“, width:300, height:300, zIndex: 10000, url: file})
win.showCenter(„modal“);
}

Betreff

Datum des Schreibens

Text
Sehr geehrte Frau Mustermann,

 

[
](javascript:openURLWindow(‚emailoderdrucken.php?id=211‘))

Ich empfehle hier einen Link auf eine Hinweisseite, das JavaScript benötigt wird, und das javascript-event in onclick=„openURLWindow(…);“ zu packen.

Ich sehe hier 2 potentielle Problemquellem, zum einen gehört das Semikolon vor den Anführungsstrich. Ansonsten wird durch den Submit des Forms die Verarbeitung der aktuellen Seite u.U. abgebrochen, weil eine neue Seite mit den Formulardaten geladen wird.
Stattdessen wäre eventuell ein input type=„button“ mit onclick sinnvoller, der nach getaner Arbeit mit setTimeout den Submit anfeuert.
Da sowieso JavaScript verwendet werden soll, macht das den Braten auch nicht wirklich fett. Und es hat den (meiner Meinung nach) Vorteil, dass man nicht versehentlich durch betätigen der Return-Taste ein unfertiges Formular absendet.

könnte etwa so aussehen:

onclick=„mySubmit(500);“

// global, weil außerhalb von Funktion deklariert.
// somit für den callback von setTimeout verfügbar
var myForm = document.getElementsByTagName(‚form‘)[0];

function mySubmit (ticks) {
deineFunktion(parameter);
setTimeout(„myForm.submit()“, ticks);
}

function deineFunktion (parameter) {
// wurstbrot
}

Was auch noch sein könnte ist, dass das Fenster schnell genug geladen wird, aber durch den Submit der Hauptseite den Fokus verliert und hinter dem Browserfenster mit dem Form landet. Einfach mal durchtabben.

Falls das nicht weiterhilft, bitte bescheid sagen.

Hi,
waow, das war superschnell. Danke! Ich habs gefunden. Umgestellt habe ich es tatsächlich auf onclick.

Aber der Knackpunkt war: return false hinter dem onclick-Aufruf.
Hast Du zufällig eine Ahnung warum? Damit gehts.
Javascript zum absenden darüber mag man streiten.
Für meine Problemstellung ist es ganz optimal:
Ich möchte aus einem Formualar ein pdf generieren.
Und je nachdem ob es gemailt oder per Post verschickt wird bekommt es ein anderes Aussehen.
Daher kommt Fenter schön animiert hoch und fragt nach email oder druck. Gut könnt eman auch im 1. fenster machen. Aber so finde ich persönlich es schöner.

Aber der Knackpunkt war: return false hinter dem
onclick-Aufruf.

return false; am ende der befehlskette eines events (in z.B. a href=… onclick=…; return false;
bewirkt in der regel, dass die eigentliche Funktion der Schaltfläche/des Links/… dadurch nicht ausgeführt wird.

Anwendungsbeispiel:
return confirm(‚Sind alle Eingaben korrekt?‘);

Und wieder was gelernt! Fettes Dankeschön.

Das ist das schöne bei wer-weiss-was
Man bekommt wirklich schnelle und kompetente Hilfe und nicht nach 2 Wochen nen link zu google!
Natürlich gibts auch Leute die können nicht lesen und meinen wer-weiss-was heisst wer-machts-fuer-mich
Danke! :smile:

Kein Problem. Ich geh dann mal zu meiner Patentochter. Ich guck nachher nochmal rein, falls doch noch Fragen aufgetaucht sein sollten. :smile:

Eine Frage habe ich tatsächlich noch…
Wie komme ich nun an die Formular-Werte ran?
Also zB info, betreff, datum bräuchte im Folgefenster zum durchreichen an den pdf Generator.

Wie komme ich nun an die Formular-Werte ran?
Also zB info, betreff, datum bräuchte im Folgefenster zum
durchreichen an den pdf Generator.

abhängig von der angabe im form:
fall 1:

fall 2:

ich empfehle noch die verwendung von isset($array[‚key‘]). wenn man viele fehler mit „AT“ präfix unterdrückt, besonders in schleifen (while, foreach, …), geht das sehr auf die performance.

Last but not least eine dringende empfehlung, wenn du mit mySQL arbeitest:

strings sicher vor mySQL-Injection machen: $var = addslashes($var);
es gibt auch mysql_real_escape_string(), das geht aber 1. nur, wenn du schon mit mysql verbunden bist, 2. wird das dann nicht von php sondern von mysql pro string extra ausgeführt und bremst aus. hatte mit addslashes nie probleme.

für integers reicht ein simpler typecast: $id = (isset($_GET[‚id‘])) ? (int)$_GET[‚id‘] : 0;

ich hoffe, das ist soweit verständlich genug formuliert

Nachtrag: Das zählt natürlich nicht nur für mySQL, sondern für viele Datenbanken-Typen. Google „sql injection“

Hi,

klar post und get. Aber mit return false habe ich doch das Abschicken des forms quasi unterbrochen.

Und die values sind im prototype popup nicht bekannt, also leer. Oder ist es generel möglich und ich habe nur irgendwo einen weiteren bug /Denkfehler drin?

Das „popup“ wird in Firefox als frame tituliert. Ist es also nicht sowas wie ein formatierter iframe? Dann müssten die variablen doch mit sowas wie var datum = parent.getelementbyid(datum).value; zugreifbar sien…

Eine andere Idee wäre eine Session. Aber die kann ich doch nicht js füllen, oder? Weil ich müsste es vo dem Öffnen des fenstern machen.

$_session[‚datum‘] = javascript:document.getelementbyid(datum).value

Irgendwie so…

Hi,

ich habe js/ajax hierfür gecancelt. Ein weiteres Formularfeld mit php und gut ist.
Danke!