2011-10-04 39 views
0

我有这样的:JQuery的:我试图文本之前删除第一<br>,但每<br>被删除

<p> 
<br> 
<br> 
JQuery problems again... 
<br> 
<br> 
Why me...? 
</p> 

我尝试使用这样的:

$("p").children(":first-child").nextUntil(":not(br)").remove(); 

但我莫名其妙地结束与此:

<p> 
JQuery problems again...Why me...? 
</p> 

据我了解,纠正我,如果我错了,代码搜索<p>的第一个孩子,这将是第一个<br>,然后删除文本之前出现的所有。

我想要做的就是删除出现在<p>元素中的文本之前的第一个<br>。你能告诉我我该怎么做吗?

+0

如果文本内包裹你现有的代码将工作另一个元素(可能是'')。 – RoccoC5

+1

text在jQuery的'.next()'逻辑中不算作元素。 – jfriend00

+1

查看http://stackoverflow.com/questions/298750/how-do-i-select-text-nodes-with-jquery查看如何获取jQuery中的文本节点或将文本包装在一个''所以jQuery将它看作一个元素。 – jfriend00

回答

0

它看起来像jQuery并没有帮助很多,所以不是试图强制它,这看起来像是一个普通的javascript(除了识别p标签)的工作。这将适用于您的现有HTML,而无需在文本周围添加<span>标签。

$("p").each(function() { 
    var children = this.childNodes; 
    var removals = [], child, i; 
    for (i = 0; i < children.length; i++) { 
     child = children[i]; 
     // nodeType 1 is ELEMENT_NODE 
     if (child.nodeType == 1) { 
      if (child.nodeName.toLowerCase() == "br") { 
       removals.push(child); 
      } 
     } 
     // nodeType 3 is TEXT_NODE 
     else if (child.nodeType == 3) { 
      // stop at first non whitespace text node 
      if (child.nodeValue.match(/\S/)) { 
       break; 
      } 
     } 
    } 
    // now remove the nodes we collected for removal 
    // remove outside the first loop because childNodes is a live array 
    // and we don't want it changing while iterating it 
    for (i = 0; i < removals.length; i++) { 
     removals[i].parentNode.removeChild(removals[i]); 
    } 
}); 

你可以看到它在这里工作:http://jsfiddle.net/jfriend00/NjaRF/

+0

非常感谢!它工作得很好。 – user969591

1

CSS选择器永远不会匹配文本本身只有元素。 jQuery对匹配文本节点没有那么多支持。我猜你必须做这样的事情:如果你改变你的HTML这个

$("p").each(function() { 
    $($(this).contents()).each(function() { 
    if (this.nodeType === 3 && /\S/.test($(this).text())) { 
     // Found some text, so stop removing elements. 
     return false 
    } else if ($(this).is("br")) { 
     $(this).remove() 
    } 
    }) 
}) 
1

,其中文本是一个跨度:

<p> 
    <br> 
    <br> 
    <span>JQuery problems again...</span> 
    <br> 
    <br> 
    <span>Why me...?</span> 
</p> 

然后,您可以使用此jQuery来删除这些领先
标签:

$("p br:first-child").nextUntil(":not(br)").andSelf().remove(); 

看到它在这里工作:http://jsfiddle.net/jfriend00/W2W5F/

+0

这是在Blogger上,我不能手动添加'span'到注释。 – user969591

+0

然后,你就像在Daniel的例子中一样手动搜索文本节点。如果您控制了HTML,我只是提供了不同的东西。 – jfriend00

+0

感谢您的帮助。 – user969591

0

我知道这是一个很老的问题,但我发现这个题目时,我今天遇到了类似的问题。

我找到一个替代 - 简单 - 的解决方案,也许这将是有用的人:

$('p').each(function(){ 
    var h = $(this).html().trim(); 

    // remove <br> tags before text 
    while (h.match(/^<br ?\/?>/gi)) h = h.replace(/^<br ?\/?>/gi, '').trim(); 

    // remove <br> tags after text 
    while (h.match(/<br ?\/?>$/gi)) h = h.replace(/<br ?\/?>$/gi, '').trim(); 

    $(this).html(h);  
}); 

的jsfiddle演示:http://jsfiddle.net/ULwCL/

相关问题