2011-02-09 13 views
5

Wiem, że to powinno być proste zadanie, ale mam problemy z wyborem ostatniego elementu nagłówka i zawijanie go w przęsło, aby móc dodawać zmiany stylu.Jak zawinąć rozpiętość wokół ostatniego słowa wewnętrznego tekstu elementu, używając jQuery?

Oto co mam tak daleko

$('.side-c h3').split(/\s+/).pop().wrap('<span />'); 

Każda pomoc będzie mile widziana

+1

Pewnie już, że to dzięki, ale będzie to prawdopodobnie łatwiej zrobić to po stronie serwera, ponieważ wiele języków programowania stron internetowych mają wiele funkcji wysokiego poziomu do czynienia z manipulowanie tekstem, podczas gdy jQuery ma na celu (jak powiedział Stephen) obsługę węzłów DOM. (Człowieku, to było długie zdanie.) – eykanal

+0

Zgadzam się z @eykanal, chyba że budujesz wtyczkę jQuery, która będzie używana przez innych programistów. – Stephen

Odpowiedz

15

Problemem jest to, że jQuery obiektów węzłów okład DOM. Każde słowo w elemencie nie jest samym węzłem DOM, więc będziesz potrzebował trochę więcej pracy, aby rozdzielić tekst i dołączyć do niego. Musisz również uwzględnić wiele węzłów wybranych przez jQuery. Wypróbuj to:

$('.side-c h3').each(function(index, element) { 
    var heading = $(element), word_array, last_word, first_part; 

    word_array = heading.html().split(/\s+/); // split on spaces 
    last_word = word_array.pop();    // pop the last word 
    first_part = word_array.join(' ');  // rejoin the first words together 

    heading.html([first_part, ' <span>', last_word, '</span>'].join('')); 
}); 
+0

to działa! ale przepisuje nagłówki dla wszystkich z nich na stronie –

+0

Och, masz wiele '.side-c h3'? Napiszę odpowiedź. – Stephen

+0

Jedna ostateczna aktualizacja. Powinieneś być dobry, by pójść z tą nową próbką. Daj mi znać, jeśli chcesz to wyjaśnić. – Stephen

0

Hmm, nie jest to szczególnie łatwe. Najbardziej ortodoksyjny sposób to zrobić z DOMNode.splitText:

$('.side-c h3').each(function(){ 
    var oldNode = this.firstChild, 
     newNode = oldNode.splitText(oldNode.data.lastIndexOf(' ') + 1), // don't wrap the space 
     span = document.createElement('span'); 

    this.replaceChild(span, newNode); 
    span.appendChild(newNode); 
}); 

See jsfiddle.

2

To prawda:

$('.side-c h3').each(function(){ 
    var $this = $(this), text=$this.text().trim(), words = text.split(/\s+/); 
    var lastWord = words.pop(); 
    words.push('<span>' + lastWord + '</span>'); 
    $this.html(words.join(' ')); 
});