2009-11-25 12 views
8

Estoy escribiendo un asistente de formulario usando JQuery's accordion module. El problema es que quiero anular cualquier clic del mouse en el menú de acordeón para que el formulario se valide primero, antes de que el acordeón muestre la siguiente sección.Acordeón de JQuery - Desvincular clic en evento

he intentado lo siguiente:

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

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

Pero el código anterior no funciona. El evento de clic incorporado del acordeón sigue recibiendo llamadas y el acordeón muestra la siguiente sección independientemente de si el formulario es válido o no.

También he intentado el siguiente código:

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

Pero no parece que el stopPropagation() llamada a afectar el comportamiento de acordeón en absoluto, la siguiente sección se muestra si el formulario es válido.

¿Alguna idea de lo que puedo estar haciendo mal?

Gracias!

Respuesta

13

Bien, me tomé un descanso de la codificación de esta función y volví con un par de ojos nuevos. Aquí está la solución:

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

caso Adición: falsa al código de acordeón intitialization evitará clics del ratón en el menú acordeón de la ejecución de la acción por defecto y luego me puede escribir de encargo clic manejo de código para ejecutar la función de validación() cuando el usuario hace clic en el menú, básicamente anulando la función de clic incorporada del acordeón si el formulario falla la comprobación de validación.

BTW, estoy usando el módulo de acordeón de JQuery UI aquí.

Funciona con ie7,8, cromo, 19 y ss 3.0.3

+0

Estoy teniendo exactamente el mismo problema que usted. ¿Cómo terminaste moviéndote al siguiente panel de acordeón? –

0

event.stopPropogation() no impide que otros controladores de eventos registrados con el destino del evento sean invocados, detiene el evento para que no burbujee el DOM si event.bubbles es verdadero. Puede intentar que el controlador de eventos devuelva false o llame al event.preventDefault(), consulte here o here para obtener más información.

+0

Gracias, pero creo que preventDefault() solo evita el comportamiento predeterminado del elemento con el que estoy interactuando; por ejemplo, preventDefault() en un enlace evitará que el navegador cargue una página nueva, y preventDefault() en un formulario impide que se envíe el formulario. Con el código de acordeón, no estoy tratando de evitar que ocurra una acción predeterminada, estoy tratando de evitar que ocurra una acción personalizada escrita en el código de acordeón. Gracias por la sugerencia, pero avoidDefault y 'return false' no resuelve el problema –

0

A juzgar por el código fuente, el evento no está vinculado a los h3, sino al contenedor circundante (el complemento usa delegación de eventos). Además, el controlador no está obligado a click, sino a click.ui-accordion. Así que trate de:

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

Y para que conste: No hay tal cosa (al menos por ahora) como "módulo de acordeón de jQuery". Simplemente hay varios plugins de acordeón para JQuery.

+0

Gracias, probé $ ('# accordion'). Unbind(); antes, pero no resolvió el problema. Creo que el problema es a qué elemento está destinado el evento, pero he intentado desvincular casi todos los elementos del acordeón, pero el clic aún se detecta y el código se sigue ejecutando. –

+0

¿Has probado '$ ('# accordion'). Unbind ('click')' o '$ ('# accordion'). Unbind ('click.ui-accordion')'? Hay una diferencia. Pruebe también '$ ('# accordion h3'). Unbind ('click.ui-accordion')'. Depende de la versión que estés usando. –

+0

Extraño, pero he intentado desvincular todos los elementos dentro del acordeón y JQuery aún registra el clic. He intentado todo el siguiente código: $ ('# accordion'). Unbind ('click.ui-accordion'); $ ('# accordion'). Unbind ('click'); $ ('# accordion h3'). Unbind ('click.ui-accordion'); $ ('# accordion h3'). Unbind ('clic'); $ ('# accordion div'). Unbind ('click.ui-accordion'); $ ('# accordion div'). Desvincular ('clic'); $ ('# accordion div p'). Unbind ('click.ui-accordion'); $ ('# accordion div p'). Unbind ('click'); pero en vano ... seguiré trabajando en esto y publicaré cualquier solución si encuentro uno –

0

usted tiene que escribir el código de abajo juntos en la parte inferior de la función de lista:

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