2010-01-31 15 views
5

Ho effettuato un controllo fieldset pieghevole personalizzato in asp.net. Io uso jquery per aggiungere gli effetti di commutazione. Il controllo funziona perfettamente, ma quando sto usando i miei fieldset all'interno di un updatepanel, più un postback perdo la mia logica jquery a causa del documento. Già.JQuery Live() non funzionante

Ora ho letto della nuova funzione Live() di Jquery ma non riesco a farlo funzionare. Cosa faccio di sbagliato? Qualcuno ha la risposta ??

Grazie mille

Il mio codice jQuery è:

$(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 Mi piace l'idea di usare la freccia (compresso/espanso) totalmente CSS attraverso la frontiera larghezza – adardesign

+0

Sei sicuro di vivere() è ancora chiamato? – RamboNo5

risposta

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

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

primo luogo si vuole rimuovere la classe di un aggiungere un'altra classe se ha la classe è crollato, uno poi si rimuove la classe collassata. Non so se influisce sul funzionamento del sistema, ma vale la pena provarlo.

La funzione funziona se si utilizza semplicemente .click (quando il campo non viene aggiornato)?

+0

Ciao a tutti, Il live (non viene chiamato. Quindi questo non funziona. Ho risolto questo problema usando un campo nascosto.In questo campo tengo traccia di quale fielset è aperto o chiuso. Quindi grazie per la risposta del tuo Greatings Talsja – Talsja

5

Il problema è che si sta facendo più quindi solo un selettore semplice per la selezione diretta

Da api.jquery.com "metodi di attraversamento del DOM non sono pienamente supportati per la ricerca di elementi da inviare al .Live(). Piuttosto, il Il metodo .live() dovrebbe sempre essere chiamato direttamente dopo un selecton "

+1

+1 Grazie, ho sempre avuto problemi con il metodo 'live()', che è una cosa buona da sapere! – adardesign

+4

Ha senso se ci pensi ... 'live' dovrebbe controllare se gli elementi di destinazione corrispondono a un particolare selettore all'ora dell'evento, non al momento della chiamata. Un wrapper' $() a cuore rappresenta una lista di elementi abbinati al momento della creazione, è un totale hack che puoi richiamare 'live()' per riutilizzare il selettore con cui è stato creato. Questo è un design API errato e fuorviante! Dovrebbe essere stato chiamato '$ .live (selector, eventType, handler)'. – bobince

+0

Questo era esattamente il mio problema, grazie Petersen. I selettori memorizzati nella cache, sebbene siano normalmente preferibili perché non è necessario interrogare nuovamente il dom, danno un problema a .live(). Non farlo come ho fatto io, non funzionerà: $ ("dd", questo. $ $) .live ("clic", funzione (evento) {}); – SimplGy

1

L'attraversamento è il problema. Puoi risolverlo con una semplice selezione.

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