2009-12-24 45 views
3

我有一个定义列表,我需要删除所有的<dt>标签谁没有任何<dd> 在这种特殊情况下:HERRAMIENTAS,Suplementos,REPUESTOS,HERRAMIENTAS和反pinchaduras删除<dt>没有<dd>与jQuery

该列表可以变化很大,因为它的股票相关的(任何种类<dt>可以得到空)

我想这

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

但是它会删除,而不是“HERRAMIENTAS”“当事人之间的”和无法删除“suplementos” 还与:empty尝试,但它似乎没有一个DD DT不被认为是空的......

必须有一个非常简单和容易的解决方案,但我的大脑拒绝看它:-(

列表示例:

<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> 

回答

3
$('dt').filter(function(){ 
        return !($(this).next().is('dd')); 
       }).remove(); 

看到它在这里的行动:http://jsbin.com/isute


这也可以工作,但奇怪的是,并不会选择最后<dt>,所以我加anothe选择:

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

即:选择所有<dt> S中的又一个<dt>,选择prev dt,并添加最后一个。


另一种选择:

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

not can take an array,所以此工程。这也可以写成 $('dt')。not($('dd')。prev('dt'))。remove();但是非常丑陋。

+0

我要补充 - 我原本'$('dt +:not(dd)')。prev()',所以dt:最后一个孩子更有意义 - 它是最后一个,或者它后面有一些不是dd的东西。 – Kobi 2009-12-24 10:38:29

0

试试这个:

$('dl>dt').each(function() { 
    if ($(this).next("dd").length <= 0){ 
     $(this).remove(); 
    } 
}); 
+1

这将删除所有不包含* dd的dts。也就是说,可能都是这些。 -1 – 2009-12-24 10:35:41

+0

公平评论。已经相应编辑。 – 2009-12-24 11:18:03

+0

您的第一个选择器是'dl> dt' - 您从一个空集合开始,这里没有层次结构:P。看到我的答案的链接?添加'/编辑'到最后,并与它一起玩,你会明白我的意思(这是http://jsbin.com/isute/edit)。 – Kobi 2009-12-24 11:51:59

2

尝试这样的事情...

$('dt').each(function() { 
    if($(this).next('dd').length == 0){ 
     $(this.remove(); 
    } 
}); 
0

这将隐藏<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(); 
    } 
});  
相关问题