Как вы .unwrap() элемент несколько раз?

Есть ли способ использовать JQuery .unwrap() несколько раз без копирования и вставки? Было бы неплохо, если бы он мог принять аргумент или что-то вроде: .unwrap(4), но это не так. Есть ли более умное решение для достижения следующего:?

$(".foo a").unwrap().unwrap().unwrap().unwrap();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul>
<li class="foo">
    <div>
        <ul>
            <li>
                <div>
                    <a href="#">Link 1</a>
                </div>
            </li>
        </ul>
    </div>
</li>
<li class="foo">
    <div>
        <ul>
            <li>
                <div>
                    <a href="#">Link 2</a>
                </div>
            </li>
        </ul>
    </div>
</li>
<li class="foo">
    <div>
        <ul>
            <li>
                <div>
                    <a href="#">Link 3</a>
                </div>
            </li>
        </ul>
    </div>
</li>
</ul>

Ответ 1

Используйте parentsUntil
ребенок foo (.foo > *)
(который был бы предком элемента).

Используйте addBack, чтобы включить сам элемент.

$('.foo a').parentsUntil('.foo > *').addBack().unwrap();

Fiddle 1


Если вы хотите, чтобы универсальная функция разворачивала объект n раз, это делает это:
$.fn.unwrapN = function(n) {
  while(n--) $(this).unwrap();
  return $(this);
}

Fiddle 2

Ответ 2

Вы всегда можете написать свой собственный:

$.fn.unwrapTimes = function(times){
    var unwrapCount = times;
    return this.each(function(){
        var $this = $(this);
        for(var i=0;i<unwrapCount;i++){
             $this.unwrap();   
        }
    });
};

fiddle

Очевидно, имя должно быть изменено, но логика звучит.

Ответ 3

Может использовать html()

$('.foo').html($('.foo a'));

Этот подход не масштабируется для нескольких, но может использовать html(fn) для нескольких экземпляров

$('.foo').html(function(){
   return $(this).find('a')
});

Демо

Ответ 4

Зачем его компрометировать?

var $wrapper = $('li.foo'),
    $keep = $wrapper.find('a'),
    $result = $wrapper.empty().append($keep);

console.log($result[0].outerHTML);

http://jsfiddle.net/k5mn0gnm/

Ответ 5

Для одиночной foo elememt попробуйте использовать .prependTo(), .empty()

 $(".foo a").prependTo($(".foo").empty());

$(".foo a").prependTo($(".foo").empty());
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
</script>
<li class="foo">
    <div>
        <ul>
            <li>
                <div>
                    <a href="#">Link</a>
                </div>
            </li>
        </ul>
    </div>
</li>