2009-11-25 23 views
8

Ich schreibe einen Formular-Assistenten mit JQuery accordion module. Das Problem ist, dass ich alle Mausklicks im Akkordeonmenü außer Kraft setzen möchte, damit das Formular zuerst validiert wird, bevor das Akkordeon den nächsten Abschnitt zeigt.JQuery Akkordeon - klicken Sie auf

Ich habe versucht, die folgenden:

$('#accordion h3').unbind(); 

$('#accordion h3').click(function() { 
    if (validate()) 
    { 
    $("#accordion").accordion('activate', 2); 
    }else 
    { 
    alert("invalid form"); 
    } 
} 

Aber der obige Code funktioniert nicht. Das integrierte Klickereignis des Akkordeons wird immer noch aufgerufen, und das Akkordeon zeigt den nächsten Abschnitt an, unabhängig davon, ob das Formular gültig ist oder nicht.

Ich habe auch versucht, den folgenden Code:

$('#accordion h3').click(function(event) { 
    if (validate()) 
    { 
    $("#accordion").accordion('activate', 2); 
    }else 
    { 
    alert("invalid form"); 
    }   
    event.stopPropagation(); 
}); 

Aber die stopPropagation() Aufruf scheint nicht überhaupt das Akkordeon Verhalten zu beeinflussen, wird der nächste Abschnitt angezeigt, ob das Formular gültig ist.

Irgendeine Idee, was ich falsch machen könnte?

Danke!

Antwort

13

Okay, nahm eine Pause von der Codierung dieser Funktion und bin mit einem frischen Augenpaar dazu zurückgekommen. Hier ist die Lösung:

$("#accordion").accordion({event: false}); 

Hinzufügen von Ereignis: false zum Akkordeon intitialization Code wird von der Ausführung der Standardaktion Mausklicks auf dem Akkordeon-Menü verhindern und dann kann ich schreiben benutzerdefinierte Klick-Code Umgang mit der validate() Funktion ausgeführt werden, wenn Der Benutzer klickt auf das Menü und überschreibt im Wesentlichen die integrierte Klickfunktion des Akkordeons, wenn das Formular die Validierungsprüfung nicht besteht.

BTW, ich benutze JQuery UI Akkordeon-Modul hier.

Arbeiten mit ie7,8, Chrom 19 ff 3.0.3

+0

Ich habe genau das gleiche Problem, das Sie getan haben. Wie bist du zum nächsten Akkordeon-Panel gekommen? –

0

event.stopPropogation() verhindert nicht, dass weitere Event-Handler, die beim Aufruf des Ereignisziels registriert wurden, gestoppt werden. Das Ereignis sperrt das Ereignis, wenn event.bubbles wahr ist. Sie könnten versuchen, dass die Ereignisbehandlungsroutine false oder event.preventDefault() zurückgibt, siehe here oder here für weitere Informationen.

+0

Danke, aber ich glaube, prevent() verhindert nur das Standardverhalten des Elements, mit dem ich interagiere - zum Beispiel verhindert preventDefault() auf einem Link, dass der Browser eine neue Seite lädt, und preventDefault() auf einem Formular verhindert, dass das Formular übermittelt wird. Mit dem Akkordeon-Code versuche ich nicht zu verhindern, dass eine Standardaktion passiert, ich versuche zu verhindern, dass eine benutzerdefinierte Aktion, die in den Akkordeon-Code geschrieben wurde, passiert. Danke für den Vorschlag, aber preventDefault und "return false" löst das Problem nicht –

0

Aus dem Quellcode zu urteilen, ist das Ereignis nicht an die h3s gebunden, sondern an den umgebenden Container (das Plugin verwendet die Ereignisdelegierung). Außerdem ist der Handler nicht an click, sondern an click.ui-accordion gebunden. So versucht:

$('#accordion').unbind('click.ui-accordion'); 

Und nur für das Protokoll: Es gibt keine solche Sache (zumindest noch) nicht als „JQuery Akkordeon-Modul“. Es gibt nur einige Akkordeon-Plugins für JQuery.

+0

Danke, ich versuchte $ ('# Akkordeon'). Unbind(); vorher, aber es hat das Problem nicht gelöst. Ich denke, das Problem ist, an welches Element das Ereignis gebunden ist, aber ich habe versucht, so ziemlich jedes Element im Akkordeon zu lösen, aber der Klick wird immer noch erkannt und der Code wird immer noch ausgeführt. –

+0

Haben Sie versucht, '$ ('# accordion'). Unbind ('click')' oder '$ ('# accordion'). Unbind ('click.ui-accordion')'? Da ist ein Unterschied. Versuchen Sie auch '$ ('# accordion h3'). Unbind ('click.ui-accordion')'. Es hängt von der Version ab, die Sie verwenden. –

+0

Seltsam, aber ich habe versucht, alle Elemente innerhalb des Akkordeons zu lösen und der Klick wird immer noch von JQuery registriert. Ich habe den folgenden Code ausprobiert: $ ('# accordion'). Unbind ('click.ui-accordion'); $ ('# accordion'). Unbind ('click'); $ ('# accordion h3'). Unbind ('click.ui-accordion'); $ ('# accordion h3'). Unbind ('click'); $ ('# accordion div'). Unbind ('click.ui-accordion'); $ ('# accordion div'). Unbind ('click'); $ ('# Akkordeon div p'). Unbind ('click.ui-accordion'); $ ('# accordion div p'). Unbind ('click'); aber ohne Erfolg ... wird weiter daran arbeiten und wird jede Lösung posten, wenn ich eine finden –

0

Sie haben den Code unten zusammen an der Unterseite der Ready-Funktion schreiben:

$('#accordion h3').unbind('click'); 
$('#accordion a').unbind('click');