javascript - HTML Mal Formado: Como NÃO mostrar uma marca num elemento li vazio


Tenho algum HTML que é criado/output a partir de uma aplicação Flash e preciso mostrá-lo/renderizá-lo no Firefox.

O HTML está malformado, por isso irá gerar elementos li vazios e listas sem elementos ul ou ol, mas irá gerar os elementos li.

Existe alguma flag CSS ou algum método para não mostrar um marcador de li se o elemento li estiver vazio (veja o exemplo de código do que vazio significa abaixo)?

Se um elemento li não tiver innerText, então ele mostra o marcador. Mas eu não quero que faça isso, eu quero que NÃO mostre o marcador se não houver innerText no elemento li. Há alguma maneira de fazer isso sem ter que analisar o HTML?

// example of badly formed HTML output from flash
<textformat leading="2">
    <li>
        <font style=" font-family: 'arial'; font-size: 14px; color: #FFFFFF; letter-spacing: 0px; ">
            <b>Influence and Negotiation</b>
            <font style=" font-size: 12px; color: #000000; ">
            </font>
        </font>
    </li>
</textformat>

// sometimes I get an empty li element, which in Firefox shows the bullet. I want to NOT show the bullet/li element if it is empty
<textformat leading="2">
    <li>
        <font style=" font-family: 'arial'; font-size: 14px; color: #FFFFFF; letter-spacing: 0px; ">
            <!-- empty li element -->
        </font>
    </li>
</textformat>

Resposta #1

Não, não há uma maneira. Existe :empty, mas isso não funciona quando há um elemento <font> abaixo dele, e não existe :has em CSS. Pode-se usar :has com jQuery, no entanto, e como marcou javascript, presumo que seja uma opção:

$('li:has(font:empty)').remove();

Isso funcionaria?

Resposta #2

Se quiser remover os elementos li vazios (onde "vazios" significa nenhum conteúdo ou apenas espaços em branco), pode fazer o seguinte:

function getText(el) {
  if (typeof el.textContent == 'string') {
    return el.textContent;
  }
  if (typeof el.innerText == 'string') {
    return el.innerText;
  }
}

var li, lis = document.getElementsByTagName('li');
var re = /^\s*$/;

for (var i=0, iLen=lis.length; i<iLen; i++) {
  li = lis[i];

  if (re.test(getText(li))) {
    li.parentNode.removeChild(li);
  }
}

Alternativamente, poderia definir os LIs vazios para:

 list-style-type: none;

adicionando uma classe adequada, mas os resultados podem não ser consistentes em todos os navegadores. Alguns deixarão um espaço para o li vazio, outros irão removê-lo. Também poderia usar uma classe com:

 display: none;

deixar o li lá, mas não exibi-lo e não ter um espaço. Depende de ti.