[Jquery] Wie kann ich eine Drupal-Formular-Senden-Schaltfläche deaktivieren, wenn auf sie geklickt wird, um doppelte Einreichung zu verhindern?


Answers

Ich denke, die Tatsache, dass Sie an das click -Ereignis der Schaltfläche binden, bedeutet, dass die Schaltfläche deaktiviert wird, bevor das Klickereignis zum Formular übergehen und eine Übermittlung auslösen kann.

Unser Team hat festgestellt, dass die Deaktivierung der Übermittlungsschaltfläche fast immer Probleme für Internet Explorer verursacht. Wir haben ein kleines Plugin erstellt, um das Problem zu lösen. Siehe Code hier: https://stackoverflow.com/a/4473801/4376

Question

Klingt wie eine einfache Frage. Ich habe ein bisschen jQuery Magie hinzugefügt:

$("#edit-save").click(function(event) {
  $(this).attr("disabled", "true");
});

Sobald dies jedoch vorhanden ist, wird mein Formularübergabe-Handler nicht aufgerufen.

Dies ist ein benutzerdefiniertes Formular auf meinem eigenen Pfad, der in hook_menu definiert ist:

$items['my_form'] = array(
  'title' => 'My form',
  'page callback' => 'drupal_get_form',
  'page arguments' => array('mymod_myform'),
  'type' => MENU_CALLBACK,
);

Im Formular habe ich einen Absenden-Button und einen Abbrechen-Button:

$form['cancel'] = array(
  '#type' => 'submit',
  '#value' => t('Cancel'),
);

$form['save'] = array(
  '#type' => 'submit',
  '#value' => t('Save'),
);

und ich definiere meinen eigenen Submit-Handler:

$form['#submit'][] = 'mymod_myform_submit';

Ich habe in der drupal_get_form () - Funktion ein Stück Code zum Verfolgen gesetzt, um die $ _POST-Variable zu schnüffeln, wenn das Formular gesendet wird. Wenn die jQuery-Magie deaktiviert ist, enthält die Variable $ _POST einen "op" -Parameter:

Array
  (
    [op] = Save
    [form_build_id] => form-6e74c87390e3fc48d0bebd2f5193315b
    [form_token] => 33db6e34c0350e33c48861a63a38d45f
    [form_id] => dh_seo_workload_item_form
  )

aber wenn ich die jQuery-Magie aktivieren, um die Übermittlungsschaltfläche zu deaktivieren, nachdem sie geklickt wurde, ist der "op" -Parameter nicht mehr im $ _POST-Array enthalten, und so denkt Drupal, dass das Formular nicht übergeben wurde.

Ich habe die Frage über die doppelte Einreichung von Formularen in jQuery gesehen , bin aber besorgt, dass dies wie ein wirklich hacky Fix aussieht, und es sollte einen besseren Weg geben.




Verstecken Sie einfach Ihre Absenden-Schaltfläche ( display:none ) und zeigen Sie stattdessen eine andere Schaltfläche, die bereits deaktiviert ist. Ich denke, es ist weniger hacky als die anderen Lösungen für dieses Problem. Normalerweise habe ich nur zwei Schaltflächen auf meiner Seite, eine sichtbar und die andere nicht, und onClick, einfach umschalten.

Das Problem wird verursacht, da deaktivierte Schaltflächen Postbacks nicht auslösen.




Links