Как динамически менять тему в jquery mobile?
Я создаю мобильные веб-приложения с использованием jQuery Mobile.
я использую theme-b
для каждой страницы, и я хотел бы динамически переключаться на другую тему для каждой страницы. Как я могу изменить тему динамически?
3 ответа
Вы можете настроить таргетинг на определенные классы, которые относятся к конкретным виджетам, сбросить их классы, а затем добавить выбранный тематический класс:
//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);
Это ни в коем случае не полностью функциональный фрагмент кода, вам нужно будет найти любые другие виджеты, которые вы хотите обновить, когда вы переключите тему и добавите их в код выше. Вы можете легко определить, какие классы имеет каждый виджет, используя FireBug или другую консоль разработчика.
ОБНОВИТЬ
Когда вы принимаете во внимание data-role="list-divider
элементы это становится немного сложнее:
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*/
Вот демо: http://jsfiddle.net/VNXb2/7/
Приведенный выше ответ мне очень помог, я немного изменил его для своих нужд, так как я использую themeroller и ожидаю иметь более 20 тем. Вот что я сделал
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);
})
Теперь, когда я получаю новую тему с сервера через json, я просто вызываю этот метод с новой темой как param.
С уважением Раджеш J
Ответ Раджеша мне очень помог... Но Раджеш, вы пропустили важный класс - 'ui-page-theme-*', поэтому я изменил ваш ответ, и теперь он идеально подходит для jQuery Mobile 1.4.5 (снова)...
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);
});
};