Удалить <dt>без <dd>с помощью jquery - PullRequest
3 голосов
/ 24 декабря 2009

У меня есть список определений, и мне нужно удалить все теги <dt>, у которых нет <dd> В данном конкретном случае: Herramientas, Suplementos, Repuestos, Herramientas и Anti pinchaduras

Список может сильно отличаться, поскольку он зависит от запасов (любая категория <dt> может опустеть)

Я пробовал это

$('dt+dt').each(function() {
    $(this).remove();
});

Но он удаляет "partes" вместо "herramientas" и не может удалить "suplementos" Также пробовал с :empty, но кажется, что dt без dd не считается пустым ...

Должно быть очень простое и легкое решение, но мой мозг отказывается это видеть: - (

Пример списка:

<dl>
    <dt>Bicicletas</dt>
        <dd><a href="/bicicletas/">Bicicletas</a> (70)</dd>
    <dt>Accesorios</dt>
        <dd><a href="/accesorios/bocinas/">Bocinas, timbres y cornetas</a> (9)</dd>
        <dd><a href="/accesorios/transporte/">Transporte y protección</a> (1)</dd>
    <dt>Herramientas</dt>
    <dt>Partes</dt>
        <dd><a href="/partes/cubiertas/">Cubiertas</a> (2)</dd>
        <dd><a href="/partes/asientos/">Asientos</a> (5)</dd>
        <dd><a href="/partes/grips/">Puños / grips</a> (1)</dd>
    <dt>Articulos de indumentaria</dt>
        <dd><a href="/indumentaria/jerseys/">Jerseys / Remeras</a> (1)</dd>
        <dd><a href="/indumentaria/cascos/">Cascos</a> (3)</dd>
    <dt>Suplementos</dt>
    <dt>Repuestos</dt>
    <dt>Herramientas</dt>
    <dt>Anti pinchaduras</dt>
</dl>

Ответы [ 4 ]

3 голосов
/ 24 декабря 2009
$('dt').filter(function(){
                     return !($(this).next().is('dd'));
               }).remove();

Смотрите это в действии здесь: http://jsbin.com/isute


Это также может работать, но странно, и не выберет последний <dt>, поэтому я добавил еще один селектор:

$('dt + dt').prev().add('dt:last-child').remove();

То есть: выберите все <dt> с, следующих за другим <dt>, выберите предыдущее значение и добавьте последнее.


Другой вариант:

var good = $('dd').prev('dt');
$('dt').not(good).remove();

not может принимать массив , так что это работает. Это также можно записать как $ ('dt'). not ($ ('dd'). prev ('dt')). remove ();, но очень уродливо.

2 голосов
/ 24 декабря 2009

Попробуйте что-то вроде этого ...

$('dt').each(function() {
    if($(this).next('dd').length == 0){
       $(this.remove();
    }
});
0 голосов
/ 15 января 2010

Это будет работать и для скрытых <dd>:

var $dl = $('dl'); // hook this up to your DL

$dl.find('dt').each(function() {
  var $dt = $(this), $next = $dt.nextAll(':visible').slice(0,1);
  // the next visible element is a dt OR there isn't another visible element.
  if ($next.slice(0,1).is('dt') || $next.length == 0)
  {
    $dt.hide();
  } else {
    $dt.show();
  }
});      
0 голосов
/ 24 декабря 2009

Попробуйте это:

$('dl>dt').each(function() {
    if ($(this).next("dd").length <= 0){
        $(this).remove();
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...