2014-02-13 6 views
6

Ich muss direkte HTML-Geschwister in nur einer in Seitencode einschließlich Textknoten zusammenführen.Merge direkte HTML-Geschwister in eine in jQuery

<div>some text 
<b>some text</b> som 
e text <b>text</b><b> more text</b> some te 
xt</div> 

Dies ist actualy Ausgabe nach dem Code rangy und jQuery Bearbeitung und ich brauche es nach der Bearbeitung zu löschen, so dass es wie folgt aussehen:

<div>some text <b>some text</b> some text <b>text more text</b> some text</div> 

Ich möchte jQuery verwenden zu tun Dies. Ich bin mir der Funktionen unwrap() und wrapAll() bewusst, aber ich kann sie nicht effektiv kombinieren. Danke für jeden Hinweis oder Hilfe!

+3

Also, im Wesentlichen alles, was Sie tun möchten, ist der Zeilenumbrüche loswerden? –

+0

Ich denke, was er will, ist diese 'Textmehr Text' in diese 'Text mehr Text'. Eigentlich ist das eine wirklich gute Frage. – Fabricio

+0

@PatrickEvans nein dort nicht 'Text mehr Text' wurde kombiniert von 'Textmehr Text'. – AfromanJ

Antwort

3

Sie benötigen Kind eins nach dem anderen iterieren Knoten; Knoten mit vorherigem vergleichen und ggf. kombinieren. Es kann so kompliziert sein wie du willst; aber hier ist ein Anfang:

$("div").each(function (i) { 
    $(this).find("*").each(function() { 
     var that = this.previousSibling; 
     if (that && that.nodeType === Node.ELEMENT_NODE && that.tagName === this.tagName) { 
      var node = document.createElement(this.tagName); 
      while (that.firstChild) { 
       node.appendChild(that.firstChild); 
      } 
      while (this.firstChild) { 
       node.appendChild(this.firstChild); 
      } 
      this.parentNode.insertBefore(node, this.nextSibling); 
      that.parentNode.removeChild(that); 
      this.parentNode.removeChild(this); 
     } 
    }); 
}); 

Demo here

+0

Großartig! Danke vielmals! Ich habe dies hinzugefügt.innerHTML = this.innerHTML.replace (/ \ r? \ N/g, ""); Am Ende verschwanden auch neue Zeilenumbrüche. Mein Held! ;) – Walaszka

2

Wenn ich Ihre Frage richtig verstanden habe, wollten Sie Elemente kombinieren, die nebeneinander vom selben Typ sind.

var $div = $("#mydiv"); 
console.log($div.html()); 

$div.contents().each(function(){ 
    if (this.nodeType != 1) return; 
    while (this.nextSibling && this.nextSibling.tagName == this.tagName) { 
     this.innerHTML = (this.innerHTML + this.nextSibling.innerHTML); 
     this.parentNode.removeChild(this.nextSibling); 
    } 
}); 

console.log($div.html()); 

http://jsfiddle.net/X8LYu/2/

Wenn Sie wollten auch die new-line Zeichen entfernen, es würde sich das ändern:

var $div = $("div"); 
console.log($div.html()); 

$div.contents().each(function(){ 
    if (this.nodeType == 3) { 
     this.nodeValue = this.nodeValue.replace(/\n/g,""); 
     return; 
    } 
    if (this.nodeType != 1) return; 
    while (this.nextSibling && this.nextSibling.tagName == this.tagName) { 
     this.innerHTML = (this.innerHTML + this.nextSibling.innerHTML).replace(/\n/g,""); 
     this.parentNode.removeChild(this.nextSibling); 
    } 
}); 

console.log($div.html()); 

http://jsfiddle.net/X8LYu/3/

ich nicht schreiben Code in das sehr oft, also könnte es bessere Wege geben, damit umzugehen.

+0

Dies wird natürlich alle Attribute auf Elemente zerstören, die nach dem ersten Element in einem Satz kommen. –

1
$('div').html(function(_, oldHTML) { 
    return oldHTML.replace(/\n/g, ''); 
}).children().filter(function() { 
    return this.nextSibling 
      && this.nextSibling.nodeName === this.nodeName; 
}).text(function (_, oldText) { 
    return oldText + this.parentNode.removeChild(this.nextSibling).textContent; 
}); 

http://jsfiddle.net/tVZJV/