【问题标题】:Filter out whole div on the basis of inner elements根据内部元素过滤掉整个div
【发布时间】:2016-07-27 21:07:29
【问题描述】:

我很难把所有的东西都简单地写在这里。 假设所有的类都已经在 css 中设置了样式。

我有几个类似这样的类的 div:-

<div id="s1" class="perschoolcontainer">
	<a href="abc.jpg" >
		<img id="dp1" class="dp" src="abc.jpg">
	</a>
	<p>Cricket</p>
</div>
<div id="s2" class="perschoolcontainer">
	<a href="def.jpg" >
		<img id="dp2" class="dp" src="def.jpg">
	</a>
	<p>Tennis</p>
</div>
<div id="s3" class="perschoolcontainer">
	<a href="ghi.jpg" >
		<img id="dp3" class="dp" src="ghi.jpg">
	</a>
	<p>Tennis</p>
</div>

他们是父母 div 和 id=show 的孩子

<div id="show">
  <div id="s1" class="perschoolcontainer">
	<a href="abc.jpg" >
		<img id="dp1" class="dp" src="abc.jpg">
	</a>
	<p>Cricket</p>
  </div>
  <div id="s2" class="perschoolcontainer">
	<a href="def.jpg" >
		<img id="dp2" class="dp" src="def.jpg">
	</a>
	<p>Tennis</p>
  </div>
  <div id="s3" class="perschoolcontainer">
	<a href="ghi.jpg" >
		<img id="dp3" class="dp" src="ghi.jpg">
	</a>
	<p>Tennis</p>
  </div>
</div>

我想在p 中隐藏那些没有网球的表演儿童。 这从选择菜单开始。

<ul class="list">
  <li>
	<label>
      <input type="checkbox" value="Tennis" class="check">Tennis
    </label>
  </li>
  
  <li>
	<label>
      <input type="checkbox" value="Cricket" class="check">Cricket
    </label>
  </li>
</ul>

现在,无论我从这两个选项中选择哪个选项,都应该删除不存在该选定选项的 .perschoolcontainer div。

$(document).ready(function(){
  if($('input.check').is(':checked')){
	var value = $.trim($(this).val());
	if(value !=   $trim($("#show").children(".perschoolcontainer").children("p").text())){
		$(this).parents("div").css("display","none");
	}
  }
});

这里的 jquery 函数有什么问题。 它基本上应该收集选择的值。然后遍历#show,如果文本不等于该值,则该元素的父div应该被隐藏。

提前谢谢:)

【问题讨论】:

  • 1.如果你想问一个复杂的问题,有一个最小的方法来重现它。 JSFiddle 很常见。 2. 描述什么是错的。 3. 先尝试调试它,然后然后询问你是否卡住了。 4. 该函数在页面加载时触发一次,因此如果您之后与页面交互,它将不会运行 - 这是您的问题吗?
  • @Vld 我已经在这个程度上解决了我的问题。我还没有使用过 jsfiddle..但我下次肯定会使用它。

标签: javascript jquery html


【解决方案1】:

您需要调整选择器并使用事件而不是仅使用 if 语句。

您还需要使用jQuery 的.each() 函数,因为有多个元素,您希望循环遍历它们,然后检查其中的文本。您可以使用简单的选择器轻松挂钩 &lt;p&gt; 标签,而不必执行 .children()... 等操作。

$(document).on('change', 'input.check', function(){
    var $input = $(this);
    var checkboxValue = $input.val();

    $('#show .perschoolcontainer > p').each(function(){
        if($(this).text() == checkboxValue && $input.is(':checked')) {
            $(this).parent().hide();
        }
        else if($(this).text() == checkboxValue && !$input.is(':checked')) {
            $(this).parent().show();
        }
    }
});

【讨论】:

  • @SudhanshuSaini 请记住您选择的答案,他们的选择器$('#show .perschoolcontainer p') 将选择.perschoolcontainer 中的所有子p 元素,如果有其他子元素可能会导致您出现一些问题进一步向下 dom 树。您应该将选择器的特异性增加到&gt; p,以便它只获得直接子代。
  • 我刚刚意识到这一点...实际代码包含的远不止这些,因此 urs 也在解决这个问题。
  • 这个解决方案非常糟糕,使用硬编码字符串,并且只适用于网球而不适用于板球
  • @Adjit 这是在教错误的做法,用非常弱的解决方案快速回答。
  • @MaciejSikora 见仁见智。你的回答比我的更错误。它使用了 jQuery 和 vanilla JS 的愚蠢组合,您可以在两者之间交替。这对可读性或可移植性没有用处。我已经更新了我的答案以使用复选框的值来检查文本,因此任何具有值的复选框都将执行 OP 想要的操作。
【解决方案2】:

看起来您正在检查是否在开始时检查了其中一个输入,而您真正想要的是在检查输入时隐藏 div。

$(function() {

  $(document).on('change', '.check', function() {
    var checkVal = $('.check:checked').val();
    $('#show .perschoolcontainer p').each(function() {
      if ($(this).text() == checkVal) {
        $(this).closest('.perschoolcontainer').hide();
      } else {
        $(this).closest('.perschoolcontainer').show();
      }
    });
  });
  
  
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


<div id="show">
  <div id="s1" class="perschoolcontainer">
	<a href="abc.jpg" >
		<img id="dp1" class="dp" src="abc.jpg">
	</a>
	<p>Cricket</p>
  </div>
  <div id="s2" class="perschoolcontainer">
	<a href="def.jpg" >
		<img id="dp2" class="dp" src="def.jpg">
	</a>
	<p>Tennis</p>
  </div>
  <div id="s3" class="perschoolcontainer">
	<a href="ghi.jpg" >
		<img id="dp3" class="dp" src="ghi.jpg">
	</a>
	<p>Tennis</p>
  </div>
</div>

<ul class="list">
  <li>
	<label>
      <input type="checkbox" value="Tennis" class="check">Tennis
    </label>
  </li>
  
  <li>
	<label>
      <input type="checkbox" value="Cricket" class="check">Cricket
    </label>
  </li>
</ul>

【讨论】:

  • 正是我需要的。非常感谢先生。
  • 如果两个复选框都被选中,这是错误的答案,它将在 $('.check:checked').val() 中没有值
【解决方案3】:

完整的解决方案,我还添加了检查复选框更改。

$(document).ready(function(){

  var inputs=$("input[type='checkbox']");
  var divs=$("div.perschoolcontainer");

  //function checks checkboxes and show only does divs with text containng with value from checkbox
  function checkInputs(){

    //hide all
    divs.hide();


    for (var i=0; i<inputs.length; i++){

      if (inputs.eq(i).prop("checked")){
         //checkbox is checked
         var value = $.trim(inputs.eq(i).val());
         //show does with p and text in it
         divs.find("p:contains('"+value+"')").parent().show();
      }

    }

   }

 //after web starts check checkboxes
 checkInputs();


 inputs.on("change",function(){
     //on checkbox change
     checkInputs();
 });

});

工作代码 - https://plnkr.co/edit/h5IU1J7ErfYKrsAERSE7?p=preview

【讨论】:

  • 因为我是 jquery 和 javascript 的新手..我无法理解你的整个代码,但我正在尝试通过每一个函数..无论如何感谢您的贡献:)
猜你喜欢
  • 2014-05-06
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 2010-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多