55 votes

Forcer jQuery Mobile à réévaluer les styles / thèmes sur du contenu inséré dynamiquement

Objectif: Charger le contenu HTML via $.ajax, de l'insérer dans le DOM, ont jQuery Mobile appliquer les styles du thème.

Problème: le Contenu est inséré, mais manque de jQuery Mobile de la thématisation.

Code:

$.ajax({
    ...
    success: function(html) {
        $('#container').append(html);
        $('#page').page('refresh', true);
    }
});

Le HTML retourné inclut data-role balises qui jQM devrait style...

<a data-role="button">Do Something</a>

Au lieu d'appliquer les styles comme il se doit, j'obtiens l'erreur suivante:

uncaught exception: aucune de ces méthodes "actualiser" pour le widget de la page d'instance


Au-dessus de code testé à l'aide d' http://code.jquery.com/mobile/latest/jquery.mobile.js


Des questions similaires qui m'ont apporté le message d'erreur ci-dessus:

Toujours mettre à jour la page appropriée de jQuery Mobile styles

JQM (jQueryMobile) ajouter Dynamiquement des éléments ne s'affichent pas correctement et le CSS n'est pas appliquée

jQuery Mobile - création dynamique d'éléments de formulaire

66voto

Larsi Points 1566

Vient de recevoir une réponse à une question similaire, essayez d'utiliser

 .trigger("create")
 

sur l'élément qui obtient le contenu ajouté à.

Voir ici: jQuery Mobile n'applique pas de styles après l'ajout dynamique de contenu.

12voto

douyw Points 971

Si vous ajoutez des éléments à une liste, vous devrez y appeler la méthode refresh () pour mettre à jour les styles et créer les listes imbriquées ajoutées. Par exemple:

 $('#mylist').listview('refresh');
 

Si vous avez besoin de rendre une page dynamique, veuillez lire: " jQuery Mobile et génération de page dynamique ". Exemple de code de cet article:

 // Load the data for a specific category, based on
// the URL passed in. Generate markup for the items in the
// category, inject it into an embedded page, and then make
// that page the current active page.
function showCategory( urlObj, options )
{
    var categoryName = urlObj.hash.replace( /.*category=/, "" ),

        // Get the object that represents the category we
        // are interested in. Note, that at this point we could
        // instead fire off an ajax request to fetch the data, but
        // for the purposes of this sample, it's already in memory.
        category = categoryData[ categoryName ],

        // The pages we use to display our content are already in
        // the DOM. The id of the page we are going to write our
        // content into is specified in the hash before the '?'.
        pageSelector = urlObj.hash.replace( /\?.*$/, "" );

    if ( category ) {
        // Get the page we are going to dump our content into.
        var $page = $( pageSelector ),

            // Get the header for the page.
            $header = $page.children( ":jqmData(role=header)" ),

            // Get the content area element for the page.
            $content = $page.children( ":jqmData(role=content)" ),

            // The markup we are going to inject into the content
            // area of the page.
            markup = "<p>" + category.description + "</p><ul data-role='listview' data-inset='true'>",

            // The array of items for this category.
            cItems = category.items,

            // The number of items in the category.
            numItems = cItems.length;

        // Generate a list item for each item in the category
        // and add it to our markup.
        for ( var i = 0; i < numItems; i++ ) {
            markup += "<li>" + cItems[i].name + "</li>";
        }
        markup += "</ul>";

        // Find the h1 element in our header and inject the name of
        // the category into it.
        $header.find( "h1" ).html( category.name );

        // Inject the category items markup into the content element.
        $content.html( markup );

        // Pages are lazily enhanced. We call page() on the page
        // element to make sure it is always enhanced before we
        // attempt to enhance the listview markup we just injected.
        // Subsequent calls to page() are ignored since a page/widget
        // can only be enhanced once.
        $page.page();

        // Enhance the listview we just injected.
        $content.find( ":jqmData(role=listview)" ).listview();

        // We don't want the data-url of the page we just modified
        // to be the url that shows up in the browser's location field,
        // so set the dataUrl option to the URL for the category
        // we just loaded.
        options.dataUrl = urlObj.href;

        // Now call changePage() and tell it to switch to
        // the page we just modified.
        $.mobile.changePage( $page, options );
    }
}
 

10voto

William Foss Points 81

Si vous utilisez la méthode ajax pour charger du contenu, voici comment j’ai fait fonctionner les fonctionnalités de styling et de jquery mobile. C'est à peu près la même chose que la suggestion ci-dessus, mais pour certaines personnes, vous aimez probablement voir un exemple plus complet.

Voici le code:

 $.ajax({
url: 'url.php',
success: function(data) {    
$("#div").html(data).trigger('create');
}
});
 

1voto

naugtur Points 12383

Dans le Framework jQuery Mobile alpha4.1 et plus tôt cela a été fait à l'aide de la .page() méthode.

Exemple pour montrer il n'y a pas beaucoup de différence:

$( ... lots of HTML ...).appendTo(".ui-content").page();

Plus d'infos: http://jquerymobiledictionary.dyndns.org/faq.html

Pourquoi la nouvelle façon (voir T. Pierre de réponse) a été introduit? .page() a été écrit avec un assumprion que l'élément DOM n'a pas été amélioré avant.

Pour l'amour de découplage tje équipe jQuery Mobile introduit événementiel d'amélioration qui permettra non seulement de permettre le déclenchement de l'événement, mais également de créer de nouveaux widgets pour la nouvelle - data-roles possible sans modifier le code de JQM .page de méthode.

0voto

T. Stone Points 10782

Pour les autres à la recherche d'une réponse à cette question, à compter du 09/06/2011, l'équipe mobile de jQuery a implémenté cette fonctionnalité dans une branche de développement. Selon ce numéro, cela fonctionnera dans ce manoir:

$(".ui-content").append( ... lots of HTML ...).trigger( "enhance" );

https://github.com/jquery/jquery-mobile/issues/1799

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X