【问题标题】:Get rightmost input:checked of every tr using a single jQuery(Sizzle) selector获取最右边的输入:使用单个 jQuery(Sizzle) 选择器检查每个 tr
【发布时间】:2018-08-28 04:57:53
【问题描述】:

我不知道这是否可能,但这是我今天在项目中遇到的一个有趣的情况。

复选框表。一种类型的复选框是分层的,这意味着如果选中一个,则它左侧的所有相同类型的复选框也会被神奇地选中。

我们只需要发送有关最右侧选中复选框的信息。 下面是一个使用 jQuery 代码来完成它的示例: https://codepen.io/oriadam/pen/Yapodm

$("input").click(function() {
	$(".here").removeClass("here");
	$("tr").each(function(i, tr) {
		$(tr)
			.find(".a:has(input:checked):last input:checked")
			.each(function(i, elem) {
				$(elem).parent().addClass("here");
			});
	});
});
.here {
	background: red;
}
.a input {
	width: 2em;
	height: 2em;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<table>
	<tr>
		<td><input type="checkbox"></td>
		<td class="a here"><input type="checkbox" checked></td>
		<td class="a"><input type="checkbox"></td>
		<td class="a"><input type="checkbox"></td>
		<td><input type="checkbox" checked></td>
	</tr>
	<tr>
		<td><input type="checkbox"></td>
		<td class="a"><input type="checkbox" checked></td>
		<td class="a here"><input type="checkbox" checked></td>
		<td class="a"><input type="checkbox"></td>
		<td><input type="checkbox" checked></td>
	</tr>
	<tr>
		<td><input type="checkbox"></td>
		<td class="a"><input type="checkbox" checked></td>
		<td class="a"><input type="checkbox" checked></td>
		<td class="a here"><input type="checkbox" checked></td>
		<td><input type="checkbox" checked></td>
	</tr>
</table>

<br><br> The challange: <br> Use a single jQuery(Sizzle) selector to get the rightmost checked checkbox of every tr, while considering only td that has class a.

有没有办法使用单个 jQuery(Sizzle) 选择器来获取每个 tr 的最右侧选中复选框,同时只考虑 a 类的 td

【问题讨论】:

    标签: javascript jquery sizzle


    【解决方案1】:

    您可以使用过滤器:

    $("input").click(function() {
      $(".here").removeClass("here");
    
      $('.a:has(input:checked)').filter(function() {             // get all .a that have inputs checked in them
        return !$(this).nextAll('.a:has(input:checked)').length; // only return .a that has no following siblings with an input checked in them
      }).addClass("here");
    });
    .here {
      background: red;
    }
    
    .a input {
      width: 2em;
      height: 2em;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    
    <table>
      <tr>
        <td><input type="checkbox"></td>
        <td class="a here"><input type="checkbox" checked></td>
        <td class="a"><input type="checkbox"></td>
        <td class="a"><input type="checkbox"></td>
        <td><input type="checkbox" checked></td>
      </tr>
      <tr>
        <td><input type="checkbox"></td>
        <td class="a"><input type="checkbox" checked></td>
        <td class="a here"><input type="checkbox" checked></td>
        <td class="a"><input type="checkbox"></td>
        <td><input type="checkbox" checked></td>
      </tr>
      <tr>
        <td><input type="checkbox"></td>
        <td class="a"><input type="checkbox" checked></td>
        <td class="a"><input type="checkbox" checked></td>
        <td class="a here"><input type="checkbox" checked></td>
        <td><input type="checkbox" checked></td>
      </tr>
    </table>
    
    <br><br> The challange: <br> Use a single jQuery(Sizzle) selector to get the rightmost checked checkbox of every tr, while considering only td that has class a.

    【讨论】:

      【解决方案2】:

      您当然可以简化该代码:

      $("tr").each(function(i, tr) {
          $(tr).find(".a:has(input:checked):last").addClass("here");
      });
      

      $("input").click(function() {
      	$(".here").removeClass("here");
      	$("tr").each(function(i, tr) {
      		$(tr).find(".a:has(input:checked):last").addClass("here");
      	});
      });
      .here {
      	background: red;
      }
      .a input {
      	width: 2em;
      	height: 2em;
      }
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
      
      <table>
      	<tr>
      		<td><input type="checkbox"></td>
      		<td class="a here"><input type="checkbox" checked></td>
      		<td class="a"><input type="checkbox"></td>
      		<td class="a"><input type="checkbox"></td>
      		<td><input type="checkbox" checked></td>
      	</tr>
      	<tr>
      		<td><input type="checkbox"></td>
      		<td class="a"><input type="checkbox" checked></td>
      		<td class="a here"><input type="checkbox" checked></td>
      		<td class="a"><input type="checkbox"></td>
      		<td><input type="checkbox" checked></td>
      	</tr>
      	<tr>
      		<td><input type="checkbox"></td>
      		<td class="a"><input type="checkbox" checked></td>
      		<td class="a"><input type="checkbox" checked></td>
      		<td class="a here"><input type="checkbox" checked></td>
      		<td><input type="checkbox" checked></td>
      	</tr>
      </table>
      
      <br><br> The challange: <br> Use a single jQuery(Sizzle) selector to get the rightmost checked checkbox of every tr, while considering only td that has class a.

      ...但是我看不到您可以摆脱最后一个 each 循环(或其他代替它的东西,例如 filter)的方法,因为您想在行内工作。

      【讨论】:

        【解决方案3】:

        试试这个,没有 -.each-loop 变体:

        $("input").click(function() {
        
        	$(this).closest('tr').find('td.a').removeClass('here')
        		.parent().children('.a:has(input:checked):last').addClass('here');
        });
        .here {
        	background: red;
        }
        .a input {
        	width: 2em;
        	height: 2em;
        }
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
        <table>
        	<tr>
        		<td><input type="checkbox"></td>
        		<td class="a here"><input type="checkbox" checked></td>
        		<td class="a"><input type="checkbox"></td>
        		<td class="a"><input type="checkbox"></td>
        		<td><input type="checkbox" checked></td>
        	</tr>
        	<tr>
        		<td><input type="checkbox"></td>
        		<td class="a"><input type="checkbox" checked></td>
        		<td class="a here"><input type="checkbox" checked></td>
        		<td class="a"><input type="checkbox"></td>
        		<td><input type="checkbox" checked></td>
        	</tr>
        	<tr>
        		<td><input type="checkbox"></td>
        		<td class="a"><input type="checkbox" checked></td>
        		<td class="a"><input type="checkbox" checked></td>
        		<td class="a here"><input type="checkbox" checked></td>
        		<td><input type="checkbox" checked></td>
        	</tr>
        </table>

        【讨论】:

        • 没有each 的唯一原因是它需要点击。这个问题显然没有假设点击。 (您的回答给人一种不需要点击的误导性印象,因为您已将here留在标记中,并且没有像问题那样将其删除。)
        • @TJCrowder OP 的问题代码显示了类here 在标记中 并包含点击事件中的所有javascript,所以我只是坚持这个场景OP声明。不要把 without-each-loop 变体 这么个人化,这只是另一种方式,并不意味着更好
        • 对——OP 的代码首先将其删除。我没有说任何关于个人的事情。我只是指出这不是问题的可行答案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-10
        • 1970-01-01
        • 2013-03-02
        • 1970-01-01
        • 2013-01-19
        • 2012-01-02
        相关资源
        最近更新 更多