2009-11-25 12 views
8

Je vous écris un assistant de formulaire à l'aide de accordion module JQuery. Le problème est que je veux remplacer les clics de souris sur le menu accordéon afin que le formulaire soit validé avant que l'accordéon ne montre la section suivante.accordéon JQuery - événement click unbind

J'ai essayé ce qui suit:

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

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

Mais le code ci-dessus ne fonctionne pas. L'événement de clic intégré de l'accordéon est toujours appelé et l'accordéon affiche la section suivante, que le formulaire soit valide ou non.

J'ai aussi essayé le code suivant:

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

Mais l'appel ne semble pas affecter le comportement de l'accordéon stopPropagation() du tout, la section suivante est affichée si le formulaire est valide.

Toute idée de ce que je peux faire mal?

Merci!

Répondre

13

D'accord, a pris une pause de codage cette fonction et sont revenus à elle avec une nouvelle paire d'yeux. Voici la solution:

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

Ajout d'événement: false au code intitialization accordéon empêchera les clics de souris sur le menu d'accordéon d'exécuter l'action par défaut et je peux écrire cliquer sur le code de gestion personnalisé pour exécuter la fonction validate() lorsque l'utilisateur clique sur le menu, remplaçant essentiellement la fonction de clic intégrée de l'accordéon si le formulaire échoue au contrôle de validation.

BTW, je suis en utilisant le module d'accordéon de l'interface utilisateur JQuery ici.

Fonctionne avec ie7,8, chrome 19, ff 3.0.3

+0

Je rencontre le même problème que vous avez fait. Comment avez-vous fini par passer au prochain groupe d'accordéon? –

0

event.stopPropogation() ne cesse pas d'autres gestionnaires d'événements enregistrés avec la cible d'événement d'être appelé, il arrête l'événement de bouillonnement du DOM si event.bubbles est vrai. Vous pouvez essayer d'avoir le gestionnaire d'événements retour false ou en appelant event.preventDefault(), voir here ou here pour plus d'informations.

+0

Merci, mais je crois preventDefault() empêche uniquement le comportement par défaut de l'élément avec lequel j'interagis - par exemple, preventDefault() sur un lien empêchera le navigateur de charger une nouvelle page, et preventDefault() sur un formulaire empêche la soumission du formulaire. Avec le code accordéon, je n'essaie pas d'empêcher une action par défaut, j'essaie d'empêcher une action personnalisée écrite dans le code de l'accordéon. Merci pour la suggestion, mais preventDefault et 'return false' ne résout pas le problème –

0

A en juger par le code source, l'événement est pas lié aux années h3, mais au conteneur environnant (le plug-in utilise la délégation de l'événement). De plus, le gestionnaire n'est pas lié à click, mais à click.ui-accordion. Essayez donc:

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

Et juste pour le dossier: Il n'y a pas une telle chose (du moins pas encore) comme « module d'accordéon de JQuery ». Il y a simplement plusieurs plugins d'accordéon pour JQuery.

+0

Merci, j'ai essayé $ ('# accordéon'). Unbind(); avant, mais cela n'a pas résolu le problème. Je pense que le problème est l'élément auquel l'événement est lié, mais j'ai essayé de dissocier à peu près tous les éléments de l'accordéon, mais le clic est toujours détecté et le code est toujours exécuté. –

+0

Avez-vous essayé '$ ('# accordéon'). Unbind ('click')' ou '$ ('# accordéon'). Unbind ('click.ui-accordéion')'? Il existe une différence. Essayez aussi '$ ('# accordéon h3'). Unbind ('click.ui-accordéion')'. Cela dépend de la version que vous utilisez. –

+0

Etrange, mais j'ai essayé de délier tous les éléments à l'intérieur de l'accordéon et le clic est toujours enregistré par JQuery. J'ai essayé tout le code suivant: $ ('# accordéon'). Unbind ('click.ui-accordéion'); $ ('# accordéon'). Unbind ('clic'); $ ('#accordion h3'). Unbind ('click.ui-accordéion'); $ ('#accordion h3'). Unbind ('clic'); $ ('# accordéon div'). Unbind ('click.ui-accordéion'); $ ('# accordéion div'). Unbind ('clic'); $ ('# accordéon div p'). Unbind ('click.ui-accordéon'); $ ('# accordéon div p'). Unbind ('clic'); mais en vain ... va continuer à travailler sur cela et postera toute solution si je trouve un –

0

Vous devez écrire le code ci-dessous ensemble au bas de la fonction prêt:

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