Jquery Mobile: Dynamically change the text of the header of a collapsible div?
Asked Answered
A

4

8
<div data-role="collapsible" data-content-theme="e" id="collapsePlace">
    <h3>Place:</h3>
    <!--things...-->
</div>

How can I dynamically change the text of the <h3> header ('Place:') in the collapsible div?

I tried:

$('#collapsePlace').children('h3').text('new text');

And it changes the text - but loses all of the styling!

Aminaamine answered 22/10, 2011 at 3:33 Comment(1)
I asked a similar question and I think the answer I was provided is better: #38978602Casino
N
5

The actual HTML structure of a collapsible in jQuery Mobile 1.0RC2 is the following (after the framework has made its pass on the HTML):

<div id="collapsePlace" data-content-theme="e" data-role="collapsible" class="ui-collapsible ui-collapsible-collapsed">
    <h3 class="ui-collapsible-heading ui-collapsible-heading-collapsed">
        <a class="ui-collapsible-heading-toggle ui-btn ui-btn-icon-left ui-corner-top ui-corner-bottom ui-btn-up-c" href="#" data-theme="c">
            <span aria-hidden="true" class="ui-btn-inner ui-corner-top ui-corner-bottom">
                <span class="ui-btn-text">Place:
                    <span class="ui-collapsible-heading-status"> click to expand contents</span>
                </span>
                <span class="ui-icon ui-icon-plus ui-icon-shadow"></span>
            </span>
        </a>
    </h3>
    <div class="ui-collapsible-content ui-body-e ui-collapsible-content-collapsed" aria-hidden="true">
        <!--things...-->
    </div>
</div>

The nested <span> element within the <span class="ui-btn-text"> element makes this a little tricky. If you want to preserve the structure of the <span class="ui-btn-text"> element you will need to save the nested <span> element, overwrite it, and then replace it:

//run code on document.ready
$(function () {
    var num = 1;
    //add click handler to link to increment the collapsible's header each click
    $('a').bind('click', function () {
        //cache the `<span class="ui-btn-text">` element and its child
        var $btn_text  = $('#collapsePlace').find('.ui-btn-text'),
            $btn_child = $btn_text.find('.ui-collapsible-heading-status');
        //overwrite the header text, then append its child to restore the previous structure
        $btn_text.text('New String (' + num++ + ')').append($btn_child);
    });
});

Here is a jsfiddle of the above solution: http://jsfiddle.net/jasper/4DAfn/2/

Nephrosis answered 23/10, 2011 at 0:1 Comment(0)
P
6

In 1.3.2, the following seem to work:

<div id="MyID" data-role="collapsible" >    
    <h3><span id="MyHeaderID">My Header</span></h3>    
    <!-- My Content --> 
</div>

JQuery:

$("#MyID h3 #MyHeaderID").text("Your New Header");

Happy Coding!

Pricecutting answered 17/12, 2013 at 20:28 Comment(1)
Was searching for this. Great!Flowered
N
5

The actual HTML structure of a collapsible in jQuery Mobile 1.0RC2 is the following (after the framework has made its pass on the HTML):

<div id="collapsePlace" data-content-theme="e" data-role="collapsible" class="ui-collapsible ui-collapsible-collapsed">
    <h3 class="ui-collapsible-heading ui-collapsible-heading-collapsed">
        <a class="ui-collapsible-heading-toggle ui-btn ui-btn-icon-left ui-corner-top ui-corner-bottom ui-btn-up-c" href="#" data-theme="c">
            <span aria-hidden="true" class="ui-btn-inner ui-corner-top ui-corner-bottom">
                <span class="ui-btn-text">Place:
                    <span class="ui-collapsible-heading-status"> click to expand contents</span>
                </span>
                <span class="ui-icon ui-icon-plus ui-icon-shadow"></span>
            </span>
        </a>
    </h3>
    <div class="ui-collapsible-content ui-body-e ui-collapsible-content-collapsed" aria-hidden="true">
        <!--things...-->
    </div>
</div>

The nested <span> element within the <span class="ui-btn-text"> element makes this a little tricky. If you want to preserve the structure of the <span class="ui-btn-text"> element you will need to save the nested <span> element, overwrite it, and then replace it:

//run code on document.ready
$(function () {
    var num = 1;
    //add click handler to link to increment the collapsible's header each click
    $('a').bind('click', function () {
        //cache the `<span class="ui-btn-text">` element and its child
        var $btn_text  = $('#collapsePlace').find('.ui-btn-text'),
            $btn_child = $btn_text.find('.ui-collapsible-heading-status');
        //overwrite the header text, then append its child to restore the previous structure
        $btn_text.text('New String (' + num++ + ')').append($btn_child);
    });
});

Here is a jsfiddle of the above solution: http://jsfiddle.net/jasper/4DAfn/2/

Nephrosis answered 23/10, 2011 at 0:1 Comment(0)
S
2

A simple solution would be

$('#collapsePlace .ui-btn-text').text("hello ");

Check out the fiddle at http://jsfiddle.net/AQZQs/1/

Stortz answered 18/2, 2013 at 6:0 Comment(2)
That will remove the HTML from the .ui-btn-text element shown in the question's HTML.Nephrosis
for later jQuery mobile versions (tested with v 1.4.3), replace ".ui-btn-text" with ".ui-collapsible-heading-toggle"Unifoliolate
C
0

An easy option is to give the h3 a custom id/class, for example:

<div data-role="collapsible" data-content-theme="e" id="collapsePlace">
    <h3 id='h3Text'>Place:</h3>
    <!--things...-->
</div>

That way you only will need to do:

$('#collapsePlace #h3Text').text('new text');
Cubiform answered 10/12, 2012 at 20:15 Comment(2)
I don't know whether it worked for previous version of JQM but it doesn't work for 1.2.0Stortz
as you can see in this fiddle, style are getting removed though the text changes. jsfiddle.net/AQZQsStortz

© 2022 - 2024 — McMap. All rights reserved.