使用jQuery清空除特定元素以外的所有内容的最佳方法?

Posted

技术标签:

【中文标题】使用jQuery清空除特定元素以外的所有内容的最佳方法?【英文标题】:Best way to empty all content except a particular element using jQuery? 【发布时间】:2019-10-21 09:55:18 【问题描述】:

考虑:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table>
  <tbody>
    <tr>
      <td>Foo</td>
      <td>
        <p>
          <span><input type="checkbox" disabled="disabled" checked="checked">1 </span>
          <span><input type="checkbox" disabled="disabled"> 2</span>
          <span><input type="checkbox" disabled="disabled"> 3</span>
        </p>
      </td>
    </tr>
    <tr>
      <td>Bar</td>
      <td>
        <p>
          <span><input type="checkbox" disabled="disabled" checked="checked"> A</span>
          <input type="checkbox" disabled="disabled"> B
        </p>
      </td>
  </tbody>
</table>

使用 jQuery,我如何只保留具有 input 和属性 checked&lt;span&gt;?基本上,最后,我只想要以下 html

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table>
  <tbody>
    <tr>
      <td>Foo</td>
      <td>
        <p>
          <span><input type="checkbox" disabled="disabled" checked="checked">1 </span>
        </p>
      </td>
    </tr>
    <tr>
      <td>Bar</td>
      <td>
        <p>
          <span><input type="checkbox" disabled="disabled" checked="checked"> A</span>
        </p>
      </td>
  </tbody>
</table>

请注意,出于某种原因,BarB 故意不环绕 &lt;span&gt;(我没有编写 HTML)。此外,假设检查的输入将始终在&lt;span&gt; 内。

最后,我需要一个没有(匿名)函数的单行 jQuery 命令,因为我使用的工具只支持单行 jQuery 语句。我最终只想提取此 HTML 的.text(),因此我想删除未检查相应输入的文本。

我得到的最接近的是 $("table").find("p:has(input)").contents().not("span:has(input:not(:checked))").remove().end().html()(不起作用)

【问题讨论】:

【参考方案1】:

一条线?? ? ? 那可能是不可能的

$(document).ready(function()

  $("table tr td p").each(function()
  
    var html = "";
    $(this).find('span').each(function()
      if($(this).has('input[checked="checked"]').length)
        html += '<span>'+$(this).html()+'</span>';
      
    );
    $(this).html(html);
    
  );

);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table>
  <tbody>
    <tr>
      <td>Foo</td>
      <td>
        <p>
          <span><input type="checkbox" disabled="disabled" checked="checked">1 </span>
          <span><input type="checkbox" disabled="disabled"> 2</span>
          <span><input type="checkbox" disabled="disabled"> 3</span>
        </p>
      </td>
    </tr>
    <tr>
      <td>Bar</td>
      <td>
        <p>
          <span><input type="checkbox" disabled="disabled" checked="checked"> A</span>
          <input type="checkbox" disabled="disabled"> B
        </p>
      </td>
  </tbody>
</table>

【讨论】:

抱歉,源 HTML 没有 &lt;span&gt;B。这是故意的。这就是为什么逻辑必须是“清空 p 的所有内容,除了具有检查输入的跨度之外”。 但是,我认为他想要文本节点。在他的样本(期望)中,它有那些。 @Rory McCrossan 如果您对 one Line 没有问题,它会起作用 ? ? #hobbes3【参考方案2】:

尝试处理未包含在 &lt;span&gt; 中的输入的更新答案。

// Finds all checked input
var $targets = $('body').find('input:checked');

// Loop over each input
$($targets).each(function()

    // If the parent isn't a span, then false
    var parent_span = ($(this).parent().is('span')) ? $(this).parent() : false;

    // If parent span is not false, empty the closest p and append the span, otherwise remove spans from parent p
    (parent_span !== false) ? $(this).closest('p').empty().append(parent_span) : $(this).closest('p').find('span').remove();

)

如果您将另一个未包装在 &lt;span&gt; 中的输入添加到容器中,这将分崩离析。我知道你说过 HTML 是这样的,但理想情况下它应该是一致的。

Here's an update jsfiddle.

【讨论】:

以上是关于使用jQuery清空除特定元素以外的所有内容的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章

Jquery 4种移除 清空元素的方法

jquery之empty()方法详解

jQuery修炼心得-DOM节点的删除

jquery怎么清空div的子元素?

JQuery,如何清除,除了点击的元素以外,其他所有元素

HTACCESS-重定向除特定目录以外的所有目录