paginacion lista demos jquery html5 jquery-mobile themeroller

lista - ¿Cómo cambiar de tema dinámicamente en jquery mobile?



paginacion jquery mobile (3)

Estoy creando aplicaciones web móviles usando jQuery Mobile.

Estoy usando theme-b para cada página y me gustaría cambiar a otro tema dinámicamente para cada página. ¿Cómo puedo cambiar el tema dinámicamente?


La respuesta de Rajesh me ayudó mucho ... Pero Rajesh, te perdiste una clase importante ---- ''ui-page-theme- *'', así que modifiqué tu respuesta y ahora es perfecta para jQuery Mobile 1.4.5 (de nuevo). ..

var updateTheme = function(newTheme) { var rmbtnClasses = ''''; var rmhfClasses = ''''; var rmbdClassess = ''''; var arr = [''a'', ''b'', ''c'', ''d'', ''e'', ''f'', ''g'', ''h'', ''i'', ''j'', ''k'', ''l'', ''m'', ''n'', ''o'', ''p'', ''q'', ''r'', ''s'']; // I had themes from a to s $.each(arr, function(index, value) { rmbtnClasses = rmbtnClasses + '' ui-btn-up-'' + value + '' ui-btn-hover-'' + value; rmhfClasses = rmhfClasses + '' ui-bar-'' + value; rmbdClassess = rmbdClassess + '' ui-body-'' + value + '' ui-page-theme-''+ value; }); // reset all the buttons widgets $.mobile.activePage.find(''.ui-btn'').not(''.ui-li-divider'').removeClass(rmbtnClasses).addClass(''ui-btn-up-'' + newTheme).attr(''data-theme'', newTheme); // reset the header/footer widgets $.mobile.activePage.find(''.ui-header, .ui-footer'').removeClass(rmhfClasses).addClass(''ui-bar-'' + newTheme).attr(''data-theme'', newTheme); // reset the page widget $.mobile.activePage.removeClass(rmbdClassess).addClass(''ui-body-'' + newTheme + '' ui-page-theme-''+ newTheme).attr(''data-theme'', newTheme); // target the list divider elements, then iterate through them and // change its theme (this is the jQuery Mobile default for // list-dividers) $.mobile.activePage.find(''.ui-li-divider'').each(function(index, obj) { $(this).removeClass(rmhfClasses).addClass(''ui-bar-'' + newTheme).attr(''data-theme'', newTheme); }); };


La respuesta de arriba me ayudó mucho, la modifiqué un poco para mi necesidad, ya que estoy usando el controlador y espero tener más de 20 temas. Esto es lo que he hecho.

function updateTheme(newTheme) { //alert("In refresh"); var rmbtnClasses = ''''; var rmhfClasses = ''''; var rmbdClassess = ''''; var arr = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" ]; $.each(arr,function(index, value){ rmbtnClasses = rmbtnClasses + " ui-btn-up-"+value + " ui-btn-hover-"+value; rmhfClasses = rmhfClasses + " ui-bar-"+value; rmbdClassess = rmbdClassess + " ui-body-"+value; }); // reset all the buttons widgets $.mobile.activePage.find(''.ui-btn'').not(''.ui-li-divider'').removeClass(rmbtnClasses).addClass(''ui-btn-up-'' + newTheme).attr(''data-theme'', newTheme); // reset the header/footer widgets $.mobile.activePage.find(''.ui-header, .ui-footer'').removeClass(rmhfClasses).addClass(''ui-bar-'' + newTheme).attr(''data-theme'', newTheme); // reset the page widget $.mobile.activePage.removeClass(rmbdClassess).addClass(''ui-body-'' + newTheme).attr(''data-theme'', newTheme); // target the list divider elements, then iterate through them and // change its theme (this is the jQuery Mobile default for // list-dividers) $.mobile.activePage.find(''.ui-li-divider'').each(function(index, obj) { $(this).removeClass(rmhfClasses).addClass(''ui-bar-'' + newTheme).attr(''data-theme'',newTheme); })

Ahora, cuando obtengo el nuevo tema del servidor a través de json, llamo a este método con el nuevo tema como parámetro.

Saludos Rajesh J


Puede apuntar a clases específicas relacionadas con widgets específicos, restablecer sus clases y luego agregar la clase temática de su elección:

//set your new theme letter var theme = ''e''; //reset all the buttons widgets $.mobile.activePage.find(''.ui-btn'') .removeClass(''ui-btn-up-a ui-btn-up-b ui-btn-up-c ui-btn-up-d ui-btn-up-e ui-btn-hover-a ui-btn-hover-b ui-btn-hover-c ui-btn-hover-d ui-btn-hover-e'') .addClass(''ui-btn-up-'' + theme) .attr(''data-theme'', theme); //reset the header/footer widgets $.mobile.activePage.find(''.ui-header, .ui-footer'') .removeClass(''ui-bar-a ui-bar-b ui-bar-c ui-bar-d ui-bar-e'') .addClass(''ui-bar-'' + theme) .attr(''data-theme'', theme); //reset the page widget $.mobile.activePage.removeClass(''ui-body-a ui-body-b ui-body-c ui-body-d ui-body-e'') .addClass(''ui-body-'' + theme) .attr(''data-theme'', theme);

http://jsfiddle.net/VNXb2/1/

Esto no es, de ninguna manera, un fragmento de código totalmente funcional, tendrá que encontrar cualquier otro widget que desee actualizar cuando cambie el tema y agregarlo al código anterior. Puede encontrar qué clases tiene cada widget fácilmente utilizando FireBug u otra Consola de desarrollador.

ACTUALIZAR

Cuando se tiene en cuenta el elemento data-role="list-divider , esto se vuelve un poco complicado:

var theme = ''c''; //the only difference between this block of code and the same code above is that it doesn''t target list-dividers by calling: `.not(''.ui-li-divider'')` $.mobile.activePage.find(''.ui-btn'').not(''.ui-li-divider'') .removeClass(''ui-btn-up-a ui-btn-up-b ui-btn-up-c ui-btn-up-d ui-btn-up-e ui-btn-hover-a ui-btn-hover-b ui-btn-hover-c ui-btn-hover-d ui-btn-hover-e'') .addClass(''ui-btn-up-'' + theme) .attr(''data-theme'', theme); //target the list divider elements, then iterate through them to check if they have a theme set, if a theme is set then do nothing, otherwise change its theme to `b` (this is the jQuery Mobile default for list-dividers) $.mobile.activePage.find(''.ui-li-divider'').each(function (index, obj) { if ($(this).parent().attr(''data-divider-theme'') == ''undefined'') { $(this).removeClass(''ui-bar-a ui-bar-b ui-bar-c ui-bar-d ui-bar-e'') .addClass(''ui-bar-b'') .attr(''data-theme'', ''b''); } }) /*The rest of this code example is the same as the above example*/

Aquí hay una demostración: http://jsfiddle.net/VNXb2/7/