2012-02-28 24 views
9

Tôi gặp một số vấn đề trong thực hiện đoạn mã sau:không chọn, trên() nhấp kiện

var i = 1; 
$('.hello:not(.selected)').on('click',function(){ 
    $(this).addClass('selected');  
    console.log(i++); 
}); 

Vấn đề là mã này nên kích hoạt chỉ ONE thời gian sau khi lớp chọn đã được thêm vào, nhưng nó là thực hiện nhiều lần, tôi chỉ muốn biến số i không tăng. Nói cách khác, tôi đang cố gắng để làm như sau (mà làm việc, nhưng tôi không muốn sử dụng các chức năng sống vì nó đã bị phản đối):

$('.hello:not(.selected)').live('click', function() { 
    $('.hello').removeClass('selected'); 
    $(this).addClass('selected'); 
... 
}); 

Cảm ơn rất nhiều cho câu trả lời của bạn trước, k

+0

Xin giải thích trong một chút chi tiết hơn là những gì hành vi mong đợi. Bạn muốn đạt được điều gì với điều này? – kapa

+0

Tôi nghĩ rằng bạn đã quên một số mã bổ sung.Vui lòng giải thích –

+0

đó cũng là tùy chọn sử dụng [.one()] (http://api.jquery.com/one/) – rkw

Trả lời

16

Mã của bạn đang tiến hành tập các phần tử mà hiện đáp ứng tiêu chí này:

$('.hello:not(.selected)') 

và thiết lập sự kiện này handler cho tất cả vĩnh cửu:

.on('click',function(){ 
    $(this).addClass('selected'); 
    $(this).css({opacity : 0.5});  
    console.log(i++); 
}); 

Đặc biệt quan trọng là thực tế là sau khi trình xử lý được đặt trên một phần tử, nó sẽ tiếp tục hoạt động ngay cả khi sau này phần tử đó không còn đáp ứng các tiêu chí (trong trường hợp này, bằng cách đạt được lớp selected).

Có một số cách để đạt được hành vi mong muốn. Một sẽ tự động kiểm tra xem các "bộ lọc" điều kiện vẫn giữ bên trong xử lý sự kiện:

$('.hello').on('click',function(){ 
    if($(this).hasClass('selected')) { 
     return; 
    } 
    $(this).addClass('selected'); 
    $(this).css({opacity : 0.5});  
    console.log(i++); 
}); 

khác sẽ được ủy sự kiện này - trong trường hợp này, một yếu tố phụ huynh sẽ được thông báo về sự kiện này trên một hậu duệ của nó và nó sẽ động kiểm tra những gì đã nói thỏa mãn hậu duệ các điều kiện lọc trước khi quyết định để kích hoạt event handler (mã trơ trẽn dán từ câu trả lời Ben Lee):

$('body').on('click', '.hello:not(.selected)', function() { 
    $(this).addClass('selected'); 
    $(this).css({opacity : 0.5});  
    console.log(i++); 
}); 
+0

Tôi hiểu những gì bạn có nghĩa là cho tất cả vĩnh cửu, chỉ cần tự hỏi làm thế nào điều này hoạt động: $ ('. tab: not (.active)'). sống ('click', chức năng() {, đó là vì cuộc sống không phải là nó ?, nhưng không phải là nó thiết lập xử lý sự kiện này cho tất cả vĩnh hằng, xin lỗi nhưng tôi hơi bối rối ... nhưng cảm ơn rất nhiều ... bởi vì nó hoạt động! – MariaZ

+0

@ ThePrincessKarina: Vâng, 'live' đại diện cho sự kiện và do đó sẽ tự động kiểm tra. Đó là cách nó có thể" gắn một trình xử lý "vào các phần tử không tồn tại vào thời điểm bạn gọi là 'live'. – Jon

+0

oooow !!! ok !, cảm ơn rất nhiều – MariaZ

7

Sự cố là trình xử lý sự kiện không bị xóa chỉ vì bạn thay đổi lớp học. Bạn đang gắn các sự kiện vào các phần tử và chúng ở đó mãi mãi.

Để làm được việc này, bạn chỉ có thể kiểm tra cho lớp "chọn" trên mỗi tay cầm kiện:

$('.hello:not(.selected)').on('click',function(){ 
    if ($(this).hasClass('selected')) { 
     $(this).addClass('selected'); 
     $(this).css({opacity : 0.5});  
     console.log(i++); 
    } 
}); 

Nhưng đối với hiệu quả và mã đơn giản hơn, bạn nên có lẽ ủy này:

$('body').on('click', '.hello:not(.selected)', function() { 
    var $self = $(this); 
    $self.addClass('selected'); 
    $self.css({opacity : 0.5});  
    console.log(i++); 
}); 

Tôi đã sử dụng "body" làm phần tử để đính kèm ủy quyền này, nhưng bạn có thể nên sử dụng thứ gì đó thấp hơn trong cây, như cha mẹ hoặc ông bà của các phần tử ".ello". Điều này chỉ gắn một trình xử lý sự kiện và dựa vào việc tạo bọt để kiểm tra trạng thái đã chọn của mỗi phần tử khi chúng thay đổi theo thời gian thực.

Cũng lưu ý rằng tôi đã lưu trong bộ nhớ cache var $self = $(this); đó cũng là vì hiệu quả, vì vậy bạn không kết thúc jQuery - mở rộng phần tử nhiều hơn mức bạn cần.

+0

Rất đẹp nó hoạt động ... cảm ơn rất nhiều vì những lời khuyên để làm cho mã của tôi hiệu quả hơn . Với mã của tôi, tôi đã cố gắng để nhân rộng các "$ ('. Tab: không (.active)'). Sống ('click', function() {", nhưng bằng cách sử dụng "trên", tôi đoán tôi không đánh giá thấp tốt trên, nhưng điều này làm rõ ... THanks! – MariaZ

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