0
<div class="parent">
   <span>sometext</span>
   plain text
   <input class="child">
</div>
<div class="parent">
   <span>sometext</span>
   plain text
   <input class="child">
</div>
<div class="parent">
   <span>sometext</span>
   plain text
   <input class="child">
</div>

如何安全地删除.parentexcept中的所有内容.child

我正在使用这段代码(其中items是堆栈.childeach.child

items.each(function(){
    $(this).parent().children().each(function(){
       if ($(this).hasClass('child'))
          // do something
       else
          $(this).remove();
    });

    $(this).unwrap(); // remove parent, keep only .child
});

但它不处理纯文本。

4

4 回答 4

3

你说过

.child里面可以有多个.parent,我们只保留第一个。所以如果有三个,第二个和第三个应该被删除。

然后

items是一堆,.child每个都是一个.child

好的,那么这就是我要做的:

items.parent('.parent').each(function() {
    var parent = $(this),
        child  = parent.children('.child').first();
    child.detach();
    parent.empty().append(child);
});

那是做什么的:

  1. .child元素集向上移动到元素集.parent。结果集将只有唯一的父母。

  2. 循环通过父母。

  3. 获取每个父级中的第一个并将其分离。 .child

  4. 清空.parent.

  5. 重新附加.child.

最终结果是每个.parent人都只有一个.child(并且没有其他孩子,无论是否.child)。

于 2013-02-20T09:24:34.563 回答
2

在这里,您将有一个纯 JS 的解决方案:fiddle

因此,在您的循环中,您可以使用以下内容:

this.parentNode.innerHTML = this.outerHTML;

如果您必须保留附加的事件处理程序:

var _this = this.cloneNode(true),
    parent = this.parentNode;
parent.innerHTML = '';
parent.appendChild(_this);
于 2013-02-20T09:34:11.950 回答
1

像这样的东西会做到这一点;

$('.parent').on('click', '.child', function(e) {
    var $this = $(this),
        $parent = $this.parent(),
        $children = $parent.find('.child'); // or: $this.siblings('.child');

    $parent
        .empty() // Empty the "parent" element
        .append($children); // Re-append all "child" element to "parent"
    $this.focus(); // Focus the (input) element
});
于 2013-02-20T09:25:06.003 回答
1

这是使用正则表达式的替代方法:

$('.parent').each(function() {
    $(this).html($(this).html().match("<input class=.child.>"));
});
于 2013-02-20T09:37:23.667 回答