【问题标题】:Can I use the same jQuery statement with different selectors on the same page?我可以在同一页面上使用具有不同选择器的相同 jQuery 语句吗?
【发布时间】:2016-11-20 21:50:42
【问题描述】:

这可能看起来微不足道,但我遇到了一个小问题。我的页面上有 SVG 图标,当悬停在上面时,应该会更改状态以显示隐藏的 div。我得到了第一个图标来执行此操作,但随后的图标不起作用。我已将问题缩小到 jQuery,因为 css(光标:指针;)仍然适用于每个图标,但应该显示的隐藏 div 不适用。我的问题是这样的,我可以有多个这样的 jQuery 语句

$(".div-g").hover(
   function() {
     $(this).find(".div-hidden").css("display","block");
   },
   function() {
     $(this).find(".div-hidden").css("display","none");
   }
);

对于我的每个 SVG。例如,我会使用相同的语句,但只需将“div”替换为“div1”等等。我不明白为什么不这样做,但我不确定为什么它不像第一个图标那样简单。为清楚起见,我的每个 SVG 都有如下所示的类

<rect style="display:none;" class="div-hidden div-hidden-rect" width="34.02" height="34.02"/>
<text style="display:none;" class="div-hidden" x="8" y="10">

看起来像这样的css

.div-g:hover {
text-align: center;
cursor: pointer;
}
.div-hidden {
text-anchor: middle;
text-align: center;
font-size: .5rem;
display: inline-block;
position: center;
}
.div-hidden-rect {
fill: $whiteblue;
opacity: .96;
}

其中 .div-g 代表 SVG 。那么,我的问题是使用具有不同选择器的相同 jQuery 语句,还是我没有看到的问题?

【问题讨论】:

  • “我可以在同一个页面上使用相同的 jQuery 语句和不同的选择器吗?” 简短的回答是肯定的。但是由于您没有展示任何“div1”元素可能是什么样子的示例,因此很难向您展示具体示例。
  • 您基本上是在询问您是否可以在同一页面上包含多行代码。是的你可以。但目前尚不清楚您要描述的问题是什么。我怀疑您的诊断有误,您是在向我们询问错误而不是问题的根源。
  • 对不起,我不清楚。我的“div1”(这只是我将为每个更改的前缀,因此 div1-g、div1-hidden、div1-hiddenr-rect)是一个矩形,与 SVG 图像大小相同。
  • 悬停时,我试图将我的 SVG 图像更改为一个简单的矩形。我让它与我的一个 SVG 图标一起工作,但我还有很多不会改变。
  • @hoolakoola:您能否提供一个最小且完整的问题示例来演示?当每个元素都应该做同样的事情时,似乎不必多次编写相同的代码。

标签: jquery css svg


【解决方案1】:

试试这个:

$('.div-g, .div1').hover(
  function(){
    $('.div-hidden').css({display: 'block'});
  }, function(){
    $('.div-hidden').css({display: 'none'});
  });

【讨论】:

  • 不幸的是没有运气
【解决方案2】:

您的类选择器将匹配任意数量的具有匹配类的 div,例如:

<div id="div-1" class="svg-container">
  <rect style="display:none;" class="div-hidden div-hidden-rect" width="34.02" height="34.02"/>
  <text style="display:none;" class="div-hidden" x="8" y="10">
</div>

<div id="div-2" class="svg-container">
  <rect style="display:none;" class="div-hidden div-hidden-rect" width="34.02" height="34.02"/>
  <text style="display:none;" class="div-hidden" x="8" y="10">
</div>

<div id="div-3" class="svg-container">
  <rect style="display:none;" class="div-hidden div-hidden-rect" width="34.02" height="34.02"/>
  <text style="display:none;" class="div-hidden" x="8" y="10">
</div>

选择所有具有类 .svg-container 的 div 应该可以正常工作。

$(".svg-container").hover(
   function() {
     $(this).find(".div-hidden").css("display","block");
   },
   function() {
     $(this).find(".div-hidden").css("display","none");
   }
);

单独设置它们的样式也很简单。您在 css 中使用了一个变量,所以我假设它是 LESS/SASS?

.svg-container {

    &:hover {
        text-align: center;
        cursor: pointer;
    }

    .div-hidden {
        text-anchor: middle;
        text-align: center;
        font-size: .5rem;
        display: inline-block;
        position: center;
    }

    .div-hidden-rect {
        opacity: .96;
    }
}


#div-1 {
    .div-hidden-rect {
        fill: $whiteblue;
    }
}

#div-2 {
    .div-hidden-rect {
        fill: $somethingelse;
    }
}

#div-3 {
    .div-hidden-rect {
        fill: $somethingelseagain;
    }
}

【讨论】:

  • 这样就足够了,但是每个 SVG 的每个矩形都会有不同的颜色,所以我必须为每个矩形使用一个唯一的类。
  • 我已经添加了一个示例,您可以将任意数量的类添加到您的容器中,并单独或共同定位它们。如果您只打算使用它们一次,我建议您使用 ID 作为您的唯一标识符,因为您将获得更好的性能。
  • 如果每个矩形都有自己的颜色,请考虑将颜色本身粘贴到data-* 属性中并使用该属性(例如$(el).data('color'))而不是类名,这样会更简洁
【解决方案3】:

如果我理解正确,您真正需要的只是$(this).find(".an-hidden").toggle();

$(".hover-change").hover(function() {
     $(this).find(".an-hidden").toggle();
});
.an-1 {
        fill: #2ea3e4;
      }
.an-g:hover {
	text-align: center;
	cursor: pointer;
}
.an-hidden {
	text-anchor: middle;
	text-align: center;
	font-size: .5rem;
	display: inline-block;
	position: center;
}
.an-hidden-rect {
	fill: #F8FDF7;
	opacity: .96;

}
.an-hidden-text {
	fill: #2ea3e4;
}
.an-hidden-smtext {
	margin-top: 1rem;
	font-size: .15rem;
	fill: #2ea3e4;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<svg id="test_icon" data-name="Test Icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 34.02 34.02">
  <defs>
    
  </defs>
  <title>analysis_icon</title>
  <g class="an-g hover-change">
    <rect class="an-1" width="14.02" height="14.02"/>
    <rect style="display:none;" class="an-hidden an-hidden-rect" width="14.02" height="14.02"/>
    <text style="display:none;" class="an-hidden" x="8" y="10">
      <tspan x="50%" y="35%" dy=".1em" class="an-hidden-text">Text Title</tspan>
      <tspan x="50%" dy="1.9em" class="an-hidden-smtext">text</tspan>
      <tspan x="50%" dy="1.9em" class="an-hidden-smtext">more text</tspan>
      <tspan x="50%" dy="1.9em" class="an-hidden-smtext">more more text</tspan>
      </text>-->

  </g>
</svg>
<svg id="test_icon2" data-name="Test Icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 34.02 34.02">
  <defs>
    
  </defs>
  <title>analysis_icon</title>
  <g class="an-b hover-change">
    <rect class="an-1" width="14.02" height="14.02"/>
    <rect style="display:none;" class="an-hidden an-hidden-rect" width="14.02" height="14.02"/>
    <text style="display:none;" class="an-hidden" x="8" y="10">
      <tspan x="50%" y="35%" dy=".1em" class="an-hidden-text">Text Title</tspan>
      <tspan x="50%" dy="1.9em" class="an-hidden-smtext">text</tspan>
      <tspan x="50%" dy="1.9em" class="an-hidden-smtext">more text</tspan>
      <tspan x="50%" dy="1.9em" class="an-hidden-smtext">more more text</tspan>
      </text>-->

  </g>
</svg>
<svg id="test_icon3" data-name="Test Icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 34.02 34.02">
  <defs>
    
  </defs>
  <title>analysis_icon</title>
  <g class="an-d  hover-change">
    <rect class="an-1" width="14.02" height="14.02"/>
    <rect style="display:none;" class="an-hidden an-hidden-rect" width="14.02" height="14.02"/>
    <text style="display:none;" class="an-hidden" x="8" y="10">
      <tspan x="50%" y="35%" dy=".1em" class="an-hidden-text">Text Title</tspan>
      <tspan x="50%" dy="1.9em" class="an-hidden-smtext">text</tspan>
      <tspan x="50%" dy="1.9em" class="an-hidden-smtext">more text</tspan>
      <tspan x="50%" dy="1.9em" class="an-hidden-smtext">more more text</tspan>
      </text>-->

  </g>
</svg>

【讨论】:

  • 基本上是的。出现混淆是因为我有 8 个图标,我尝试的第一个图标有效,但随后的每个图标都没有。我会和他们一起尝试这个,看看这是否能解决我的问题。谢谢。
  • @hoolakoola 我在演示中添加了 2 个图标只是为了确定,但是是的,这种方法并不关心你有多少,应该可以工作 :)
  • 我很困惑哈哈。它仍然适用于第一个,但其余的都不起作用:(
  • 请注意,我的 SVG 都是不同的,每个都有不同的类。
  • 您确定您的所有元素都具有an-g 类吗?
猜你喜欢
  • 2013-03-03
  • 2014-01-19
  • 2016-04-25
  • 1970-01-01
  • 2022-11-19
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多