I have a div like:
<div id="one">
<div class="first"></div>
"Hi I am text"
<div class="second"></div>
<div class="third"></div>
</div>
I am trying to change only the text from "Hi I am text" to "Hi I am replace" using jquery. This might be easy but I am not able to do it.
Using $('#one').text('')
just empties the whole #One
div.
Text shouldn't be on its own. Put it into a span
element.
Change it to this:
<div id="one">
<div class="first"></div>
<span>"Hi I am text"</span>
<div class="second"></div>
<div class="third"></div>
</div>
$('#one span').text('Hi I am replace');
Find the text nodes ( nodeType==3
) and replace the textContent
:
$('#one').contents().filter(function() {
return this.nodeType == 3
}).each(function(){
this.textContent = this.textContent.replace('Hi I am text','Hi I am replace');
});
Note that as per the docs you can replace the hard-coded 3
in the above with Node.TEXT_NODE
which is much clearer what you're doing.
$('#one').contents().filter(function() { return this.nodeType == Node.TEXT_NODE; }).each(function(){ this.textContent = this.textContent.replace('Hi I am text','Hi I am replace'); });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div id="one"> <div class="first"></div> "Hi I am text" <div class="second"></div> <div class="third"></div> </div>
You need to set the text to something other than an empty string. In addition, the .html() function should do it while preserving the HTML structure of the div.
$('#one').html($('#one').html().replace('text','replace'));
If you actually know the text you are going to replace you could use
$('#one').contents(':contains("Hi I am text")')[0].nodeValue = '"Hi I am replace"';
Or
$('#one').contents(':not(*)')[1].nodeValue = '"Hi I am replace"';
$('#one').contents(':not(*)')
selects non-element child nodes in this case text nodes and the second node is the one we want to replace.
Just in case if you can't change HTML. Very primitive but short & works. (It will empty the parent div hence the child divs will be removed)
$('#one').text('Hi I am replace');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div id="one"> <div class="first"></div> "Hi I am text" <div class="second"></div> <div class="third"></div> </div>
Another approach is keep that element, change the text, then append that element back
const star_icon = $(li).find('.stars svg')
$(li).find('.stars').text(repo.stargazers_count).append(star_icon)
I had the same problem but the text was the first node inside the parent element. In this case you can do something like this and it's really quick:
// find the children elements
termsChildren = $('#one').children()
// replace the text, then re-append the children element.
$('#one').text(' "Hi I am replace" ').append(termsChildren)
Otherwise, you have to specify which children have to go before the text, and which afterwards:
// find the children elements
termsChildren = $('#one').children()
// remove all the content
$('#one').text(' ')
// append the first child element
$('#one').append(termsChildren[0])
// add the new text and then the other children
$('#one').text(' "Hi I am replace" ').append(termsChildren.slice(1))
When you replace the plain text of an element with jQuery, you cannot put the plain text on its own, or else it will clear and/or replace the entire element. You should put all the plain text inside a <span>
element:
$(document).ready(function() { $("#change-btn").click(function() { $("#one").children("span").text("Hi I am replace"); }); });
<!-- Import CSS --> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-+0n0xVW2eSR5OomGNYDnhzAbDsOXxcvSN1TPprVMTNDbiYZCxYbOOl7+AMvyTG2x" crossorigin="anonymous"> <!-- Import JavaScript --> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-gtEjrD/SeCtmISkJkNUaaKMoLD0//ElJ19smozuHV6z3Iehds+3Ulb9Bn9Plx0x4" crossorigin="anonymous"></script> <div class="m-2"> <div id="one"> <div class="first"></div> <span>Hi I am text</span> <div class="second"></div> <div class="third"></div> </div> <button type="button" class="btn btn-primary btn-sm mt-2" id="change-btn">Click to change text</button> </div>
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.