jQuery Nếu DIV không có Class x x


211

Trong jQuery tôi cần thực hiện một câu lệnh if để xem $ this không chứa lớp '.selected'.

$(".thumbs").hover(function(){

$(this).stop().fadeTo("normal", 1.0);
},function(){
$(this).stop().fadeTo("slow", 0.3);

});

Về cơ bản khi chức năng này được chạy (trên di chuột) Tôi không muốn thực hiện mờ dần nếu lớp '.selected' đã được gắn vào div, điều này có nghĩa là hình ảnh sẽ ở độ mờ hoàn toàn để biểu thị rằng nó đã được chọn. Tìm kiếm trên Google không gặp may mặc dù đó là một câu hỏi đơn giản về cách sử dụng câu lệnh IF ...

Câu trả lời:


359

Sử dụng bộ chọn " không ".

Ví dụ: thay vì:

$(".thumbs").hover()

thử:

$(".thumbs:not(.selected)").hover()


Nghĩ về điều đó, nếu OP thêm lớp vào div vào một lúc nào đó sau tài liệu. Tôi không nghĩ cú pháp của bạn sẽ hoạt động
Russ Cam

@ zuk1: Chà, từ đoạn trích của bạn, bạn lấy tất cả các yếu tố với lớp 'ngón tay cái' và thực hiện di chuột () trên mỗi cái. Bạn đang nói rằng bạn chỉ muốn di chuột trên một yếu tố? Một yếu tố đó là gì? Tôi bị bối rối.
alphadogg

@Russ: Đúng. Nếu bạn sử dụng ở trên, thì nó sẽ mất tất cả các elem hiện tại trong DOM tại thời điểm nó được thực thi và đối với những người có lớp 'ngón tay cái' và không 'được chọn' thì nó sẽ di chuột ().
alphadogg

Nếu bạn cần phải làm điều này bên ngoài bộ chọn vì một số lý do, bạn có thể sử dụng .not( ".selected" )và nó sẽ hoạt động tương tự. Công cụ rực rỡ.
Joshua Pinter

180

jQuery có hàm hasClass () trả về true nếu bất kỳ phần tử nào trong tập gói được chứa lớp đã chỉ định

if (!$(this).hasClass("selected")) {
    //do stuff
}

Hãy xem ví dụ của tôi về việc sử dụng

  • Nếu bạn di chuột qua một div, nó sẽ mờ dần ở tốc độ bình thường đến độ mờ 100% nếu div không chứa lớp 'được chọn'
  • Nếu bạn di chuột ra khỏi div, nó sẽ mờ dần ở tốc độ chậm đến 30% nếu div không chứa lớp 'được chọn'
  • Nhấp vào nút thêm lớp 'được chọn' vào div màu đỏ. Các hiệu ứng mờ dần không còn hoạt động trên div đỏ

Đây là mã cho nó

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js"></script>
<title>Sandbox</title>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<style type="text/css" media="screen">
body { background-color: #FFF; font: 16px Helvetica, Arial; color: #000; }
</style>


<!-- jQuery code here -->
<script type="text/javascript">
$(function() {

$('#myButton').click(function(e) {
$('#div2').addClass('selected');
});

$('.thumbs').bind('click',function(e) { alert('You clicked ' + e.target.id ); } );

$('.thumbs').hover(fadeItIn, fadeItOut);


});

function fadeItIn(e) {
if (!$(e.target).hasClass('selected')) 
 { 
    $(e.target).fadeTo('normal', 1.0); 
  } 
}

function fadeItOut(e) { 
  if (!$(e.target).hasClass('selected'))
  { 
    $(e.target).fadeTo('slow', 0.3); 
 } 
}
</script>


</head>
<body>
<div id="div1" class="thumbs" style=" background-color: #0f0; margin: 10px; padding: 10px; width: 100px; height: 50px; clear: both;"> 
One div with a thumbs class
</div>
<div id="div2" class="thumbs" style=" background-color: #f00; margin: 10px; padding: 10px; width: 100px; height: 50px; clear: both;">
Another one with a thumbs class
</div>
<input type="button" id="myButton" value="add 'selected' class to red div" />
</body>
</html>

BIÊN TẬP:

Đây chỉ là một phỏng đoán, nhưng bạn đang cố gắng để đạt được một cái gì đó như thế này ?

  • Cả hai div đều bắt đầu ở độ mờ 30%
  • Di chuột qua div mờ dần đến độ mờ 100%, lơ lửng mờ dần trở lại độ mờ 30%. Hiệu ứng làm mờ chỉ hoạt động trên các phần tử không có lớp 'được chọn'
  • Nhấp vào div sẽ thêm / xóa lớp 'đã chọn'

Mã jQuery ở đây-

$(function() {

$('.thumbs').bind('click',function(e) { $(e.target).toggleClass('selected'); } );
$('.thumbs').hover(fadeItIn, fadeItOut);
$('.thumbs').css('opacity', 0.3);

});

function fadeItIn(e) {
if (!$(e.target).hasClass('selected')) 
 { 
    $(e.target).fadeTo('normal', 1.0); 
  } 
}

function fadeItOut(e) { 
  if (!$(e.target).hasClass('selected'))
  { 
    $(e.target).fadeTo('slow', 0.3); 
 } 
}

<div id="div1" class="thumbs" style=" background-color: #0f0; margin: 10px; padding: 10px; width: 100px; height: 50px; clear: both; cursor:pointer;"> 
One div with a thumbs class
</div>
<div id="div2" class="thumbs" style=" background-color: #f00; margin: 10px; padding: 10px; width: 100px; height: 50px; clear: both; cursor:pointer;">
Another one with a thumbs class
</div>

không hoạt động vì một số lý do :( $ (". ngón tay cái"). hover (function () {if (! ($ (this) .hasClass (". đã chọn")) {$ (this) .stop (). fadeTo ("normal", 1.0);}, function () {$ (this) .stop (). fadeTo ("Slow", 0.3);}}); và nó phá vỡ toàn bộ mã của tôi, không ai trong số JS hoạt động với đã thêm
zuk1

hasClass có yêu cầu.? hasClass ( 'chọn') thay vì hasClass ( 'được chọn.')
bendewey

Ví dụ của Russ có thể hoạt động nếu bạn sử dụng "được chọn" thay vì ".selected"?
alphadogg

xin lỗi, không có nghĩa là để đặt. trong đó. Cập nhật ngay bây giờ
Russ Cam

Tôi đã thêm một số ví dụ vào câu trả lời của mình, để hiển thị mã đang hoạt động
Russ Cam

28

Tôi nghĩ rằng tác giả đã tìm kiếm:

$(this).not('.selected')

1
Đã không mong đợi điều này để làm việc. Thậm chí hoạt động như $ (". Class1"). Không (". Class2"), đó chính xác là những gì tôi đã theo sau! Cảm ơn!
kravits88

3
Nó hoạt động, nhưng đáng chú ý là điều này không hoạt động như một boolean, vì nó trả về một mảng. Mảng trống là "sự thật" trong Javascript. Bạn có thể sử dụng $(this).not('.selected').lengthnhư một boolean nếu bạn thực sự muốn, nhưng đó là một chút dài dòng.
Joe Maffei

5

Khi bạn kiểm tra xem một phần tử có hoặc không có lớp hay không, hãy đảm bảo bạn không vô tình đặt dấu chấm vào tên lớp:

<div class="className"></div>

$('div').hasClass('className');
$('div').hasClass('.className'); #will not work!!!!

Sau một thời gian dài nhìn chằm chằm vào mã của tôi, tôi nhận ra mình đã làm điều này. Một lỗi đánh máy nhỏ như thế này khiến tôi mất một giờ để tìm ra những gì tôi đã làm sai. Kiểm tra mã của bạn!


1
$(".thumbs").hover(
    function(){
        if (!$(this).hasClass("selected")) {
            $(this).stop().fadeTo("normal", 1.0);
        }
    },
    function(){
        if (!$(this).hasClass("selected")) {
            $(this).stop().fadeTo("slow", 0.3); 
        }           
    }
);

Đặt một nếu bên trong mỗi phần của di chuột sẽ cho phép bạn thay đổi lớp chọn một cách linh hoạt và di chuột vẫn sẽ hoạt động.

$(".thumbs").click(function() {
    $(".thumbs").each(function () {
        if ($(this).hasClass("selected")) {
            $(this).removeClass("selected");
            $(this).hover();
        }
    });                 
    $(this).addClass("selected");                   
});

Ví dụ, tôi cũng đã đính kèm một trình xử lý nhấp để chuyển lớp đã chọn sang mục được nhấp. Sau đó, tôi bắn sự kiện di chuột vào mục trước để làm cho nó mờ dần.


0

Bạn cũng có thể sử dụng các phương thức addClass và removeClass để chuyển đổi giữa các mục như tab.

ví dụ

if($(element).hasClass("selected"))
   $(element).removeClass("selected");

Tại sao không sử dụng toggleClass ()?
Nga Cam

1
Bởi vì phần tử có thể có các lớp khác.
Tawani

0

Còn về việc thay vì sử dụng if bên trong sự kiện, bạn sẽ hủy liên kết sự kiện khi lớp chọn được áp dụng? Tôi đoán bạn đã thêm lớp bên trong mã của mình ở đâu đó, vì vậy việc bỏ chặn sự kiện ở đó sẽ như thế này:

$(element).addClass( 'selected' ).unbind( 'hover' );

Nhược điểm duy nhất là nếu bạn từng loại bỏ lớp đã chọn khỏi thành phần, bạn phải đăng ký lại nó vào sự kiện di chuột.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.