Удаление только родительского элемента в DOM JQuery

У меня заканчиваются идеи. У меня есть проблема, когда мне нужно удалить только родительский элемент, сохранив при этом дочерний элемент.

<div class="remove_this_only">
    <table>
        <tbody>
            <tr>
                <td>I want to get preserved</td>
            </tr>
        </tbody>
    </table>
</div>

результирующий вывод должен быть

<table>
    <tbody>
        <tr>
            <td>I want to get preserved</td>
        </tr>
    </tbody>
</table>

person Nrusingha    schedule 21.06.2011    source источник
comment
Если вы удалите <td> или <tr> (не уверен, о чем вы говорите), у вас будет недопустимая разметка HTML.   -  person user113716    schedule 21.06.2011
comment
‹html› ‹div class=remove_this_only› ‹table› ‹tbody› ‹tr› ‹td›Я хочу сохранить‹/td› ‹/tr› ‹/tbody› ‹/table› ‹/div› ‹/html› . Я хочу удалить div   -  person Nrusingha    schedule 21.06.2011
comment
Я добавил ответ, но я не уверен, в каком контексте вы будете его использовать.   -  person Tomgrohl    schedule 21.06.2011
comment
возможный дубликат stackoverflow.com/questions/5936887/   -  person goodeye    schedule 07.07.2014


Ответы (10)


Прямой путь:

var div = $(".remove_this_only");
var tmp = div.children().clone();
var parent = div.parent();
div.remove();
tmp.appendTo(parent);

Скрипка: http://jsfiddle.net/cb9sb/

person wong2    schedule 21.06.2011
comment
-1 В этом есть баги. Если удаляемый элемент не находится в конце своего родителя, то вы получаете свой код в неправильном порядке: jsfiddle.net/morrison/cb9sb/1 - person Levi Morrison; 21.06.2011

ИЗМЕНИТЬ:

Похоже, вы хотите удалить <div>, который вы добавили к вопросу.

Просто выберите <table> и используйте unwrap()[docs]< /а> метод.

$('div > table').unwrap();

Конечно, селектор будет зависеть от вашей фактической разметки.

Пример: http://jsfiddle.net/VyJv3/ (the стиль div удален)


Исходный ответ:

Таким образом, вы будете удалять элемент, необходимый для таблицы.

Если вы надеялись удалить <td>, у вас будет текстовый узел как дочерний элемент <tr>. Вы можете сделать это.

Если бы ваш HTML был таким:

<html>
<table>
    <tbody>
        <tr>
            <td><span>I want to get preserved</span></td>
        </tr>
    </tbody>
</table>

...и вы хотите избавиться от <span>, вы можете использовать unwrap()[docs ] метод.

$('td > span').contents().unwrap();
person user113716    schedule 21.06.2011
comment
мне нравится это решение, а не '$(table)' селектор '$(.remove_this_only table)', вероятно, был бы лучшим. - person Dustin Laine; 21.06.2011
comment
@Дастин: Спасибо. У меня такое ощущение, что класс на самом деле не существует для элемента, а скорее OP использует его, чтобы указать div в вопросе. Я согласен с тем, что если в реальном HTML есть класс или какое-либо другое обозначение, то его следует использовать в селекторе. - person user113716; 21.06.2011
comment
Мне тоже нравится ! wrap() также полезен - person VGE; 22.06.2011

Вы можете клонировать всю структуру и просто сохранить нужные части:

$('html').clone().appendTo('tmp');
person serialworm    schedule 21.06.2011
comment
Как это удалит элемент <div> и каким должен быть 'tmp'? - person user113716; 21.06.2011
comment
Извините, я должен был быть более полным в моем примере. Ответ Вонг2 объясняет, к чему я клоню. Если вы сделаете копию узла html, вы сможете манипулировать им по своему усмотрению. - person serialworm; 21.06.2011

Думаю, я понимаю, что вы имеете в виду.

Я думаю, это то, что вы ищете:

$("td").closest("table").unwrap();
person Tomgrohl    schedule 21.06.2011

Одним из способов было бы взять то, что вы хотите оставить, и добавить его к родителю элемента, который вы хотите удалить. Затем удалите элемент, который вы хотите удалить.

person ek_ny    schedule 21.06.2011

Возьмите содержимое div и замените div на это:

$(".remove_this_only").replaceWith($(".remove_this_only").html());
person James Allardice    schedule 21.06.2011
comment
Это будет работать, но имейте в виду, что при этом удаляются все связанные данные jQuery, такие как обработчики событий. - person user113716; 21.06.2011

Ответы в действии:


//option 1
var $table = $('table');
$table.parent().before($table).remove();

//option 2
var $toRemove = $('.remove_this_only');
$toRemove.before($toRemove.children()).remove();

//option 3
$('table').unwrap();

Примечания:

  • append, before и некоторые другие функции jQuery выполняют "отключение" автоматически.
  • Все они очень короткие, что делает их потрясающими.
person Levi Morrison    schedule 21.06.2011

Detach() не работает в вашем случае?

http://api.jquery.com/detach/

Вы также можете использовать методы html() для извлечения исходного кода.

Алгоритм:

  1. Отсоединить внутренний блок
  2. Удалите блок, чтобы уничтожить
  3. Прикрепите внутренний блок в нужном месте.
person VGE    schedule 21.06.2011
comment
Detach() также удаляет внутренние блоки - person Nrusingha; 21.06.2011

Решение, помеченное как ответ, не соответствует указанному в комментарии.

вот точное решение, чтобы получить первых детей и заменить родителя дочерним

var child = $("#entry-longdesc").children().first().clone();
$("#entry-longdesc").replaceWith(child);

это только удалит родительский тег и сохранит ваш дочерний дом как есть

person Vishal Sharma    schedule 20.05.2013

Очень простым решением будет метод jQuery unwrap() с добавленным селектором для родительского элемента, который вы хотите удалить. Итак, в вашем случае:

$('table').unwrap('.remove_this_only');

Примечание. Если вы не добавите селектор .remove_this_only, он может развернуть больше родительских элементов, чем вам нужно. В качестве альтернативы, если вы хотите убедиться, что вы специально нацеливаете элемент «таблица» только в элементе «.remove_this_only», вы можете сделать следующее:

 $('.remove_this_only').find('table').unwrap('.remove_this_only');
person M Zein    schedule 07.08.2017