2011-09-30 31 views
5

Với sự kiện đoàn trong jQuery 1.6, bạn có thể đáp ứng với các sự kiện có bọt lên đến một phụ huynh phổ biến.jquery sự kiện ủy nhiệm biến phạm vi với các cuộc gọi liên tiếp

Một thực hiện mẫu là như thế này:

(function($){ 
    $.fn.myeventhandler = function() { 

    return this.delegate('a.next, a.prev', 'click customEvent', function (event) { 

     var target=$(event.target); 
     var bar = null; 

     if('click' == event.type) {    /*~[ call this 'a' ]~*/ 

      // handle the click event 
      $('#next-element').animate({width:'200px'},1300,function(){ 
      bar = 'value1'; 
      $('#next-element').animate({width:'100px'},1300,function(){ 
       bar = 'value2'; 
       console.log(bar); 
      }); 
      }); 

     } else if('customEvent' == event.type) { /*~[ call this 'b' ]~*/ 

      // handle the customEvent event 
      $('#my-element').animate({height:'200px'},1300,function(){ 
      bar = 'my-event1'; 
      console.log(bar); 
      }); 

     } 

     return false; 
    }); 
    } 
})(jQuery); 

Đây là loại cấu trúc có thể làm việc rất tốt khi bạn có nhiều sự kiện gây nên bạn muốn có ràng buộc trên một trang. Tuy nhiên, tôi đã nhận thấy một hành vi tò mò và tự hỏi liệu có ai đó có thể khai sáng cho tôi về phạm vi sau:

Nếu bạn xác định biến 'var bar;' trước 'a' và sử dụng nó trong 'a' và 'a' mất nhiều thời gian để thực thi, sau đó nếu 'lần nhấp' được kích hoạt lần thứ hai, biến 'thanh' có được gán lại giá trị hoặc biến mới sẽ được tạo không?

Lý do cho câu hỏi là tôi đã có hoạt ảnh 'chưa hoàn thành' trong đó hoạt ảnh mất 1,3 giây để hoàn thành. Nếu tôi kích hoạt hai sự kiện nhấp liên tiếp, mục tiêu và loại được đặt chính xác, nhưng hoạt ảnh thứ hai dường như ảnh hưởng đến hình ảnh đầu tiên và hai phạm vi xuất hiện để có sẵn cho nhau.

Tôi chưa hoàn thành hoạt ảnh, vì vậy tôi chưa có bộ làm việc để đặt trực tuyến trong jsFiddle, nhưng có bất kỳ quy tắc nào cho phạm vi ở đây mà tôi nên nghiên cứu hoặc giải thích rõ hơn về phạm vi có sẵn ai đó có thể đã tìm thấy?

EDIT: Ở trên, tôi đã thêm vào trong một tình huống tương tự như những gì tôi đang sử dụng. Trong trường hợp đơn giản ở trên, giá trị của 'bar' vẫn giữ giá trị kỳ vọng trên 2 cuộc gọi liên tiếp, nhưng trong trường hợp phức tạp hơn tôi đang làm việc (vẫn), trừ khi tôi chuyển các tham số vào hàm gọi lại cụ thể, vẫn còn điều kiện cho phép 2 cuộc gọi liên tiếp thay đổi giá trị của thông số sao cho cuộc gọi lại thấy giá trị được tạo bởi cuộc gọi tiếp theo - không phải giá trị được đặt hợp lý trong cuộc gọi được kích hoạt của riêng nó. Nếu bất cứ ai có thể tái tạo hiệu ứng này trên một ví dụ đơn giản, tôi sẽ đánh giá cao nó. Tôi đang giảm bớt các chức năng của mình để cố gắng tạo ra một jsFiddle sao chép nó.

Cảm ơn, AE

+0

'a' là gì? ? ? –

+0

Xin chào, Interstellar_Coder, 'a' trong các chú thích đề cập đến khối if() đầu tiên và 'b' đề cập đến khối 'khác' - xin lỗi nếu nhận xét không hữu ích - ví dụ tốt để minh họa cho nó tốt hơn ? – MyStream

Trả lời

1

Nếu bạn nhấp vào lần thứ hai thì một biến thanh mới sẽ được tạo, cả hai giá trị thanh sẽ độc lập với nhau. Để thấy điều này trong hành động tôi đã tạo một fiddle. Nhấn nhanh hai lần và bạn sẽ thấy thanh thứ hai nhận giá trị mặc định chứ không phải giá trị mà biến bar ban đầu đã có, được mong đợi.

+0

Đây là một ví dụ tốt (được chỉnh sửa một chút để phù hợp với câu hỏi chặt chẽ hơn mà không có biến bên ngoài phạm vi) về cách một cuộc gọi không nên ảnh hưởng đến một cuộc gọi khác. Tôi vẫn chưa thấy những gì tôi đã làm để gây ra nó, nhưng nó trông giống như một lỗi hơn là một vấn đề phạm vi. Bạn có thể mở rộng phạm vi và giải thích tất cả những gì xảy ra trên mỗi trình kích hoạt sự kiện không? Nó có độc lập không? – MyStream

0

Đối tượng sự kiện được thông qua xung quanh thay vì được mới được tạo ra với các sự kiện khác nhau, do đó, 'a' sẽ không được tái phân công, nhưng sẽ bị ảnh hưởng bởi cả hai hành động sự kiện.

+0

Hi @swatkins, tôi không chắc chắn tôi đã làm theo những gì bạn có ý nghĩa. Điều thú vị ở đây là liên kết http://jsfiddle.net/BHaEj/4/ (thay đổi) nó cho thấy rằng biến bar không phải là blitzed khi sự kiện thứ hai đến, và trong đoạn code tôi vẫn chưa kết thúc, Tôi có thể ảnh hưởng đến các biến trong các vòng lặp trong các cuộc gọi tiếp theo. Tôi sẽ có một cái tên khác ở tên biến của tôi và xem có vấn đề gì không khi chơi. – MyStream

+0

Vâng, trong fiddle, bạn có 'đếm' trong không gian toàn cầu. Vì vậy, nó không liên kết với đối tượng sự kiện chút nào - đối tượng sự kiện đang sửa đổi 'count', và đó là lý do tại sao fiddle này hoạt động như mong đợi.Tuy nhiên, nếu bạn khai báo 'count' trong hàm gọi lại của hành động nhấp chuột, thì nó sẽ được khai báo lại mỗi khi một nhấp chuột xảy ra. Bản thân đối tượng sự kiện là như nhau (với các giá trị khác nhau cho các thuộc tính), nhưng các biến cụ thể được khai báo sẽ được khai báo lại trong mỗi hành động. Đây là một tài liệu cho đối tượng sự kiện jQuery: http://api.jquery.com/category/events/event-object/ – swatkins

Các vấn đề liên quan