2010-01-31 23 views
5

He creado un control de conjunto de campos colapsable personalizado en asp.net. Yo uso jquery para agregar los efectos de alternar. El control funciona perfectamente, pero cuando estoy usando mis conjuntos de campos dentro de un panel de actualización, después de una devolución de datos, pierdo mi lógica de jquery debido al documento.JQuery Live() no funciona

Ahora que he leído sobre la nueva función Live() de Jquery, pero no lo hago funcionar. ¿Qué hago mal? ¿Alguien tiene la respuesta?

Muchas gracias

Mi código jQuery es:

$(document).ready(function() { 

    $.fn.collapse = function(options) { 
     var defaults = { closed: false } 
     settings = $.extend({}, defaults, options); 

     return this.each(function() { 
      var obj = $(this); 

      obj.find("legend").addClass('SmartFieldSetCollapsible').live("click", function() { 


       if (obj.hasClass('collapsed')) { 
       obj.removeClass('collapsed').addClass('SmartFieldSetCollapsible'); } 

       $(this).removeClass('collapsed'); 

       obj.children().next().toggle("slow", function() { 

        if ($(this).is(":visible")) { 

         obj.find("legend").addClass('SmartFieldSetCollapsible'); 
         obj.removeAttr("style"); 
         obj.css({ padding: '10px' }); 
         obj.find(".imgCollapse").css({ display: 'none' }); 
         obj.find(".imgExpand").css({ display: 'inline' }); 

        } 
        else { 

         obj.css({ borderLeftColor: 'transparent', borderRightColor: 'transparent', borderBottomColor: 'transparent', borderWidth: '1px 0px 0px 0px', paddingBottom: '0px' }); 
         obj.find(".imgExpand").css({ display: 'none' }); 
         obj.find(".imgCollapse").css({ display: 'inline' }); 

        } 
       }); 
      }); 

      if (settings.closed) { 
       obj.addClass('collapsed').find("legend").addClass('collapsed'); 
       obj.children().filter("p,img,table,ul,div,span,h1,h2,h3,h4,h5").css('display', 'none'); 
      } 
     }); 
    }; 


}); 


$(document).ready(function() { 

$("fieldset.SmartFieldSetCollapsible").collapse(); 

}); 
+0

+1 Me gusta la idea de usar la flecha (colapsado/expandido) totalmente CSS a través de la frontera Ancho – adardesign

+0

¿Seguro viven() es incluso llamó? – RamboNo5

Respuesta

2
  if (obj.hasClass('collapsed')) { 
      obj.removeClass('collapsed').addClass('SmartFieldSetCollapsible'); } 

      $(this).removeClass('collapsed'); 

Primero se quieren eliminar la clase de una añadir otra clase si tiene la clase se derrumbó, un continuación, se quita la clase colapsado No sé si afecta el funcionamiento del sistema, pero vale la pena intentarlo.

¿Funciona la función si solo usa .click (cuando el campo no está actualizado)?

+0

Hola a todos, The live (no se llama. Así que esto no funciona. He resuelto este problema usando un campo oculto. En este campo hago un seguimiento de qué campo de campo está abierto o cerrado. Así que ahora todo funciona bien, gracias a todos por su reproducción Greatings Talsja – Talsja

5

El problema es que se está haciendo más que sólo un selector normal para su selección en vivo

De api.jquery.com "métodos de recorrido DOM no son totalmente compatibles para la búsqueda de elementos para enviar a .live(). Por el contrario, la El método .live() siempre se debe llamar directamente después de una selección en "

+1

+1 Gracias, siempre he tenido problemas con el método 'live()', eso es bueno saber! – adardesign

+4

Tiene sentido si lo piensas ... 'live' se supone que comprueba si los elementos de destino coinciden con un selector en particular en el momento del evento, no en el tiempo de llamada. Un contenedor' $() 'en el corazón representa una lista de elementos coincidentes en el momento de su creación. puede llamar a 'live()' para reutilizar el selector con el que se creó. Esto es un diseño incorrecto y engañoso de la API. Debería haberse llamado '$ .live (selector, eventType, handler)'. – bobince

+0

Este fue exactamente mi problema, gracias Petersen. Los selectores en caché, aunque normalmente son preferibles porque no tienes que consultar el dom de nuevo, dan problemas a .live(). No haga esto como lo hice, no funcionará: $ ("dd", this ._ $ element) .live ("click", function (event) {}); – SimplGy

1

El desplazamiento es el problema. Puedes resolverlo con una simple selección.

var obj = $(this), 
    obj.find("legend").addClass('SmartFieldSetCollapsible'); 
$('legend.SmartFieldSetCollapsible').live('click.collapsible', function(e){