2012-01-26 6 views
6

Tôi biết đây là vấn đề với cách tôi đã mã hóa plugin để xử lý nhiều phiên bản. Tôi chắc rằng ít nhất một trong các biến của tôi đang bị ghi đè bởi mỗi lần gọi tiếp theo của plugin. Dù sao, đây là đoạn code plugin:Plugin jQuery không hoạt động khi được gọi hai lần

$.fn.extend({ 
dependsOn: function($claimer){ 
    $dependent = $(this); 
    $claimer.change(function(){ 
     alert($dependent.attr('id')); 
     var $selected = $('option:selected', this); 
     var pk = $selected.attr('class'); 

     $dependent.removeAttr('disabled'); 
     $dependent.find('option').each(function(){ 
      $hiddenOpts = $dependent.parent().find('.hiddenOptions'); 
      $hiddenOpts.append($(this)); 
      $hiddenOpts.find('option').each(function(){ 
       if($(this).attr('ref') == pk || $(this).hasClass('empty')) 
        $dependent.append($(this)); 
      }); 
     }); 
    }); 
} 
}); 

Khi tôi gọi $('.something').dependsOn($('.somethingElse'));, nó hoạt động tốt, nhưng nếu tôi gọi nó một lần nữa trên hai mặt hàng khác, biến phụ thuộc $ được thiết lập để RẰNG phần tử.

Điểm của plugin là giữ cho các hộp chọn bị tắt cho đến khi hộp chọn trước đó được thay đổi. Nếu tôi có ba ô được chọn trong một hàng và tôi muốn hộp thứ nhất trong hàng và tùy chọn thứ nhất phụ thuộc vào mục đầu tiên và phụ thuộc thứ hai vào thứ hai, tôi sẽ gọi $(second).dependsOn($(first))$(third).dependsOn($(second)), vì vậy việc thay đổi đầu tiên sẽ bật thứ hai nhưng không phải là thứ ba, và thay đổi thứ hai sau đó sẽ kích hoạt thứ ba. Nhưng với mã hiện tại, thay đổi đầu tiên cho phép thứ ba, nhưng không phải thứ hai (như tôi đã nói, tôi nghĩ đó là vì $ phụ thuộc đang bị ghi đè và được đặt thành thứ thứ ba sau khi gọi phụ thuộc hai lần).

Nếu điều đó không rõ ràng, hãy cho tôi biết.

+2

100% mô hình hoàn hảo của câu hỏi. Mô tả rõ ràng về những gì bạn muốn và những gì đang xảy ra và mã được sử dụng! Rực rỡ. Nếu chỉ có một jsfiddle .... – mowwwalker

+0

Tôi coi là một jsfiddle. Tôi sẽ bắt đầu đặt một cái lại với nhau. – Jake

+0

Nevermind, Gonzalo đóng đinh nó. Xem tại đây: http://jsfiddle.net/d8jUd/ – mowwwalker

Trả lời

5

Đó là vì bạn không xác định biến mới trong phạm vi dependsOf (được thực hiện bằng cách sử dụng var $dependent = blah). Thay vào đó, bạn đang đặt giá trị là $ (this) thành phiên bản toàn cầu là $dependent.

Đó là lý do tại sao nó được thay thế.

Chúc may mắn :)

+0

Tuyệt vời, đó là vấn đề. Cảm ơn! – Jake

+0

Bạn được chào đón! –

1

Cách bạn đang tuyên bố $dependant là làm cho nó một toàn cầu biến , vì vậy thời gian tiếp theo hàm được gọi nó đặt cùng toàn cầu $dependant với giá trị mới. Hãy thử:

var $dependant = $(this);