Ich habe eine grundlegende FAPI-Tasteneingabe, die #ajax aktiviert ist und gut funktioniert, aber ich möchte eine JS hinzufügen. "Sind Sie sicher?" Bestätigungs-Popup beim Klicken auf die Schaltfläche, bevor der Code tatsächlich ausgeführt wird, und ich bin mir nicht sicher, wie ich das tun soll, da JS von FAPI den Klick zu essen scheint, bevor ich darauf zugreifen kann, egal was ich tue.
Ich habe versucht, einen Inline-Onclick-Handler hinzuzufügen, wie folgt:
$form['search_filters']['channels']['channel_delete_' . $channel->nid] = array(
'#type' => 'button',
'#name' => 'channel_delete_' . $channel->nid,
'#value' => 'Delete',
'#attributes' => array(
'class' => array('confirm'),
'onclick' => "return confirm('Are you sure you want to delete that?')"
),
'#button_type' => 'no-submit',
'#ajax' => array(
'callback' => 'delete_channel_callback',
'wrapper' => 'channel_container_' . $channel->nid
),
);
... was nicht hilft, und ich habe auch versucht hinzuzufügen:
$('.confirm').click(function(e) {
e.preventDefault();
alert('Is this recognized')? // never runs
});
im JS meines Moduls, das ebenfalls ignoriert wird.
Irgendwelche anderen Ideen? Gibt es eine Möglichkeit, einen Submit-Handler oben im Stapel hinzuzufügen, den Drupal #ajax erkennt?
quelle
$('.confirm').unbind('click');
) ... oder lese ich es falsch? Entschuldigung nicht vertraut mitunbind
Bestätigung, dass Jeroen den Code des Googletorp korrigiert.
Ich selbst habe jedoch festgestellt, dass die Ereignisse vom Typ "Mousedown" wieder geboten und gebunden werden müssen. Der Code, der für mich funktioniert hat, ist der folgende:
quelle
Die Frage ist alt, aber ich habe mich auch dafür interessiert. Meiner Meinung nach ist es am einfachsten, das Klickereignis in Ihrer Ajax-Definition zu verwenden, da Drupal standardmäßig das Mousedown-Ereignis verwendet:
Dann müssen Sie
.mousedown()
Ihrer Schaltfläche in Ihrer Javascript-Datei nur noch ein Ereignis hinzufügen , da es vor dem Klickereignis ausgelöst wird:Wenn Ihre Ajax-Anfrage weiterhin mit dem Mousedown-Ereignis aufgerufen werden soll, können Sie ein benutzerdefiniertes Ereignis verwenden:
Dann können Sie dieses Ereignis im
.mousedown()
Falle Ihrer Javascript-Datei auslösen :Beide Versionen funktionieren!
quelle
preventDefault
in meinem Klick-Handler haben, um zu verhindern, dass das Formular normal (nicht js) gesendet wird.Haben Sie versucht, Ihr JS innerhalb eines Drupal-Verhaltens auszuführen? Es könnte einfach sein, dass Ihr Klick-Handler nach Drupal angehängt wird.
In beiden Fällen sollten Sie jedoch in der Lage sein, Drupals Klick-Handler auf der Schaltfläche zu lösen, damit Sie zuerst aufgerufen werden, und Sie können Drupals Ajax-Klick-Handler manuell (und bedingt) aufrufen.
quelle
Antworten, um festzustellen, dass der Code von googletorp nicht 100% korrekt ist.
Sie müssen die Zeile, in der die Ereignisse gespeichert sind, folgendermaßen ändern:
Auf diese Weise beseitigen Sie alle Objektreferenzprobleme. Wenn Sie also die Klickereignisse aufheben, wird die Bindung auch nicht in Ihrem var aufgehoben;)
Beachten Sie außerdem, dass die Methode .data () seit jQuery 1.8 veraltet ist. Das Abrufen von Ereignisdaten erfolgt jetzt über eine interne Datenstruktur:
Quelle: http://blog.jquery.com/2011/11/08/building-a-slimmer-jquery/
quelle
Ich habe oben viele nützliche Antworten gefunden und konnte mein Formular zum Laufen bringen. Alles zusammen hat für meine Anwendung funktioniert: Eine Schaltfläche zum Löschen von Formularen mit einem Bestätigungsdialog und einem AJAX-Rückruf, um den Inhalt einer Auswahlliste zu ändern.
Das Javascript:
Das zu ändernde Formularelement (Auswahlliste):
Die Taste:
Und schließlich der AJAX-Rückruf:
quelle
Ich habe dies behoben, indem ich die Datei drupal misc / ajax.jx geändert habe.
Erstellen Sie eine Kopie der Datei ajax.js, fügen Sie ein beliebiges benutzerdefiniertes Modul ein und
Drupal.ajax = function (base, element, element_settings) {
ändern Sie die Funktion in beforeSend:Es funktioniert gut für mich.
quelle
Vielleicht ein bisschen alt, aber ich frage mich, warum wir nicht einfach verwenden können:
quelle