2010-01-31 41 views
5

Tôi đã thực hiện kiểm soát fieldset có thể thu gọn tùy chỉnh trong asp.net. Tôi sử dụng jquery để thêm các hiệu ứng chuyển đổi. Kiểm soát hoạt động hoàn hảo nhưng khi tôi đang sử dụng các fieldets của tôi bên trong một updatepanel, afer postback tôi mất logic jquery của tôi vì document.ready.JQuery Live() không hoạt động

Bây giờ tôi đã đọc về hàm Live() mới của Jquery nhưng tôi không làm cho nó hoạt động. Tôi làm gì sai? Có ai đó trả lời không ??

Thanks a lot

mã jQuery của tôi là:

$(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 Tôi thích ý tưởng sử dụng CSS (thu gọn/mở rộng) hoàn toàn CSS qua chiều rộng biên giới – adardesign

+0

Bạn có chắc chắn live() thậm chí còn được gọi không? – RamboNo5

Trả lời

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

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

Trước tiên, bạn muốn loại bỏ lớp một thêm lớp khác nếu nó có lớp sụp đổ, một sau đó bạn loại bỏ các lớp bị sập. Tôi không biết nếu nó ảnh hưởng đến hoạt động của hệ thống nhưng nó là giá trị để thử.

Chức năng có hoạt động nếu bạn chỉ sử dụng. Nhấp chuột (khi trường này không được cập nhật)?

+0

Xin chào tất cả, Cuộc sống (không được gọi. Vì vậy, điều này không làm việc.Tôi đã giải quyết vấn đề này bằng cách sử dụng một lĩnh vực ẩn.Trong lĩnh vực này tôi theo dõi trong đó fielset là mở hoặc đóng cửa. Vì vậy, cảm ơn tất cả vì replay của bạn Greatings Talsja – Talsja

5

Vấn đề là bạn đang làm nhiều hơn thì chỉ là một selector đơn giản để lựa chọn sống của bạn

Từ api.jquery.com "phương pháp traversal DOM không được hỗ trợ đầy đủ cho việc tìm kiếm các yếu tố để gửi đến .live(). Thay vào đó, Phương thức .live() phải luôn được gọi trực tiếp sau khi lựa chọn "

+1

+1 Cảm ơn, tôi luôn gặp vấn đề với phương thức 'live()', đó là điều tốt để biết! – adardesign

+4

Sẽ có ý nghĩa nếu bạn nghĩ về nó ... 'live' được coi là để kiểm tra xem các phần tử đích có khớp với một bộ chọn cụ thể tại thời điểm sự kiện hay không, không phải lúc gọi. bạn có thể gọi 'live()' trên nó để định vị lại bộ chọn mà nó đã được tạo ra. Đây là thiết kế API xấu, gây hiểu nhầm! Nó phải được gọi là '$ .live (selector, eventType, handler)'. – bobince

+0

Đây chính xác là vấn đề của tôi, Cảm ơn Petersen. Bộ đệm được lưu trong bộ nhớ cache, trong khi thường thích hợp hơn vì bạn không phải truy vấn lại dom, hãy đưa ra sự cố .live(). Đừng làm điều này như tôi đã làm, nó sẽ không hoạt động: $ ("dd", phần tử ._ $ này) .live ("click", function (event) {}); – SimplGy

1

Truyền tải là vấn đề. Bạn có thể giải quyết nó bằng một lựa chọn đơn giản.

var obj = $(this), 
    obj.find("legend").addClass('SmartFieldSetCollapsible'); 
$('legend.SmartFieldSetCollapsible').live('click.collapsible', function(e){ 
Các vấn đề liên quan