2017-04-18 131 views
0

在Javascript对象中,我有一个HTML字符串(node.innerHTML),我需要从字符串中删除空的段落,然后返回字符串。空段落包括<p></p>,<p> </p><p>&nbsp;</p>。理想情况下,我认为该字符串应该被解析为HTML代码进行处理,而不是使用正则表达式。我尝试了各种方法,似乎无法使其正常工作。Javascript - 从HTML字符串中删除空的段落

这里是我尝试过的代码,但它返回一个只有prevObject数据的对象,再加上它似乎并没有删除空的段落。

function strip_empty_p (node) {  
    var html = $(node.innerHTML); 
    html = html.filter($('p'),function() { 
     return this.innerHTML == "" || 
     this.innerHTML == " " || 
     this.innerHTML == "&nbsp;" 
     }).remove();  
    node.innerHTML = html.innerHTML; 
    return node.innerHTML; 
} 
+0

才能看到你的代码 – 2017-04-18 20:40:48

+8

*“我尝试了各种方法”* - 考虑包括它们。本网站不是要求某人编写代码的地方,而是帮助您修复自己的代码。没有*给予*任何东西,你不会*得到*任何东西。请修改您的问题以显示足够的尝试。 – Santi

+0

循环遍历儿童,如果type = P,那么只能使用innerHTML作为父代 – Bug

回答

1

如果你有机会到node,它要好得多,通过它为HTML而不是让innerHTML和解析这种方式运行。

const parent = document.querySelector('div'); 
 

 
parent.childNodes.forEach(child => child.nodeType === document.ELEMENT_NODE 
 
    && !child.innerText.trim() 
 
    && parent.removeChild(child));
<div> 
 
<p></p> 
 
<p> </p> 
 
<p>Not empty</p> 
 
<p>&nbsp;</p> 
 
<p>Also not empty</p> 
 
<p></p> 
 
</div>

这种方法将远比试图解析它,仿佛它是文本更可靠和更快。

如果从某处加载文本,请先将其转换为HTML节点,如果格式足够好。

如果它的格式不正确的HTML,那么生活会变得更加困难,你必须做一些棘手的错误倾向的字符串解析。

+0

'textContent'而不是'innerText'也会让这个更快。 'innerText'会导致布局。 – skyline3000

+0

选择时需要注意一些差异。特别是,使用'textContent'会显示隐藏的元素,根据预期的用例可能会或可能不需要。一个好消息,如果你没有显示隐藏的元素(或没有),那么'textContent'可能是一种可行的方式。 – samanime

0

你可以通过jQuery来做到这一点。您可以检查段落的.text()innerHTML()。下面是对的jsfiddle一个例子:https://jsfiddle.net/akvap5mg/

$(document).ready(function(){ 
    $("p").each(function(){ 
    var $this = $(this); 
    if($this.text().trim() === '') { 
      $this.remove(); 
    } 
    }); 
}); 
0

如果你想删除空段落,需要力行谨慎,如果这是你打算从字面上做的,因为每一个元素被删除时它改变了整个球赛什么。这是最终为我工作:

var d = document.getElementsByTagName("div")[0]; 


    for (i=0, max=4; i <= max; i++) { 
    if (d.children[i].textContent.trim() == ""){ 
        d.removeChild(d.children[i]); 
        max--; 
        i--; 
     } 
    } 

live code

如果不调整变量max和我,然后检测DOM元素被揭去和一个空的段落可能不会被删除。

或者,下面的代码比喻删除空段落,并没有需要调整的变量max和I:

var d = document.getElementsByTagName("div")[0]; 


    for (i=0, max=4; i <= max; i++) { 
    if (d.children[i].textContent.trim() == ""){ 
      d.children[i].style.display="None"; 
     } 
    } 

live code

顺便说一下,这里有一个更生动的例子here