2010-05-25 11 views
6

Bazı jQuery kodlarımda şöyle bir şey var:jQuery: .addClass() veya .attr() tarafından sınıf değiştirildikten sonra sınıfa göre seçilmesi

$(document).ready(function() { 
    $("img.off").click(function() { 
     alert('on'); 
     $(this).attr('class', 'on'); 
    }); 
    $("img.on").click(function() { 
     alert('off'); 
     $(this).attr('class', 'off'); 
    }); 
}); 

Seçici, orijinal HTML belgesinde tanımlanmış sınıf ismine sahip görüntüler için iyi çalışır, ancak jQuery ile sınıf adını değiştirdikten sonra, img öğesi yanıt vermez yeni sınıf kullanarak seçicilere.

Diğer bir deyişle, yukarıdaki kodu çalıştırarak, 'off' img 'i tıklarsanız, ilk işlevi tetikler ve sınıfı' on 'olarak değiştirir. Ancak, bu görüntüyü tekrar tıklamak, ikinci işlevi tetiklemez (beklediğim gibi), ancak bir kez daha ilkini tetikler. Seçici, güncellenmiş versiyondan ziyade eski DOM'yi okuyormuş gibi. Burada neyi yanlış yapıyorum?

Firefox 3.6.3 - jQuery 1.4.2

cevap

11

Böyle, ne istediğinizi yapmak .live() kullanabilirsiniz:

$(function() { 
    $("img.off").live('click', function() { 
    alert('on'); 
    $(this).attr('class', 'on'); 
    }); 
    $("img.on").live('click', function() { 
    alert('off'); 
    $(this).attr('class', 'off'); 
    }); 
}); 

Eğer $(selector).click() yaptığınızda size uyan unsurları buluyoruz o anda ve bir işleyiciyi click etkinliğine bağlayarak ... sınıfları daha sonra değiştiği zaman bunun için önemli değil, işleyici eklenir. .live(), olay meydana geldiğinde seçiciyle ilgili bakım konusunda farklı çalışır.

Ayrıca, örneğin bağlı/sen sonuçta peşinde olduğun, .toggleClass() gibi bir şey bu gibi sizin için basitleştirmek olabilir:

$(function() { 
    $("img.off, img.on").live('click', function() { 
    $(this).toggleClass('on off'); 
    alert($(this).attr('class')); 
    }); 
}); 
+0

Hmm'yi kullanmanız gerekir. JQuery'nin nasıl çalıştığıyla ilgili bazı yanlış varsayımlar yapıyor gibi görünüyor. Teşekkürler. – UpTheCreek

+0

Yep, harika çalışıyor. – UpTheCreek

+0

@Sosh '.click()' sadece bir dom öğesine bir işleyiciyi bağlar. – Skilldrick

3

live() ile deneyin:

$(document).ready(function() { 
    $("img.off").live('click', function() { 
     alert('on'); 
     $(this).attr('class', 'on'); 
    }); 
    $("img.on").live('click', function() { 
     alert('off'); 
     $(this).attr('class', 'off'); 
    }); 
}); 
+0

çalışmaz (on) ile nasıl yapılacağı()? – Acute

2

Sınıfı değiştirdikten sonra tıklama geriçağırımını yeniden adlandırmanız veya .live()

İlgili konular