2017-02-16 14 views
6

W poniższym kodzie:Wykluczanie elementów dziecko od funkcji z jQuery

<p>Red red red red <a href="http://www.google.com"> this should be red alone</a> red red</p> 

Jak bym zmienić wszystkie „Red do” żółtej, z wyjątkiem jednego w «a» tag?

mam tak daleko:

$("p").html(function(i,event){ 
    return event.replace(/(red)/g,'yellow'); 
}); 

... która wszystko zmienia się na żółty. Zakładam, że muszę dodać w klauzuli if mówi coś w rodzaju:

if (event.target.tagName === "a") 
{return false} 

Ale próbowałem dziesiątki rzeczy znalazłem na stackoverflow, bez skutku. Jakieś pomysły?

Odpowiedz

1

Brudny sposób specyficzny i dlatego też nie będzie działać, jeśli wielu <a> w <p> na przykład, ale jeśli działa w <p> istnieje tylko jeden <a>.

Najlepszym sposobem jest znalezienie właściwego wyrażenia regularnego.

var aContent = $('p > a')[0].outerHTML; 
 

 
$('p').html(function(i,event) { 
 
    var parts = event.split(aContent); 
 

 
    for (var i, l = parts.length; i<l; i++) { 
 
     parts[i] = parts[i].replace(/red/ig, 'yellow'); 
 
    } 
 

 
    return parts.join(aContent); 
 
});
<p>Red red red red <a href="http://www.google.com">red</a> red red</p> 
 

 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

+0

Ładny, ale zbyt uproszczona mój problem. - związek może mieć inne słowa w zaktualizowałem moje pytanie powyżej ... – JohnG

+0

@JohnG to bardziej 'regex' problemu, zaktualizowane moja odpowiedź, jeśli jest jakiejkolwiek pomocy, w przeciwnym razie zaktualizowałem twój post, aby zawrzeć powiadomienia 'regex' doświadczonych ludzi – smarber

4

Można iteracyjne węzły tekstowe używając contents(). Nie będzie to miało żadnego wpływu na wszelkich detektorów zdarzeń na elementach wewnętrznych sposób korzystania html() byłoby

$('p').contents().each(function() { 
 
    if (this.nodeType === 3) { 
 
    this.textContent = this.textContent.replace(/red/gi, function(match) { 
 
     return match === 'Red' ? 'Yellow' : 'yellow' 
 
    }); 
 
    } 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<p>Red red red red <a href="http://www.google.com">red</a> red red</p>

+0

Dzięki, że robi dokładnie to, o co prosiłem .... Obawiam się, że uczę się, które upraszczają moje problemy na stackoverflow dla zwięzłości nie zawsze jednak jest rozsądny! Mój rzeczywisty problem polega na tym, że w celu utworzenia hiperłączy trzeba zawęzić tekst już w hiperlinkach. Korzystanie z textContent nie działa, ponieważ nie jest już dodawanie w html ... Przepraszamy! Jakieś pomysły? – JohnG

+1

można użyć 'replaceWith()' https://jsfiddle.net/nLddwdz9/ – charlietfl

+0

Dzięki Charlie - myślę, że mogę tego użyć! – JohnG

0

wziąłem inną drogę: Separacja dziecka, wymienić swoje miejsce z tekstem losowej wykonywania naszych zamień jak zwykle, a następnie zastąp ten losowy ciąg naszym kodem potomnym.

var para = $("p"); 
 
var child = para.children()[0]; 
 
var text = child.outerHTML; 
 

 
para.find(child).replaceWith("zzzz"); 
 

 
$(para).html(function(i,event){ 
 
    return event.replace(/(red)/gi,'yellow'); 
 
}); 
 

 
$(para).html(function(i,event){ 
 
    return event.replace("zzzz", text); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 

 
<p>Red red red red <a href="http://www.google.com"> this should be red alone</a> red red</p>

Powiązane problemy