【问题标题】:jQuery If DIV Doesn't Have Class "x"jQuery 如果 DIV 没有类“x”
【发布时间】:2010-10-05 22:28:03
【问题描述】:

在 jQuery 中我需要做一个 if 语句来查看 $this 是否不包含类 '.selected'。

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

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

});

基本上当这个函数运行时(悬停时),如果类 '.selected' 已附加到 div,我不想执行淡入淡出,这意味着图像将完全不透明以表示它被选中。在谷歌上搜索没有运气,即使这是一个如何使用 IF 语句的简单问题......

【问题讨论】:

    标签: jquery


    【解决方案1】:

    jQuery 具有 hasClass() 函数,如果包装集中的任何元素包含指定的类,则返回 true

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

    Take a look at my example of use

    • 如果将鼠标悬停在 div 上,它会淡出为 正常速度到 100% 不透明度,如果 div 不包含“选定” 类
    • 如果您将鼠标悬停在 div 之外,它会消失 以低速至 30% 的不透明度,如果 div 不包含“选定” 类
    • 单击按钮添加“已选择” 类到红色 div。褪色 效果不再对红色 div 起作用

    这是它的代码

    <!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>
    

    编辑:

    这只是一个猜测,但你想achieve something like this 吗?

    • 两个 div 都以 30% 的不透明度开始
    • 悬停在 div 上会淡出 100% 不透明度,悬停在 div 上会淡出 30% 不透明度。淡化效果仅适用于没有“选定”类的元素
    • 单击 div 可添加/删除 “选定”类

    jQuery 代码在这里-

    $(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>
    

    【讨论】:

    • 由于某种原因不起作用:( $(".thumbs").hover(function(){ if (!($(this).hasClass(".selected")){ $ (this).stop().fadeTo("normal", 1.0); },function(){ $(this).stop().fadeTo("slow", 0.3); } }); 它打破了我的整个代码,没有一个JS适用于添加的
    • hasClass 是否需要 .? hasClass('selected') 而不是 hasClass('.selected')
    • Russ 的例子如果你使用“selected”而不是“.selected”可能会起作用?
    • 抱歉,不是故意放 .在那里。现已更新
    • 我在答案中添加了一些示例,以显示代码工作
    【解决方案2】:

    我认为作者正在寻找:

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

    【讨论】:

    • 没想到这会起作用。甚至像 $(".class1").not(".class2") 一样工作,这正是我所追求的!谢谢!
    • 它可以工作,但值得注意的是,它不能作为布尔值工作,因为它返回一个数组。空数组在 Javascript 中是“真实的”。如果你真的想要,你可以使用 $(this).not('.selected').length 作为布尔值,但这有点冗长。
    【解决方案3】:

    当你检查一个元素是否有一个类时,确保你没有不小心在类名中加上一个点:

    <div class="className"></div>
    
    $('div').hasClass('className');
    $('div').hasClass('.className'); #will not work!!!!
    

    盯着我的代码看了很长时间后,我意识到我已经做到了。像这样的一个小错字花了我一个小时才弄清楚我做错了什么。检查您的代码!

    【讨论】:

      【解决方案4】:
      $(".thumbs").hover(
          function(){
              if (!$(this).hasClass("selected")) {
                  $(this).stop().fadeTo("normal", 1.0);
              }
          },
          function(){
              if (!$(this).hasClass("selected")) {
                  $(this).stop().fadeTo("slow", 0.3); 
              }           
          }
      );
      

      在悬停的每个部分中放置一个 if 将允许您动态更改选择类并且悬停仍然有效。

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

      作为示例,我还附加了一个单击处理程序,以将选定的类切换到单击的项目。然后我在前一个项目上触发悬停事件以使其淡出。

      【讨论】:

        【解决方案5】:

        在应用选择类时取消绑定事件,而不是在事件中使用 if 怎么样? 我猜你在代码中的某个地方添加了类,所以取消绑定事件看起来像这样:

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

        唯一的缺点是,如果您从元素中删除选定的类,则必须再次为其订阅悬停事件。

        【讨论】:

          【解决方案6】:

          您还可以使用 addClass 和 removeClass 方法在选项卡等项目之间切换。

          例如

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

          【讨论】:

          • 为什么不直接使用 toggleClass()?
          • 因为元素可能有其他类。
          【解决方案7】:

          使用"not" 选择器。

          例如,而不是:

          $(".thumbs").hover()

          尝试:

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

          【讨论】:

          • 考虑一下,如果 OP 在 document.ready 之后的某个时间点将类添加到 div 中,那么我认为您的语法不会起作用
          • @zuk1:好吧,从你的 sn-p 中,你获取所有具有类 'thumb' 的元素并对每个元素执行 hover()。您是说您只想将鼠标悬停在一个元素上吗?那是什么元素?我很困惑。
          • @Russ:正确。如果您使用上述方法,那么它将在执行时获取当前 DOM 中的所有元素,并且对于那些具有类 'thumb' 而不是 'selected' 的元素,它将执行 hover()。
          • 如果您出于某种原因需要在选择器之外执行此操作,您可以使用.not( ".selected" ),它的工作原理相同。很棒的东西。
          猜你喜欢
          • 1970-01-01
          • 2014-10-28
          • 2015-03-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-04
          • 2010-12-04
          • 1970-01-01
          相关资源
          最近更新 更多