Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

change jquery mobile color swatch dynamically

I want to change a jquery-mobile buttons color swatch dynamically with javascript, but I can't' find a way (except removing and adding all classes and event handlers, but that's to messy).
Whats the best way to do that?

like image 393
Philipp Melab Avatar asked Sep 08 '11 11:09

Philipp Melab


4 Answers

At least in 1.2.0 (1.2.0-rc1) its as simple as (probably it works in minor versions):

$( "#myButton" ).buttonMarkup({theme: 'd'});

not .button('refresh') needed

like image 68
Thomas Nordquist Avatar answered Nov 01 '22 12:11

Thomas Nordquist


Well I did do something like this:

  • http://jsfiddle.net/Sgrve/20/
  • http://jsfiddle.net/Sgrve/28/ (All form elements)

JS (might need minor tweaks to get what you want)

$('input[name=theme-options]').change(function() {
    var currentTheme = $('#home').attr('data-theme');
    var selectedTheme = $(this).val();

    alert('CT '+currentTheme+' ST '+selectedTheme);

    $('.ui-body-' + currentTheme).each(function(){
        $(this).removeClass('ui-body-' + currentTheme).addClass('ui-body-' + selectedTheme);    
    });

    $('.ui-btn-up-' + currentTheme).each(function(){
        $(this).removeClass('ui-btn-up-' + currentTheme).addClass('ui-btn-up-' + selectedTheme);    
    });

    $('.ui-btn-down-' + currentTheme).each(function(){
        $(this).removeClass('ui-btn-down-' + currentTheme).addClass('ui-btn-down-' + selectedTheme);    
    });

    $('#home').find('*[data-theme]').each(function(index){
        $(this).attr('data-theme',selectedTheme);
    });

    $('#home').attr('data-theme', selectedTheme).removeClass('ui-body-' + currentTheme).addClass('ui-body-' + selectedTheme).trigger('create');
});

HTML (might need minor tweaks to get what you want)

<div data-role="page" id="home" data-theme="a"> 
    <div data-role="content">
        <div class="content-primary">             
            <p>
                <div data-role="fieldcontain">
                    <fieldset data-role="controlgroup">
                        <legend>Choose a Theme:</legend>
                        <input type="radio" name="theme-options" id="theme-option-a" value="a" checked="checked" data-theme="a" />
                        <label for="theme-option-a" data-theme="a">Theme A</label>

                        <input type="radio" name="theme-options" id="theme-option-b" value="b" data-theme="b" />
                        <label for="theme-option-b" data-theme="b">Theme B</label>

                        <input type="radio" name="theme-options" id="theme-option-c" value="c" data-theme="c" />
                        <label for="theme-option-c" data-theme="c">Theme C</label>

                        <input type="radio" name="theme-options" id="theme-option-d" value="d" data-theme="d" />
                        <label for="theme-option-d" data-theme="d">Theme D</label>

                        <input type="radio" name="theme-options" id="theme-option-e" value="e" data-theme="e" />
                        <label for="theme-option-e" data-theme="e">Theme E</label>
                    </fieldset>
                </div>
            </p>

            <form action="#" method="get"> 

                <h2>Form elements</h2> 

                <div data-role="fieldcontain"> 
                    <label for="name">Text Input:</label> 
                    <input type="text" name="name" id="name" value=""  /> 
                </div> 

                <div data-role="fieldcontain"> 
                    <label for="textarea">Textarea:</label> 
                    <textarea cols="40" rows="8" name="textarea" id="textarea"></textarea> 
                </div> 

                <div data-role="fieldcontain"> 
                    <label for="search">Search Input:</label> 
                    <input type="search" name="password" id="search" value=""  /> 
                </div> 

                <div data-role="fieldcontain"> 
                    <label for="slider2">Flip switch:</label> 
                    <select name="slider2" id="slider2" data-role="slider"> 
                        <option value="off">Off</option> 
                        <option value="on">On</option> 
                    </select> 
                </div> 

                <div data-role="fieldcontain"> 
                    <label for="slider">Slider:</label> 
                    <input type="range" name="slider" id="slider" value="0" min="0" max="100"  /> 
                </div> 

                <div data-role="fieldcontain"> 
                    <fieldset data-role="controlgroup"> 
                        <legend>Choose as many snacks as you'd like:</legend> 
                        <input type="checkbox" name="checkbox-1a" id="checkbox-1a" class="custom" /> 
                        <label for="checkbox-1a">Cheetos</label> 

                        <input type="checkbox" name="checkbox-2a" id="checkbox-2a" class="custom" /> 
                        <label for="checkbox-2a">Doritos</label> 

                        <input type="checkbox" name="checkbox-3a" id="checkbox-3a" class="custom" /> 
                        <label for="checkbox-3a">Fritos</label> 

                        <input type="checkbox" name="checkbox-4a" id="checkbox-4a" class="custom" /> 
                        <label for="checkbox-4a">Sun Chips</label> 
                    </fieldset> 
                </div> 

                <div data-role="fieldcontain"> 
                    <fieldset data-role="controlgroup" data-type="horizontal"> 
                        <legend>Font styling:</legend> 
                        <input type="checkbox" name="checkbox-6" id="checkbox-6" class="custom" /> 
                        <label for="checkbox-6">b</label> 

                        <input type="checkbox" name="checkbox-7" id="checkbox-7" class="custom" /> 
                        <label for="checkbox-7"><em>i</em></label> 

                        <input type="checkbox" name="checkbox-8" id="checkbox-8" class="custom" /> 
                        <label for="checkbox-8">u</label> 
                    </fieldset> 
                </div> 

                <div data-role="fieldcontain"> 
                    <fieldset data-role="controlgroup"> 
                        <legend>Choose a pet:</legend> 
                        <input type="radio" name="radio-choice-1" id="radio-choice-1" value="choice-1" checked="checked" /> 
                        <label for="radio-choice-1">Cat</label> 

                        <input type="radio" name="radio-choice-1" id="radio-choice-2" value="choice-2"  /> 
                        <label for="radio-choice-2">Dog</label> 

                        <input type="radio" name="radio-choice-1" id="radio-choice-3" value="choice-3"  /> 
                        <label for="radio-choice-3">Hamster</label> 

                        <input type="radio" name="radio-choice-1" id="radio-choice-4" value="choice-4"  /> 
                        <label for="radio-choice-4">Lizard</label> 
                    </fieldset> 
                </div> 

                <div data-role="fieldcontain"> 
                    <fieldset data-role="controlgroup" data-type="horizontal"> 
                        <legend>Layout view:</legend> 
                        <input type="radio" name="radio-choice-b" id="radio-choice-c" value="on" checked="checked" /> 
                        <label for="radio-choice-c">List</label> 
                        <input type="radio" name="radio-choice-b" id="radio-choice-d" value="off" /> 
                        <label for="radio-choice-d">Grid</label> 
                        <input type="radio" name="radio-choice-b" id="radio-choice-e" value="other" /> 
                        <label for="radio-choice-e">Gallery</label> 
                    </fieldset> 
                </div> 

                <div data-role="fieldcontain"> 
                    <label for="select-choice-1" class="select">Choose shipping method:</label> 
                    <select name="select-choice-1" id="select-choice-1"> 
                        <option value="standard">Standard: 7 day</option> 
                        <option value="rush">Rush: 3 days</option> 
                        <option value="express">Express: next day</option> 
                        <option value="overnight">Overnight</option> 
                    </select> 
                </div> 

                <div data-role="fieldcontain"> 
                    <label for="select-choice-3" class="select">Your state:</label> 
                    <select name="select-choice-3" id="select-choice-3"> 
                        <option value="AL">Alabama</option> 
                        <option value="AK">Alaska</option> 
                        <option value="AZ">Arizona</option> 
                        <option value="AR">Arkansas</option> 
                        <option value="CA">California</option> 
                        <option value="CO">Colorado</option> 
                        <option value="CT">Connecticut</option> 
                        <option value="DE">Delaware</option> 
                        <option value="FL">Florida</option> 
                        <option value="GA">Georgia</option> 
                        <option value="HI">Hawaii</option> 
                        <option value="ID">Idaho</option> 
                        <option value="IL">Illinois</option> 
                        <option value="IN">Indiana</option> 
                        <option value="IA">Iowa</option> 
                        <option value="KS">Kansas</option> 
                        <option value="KY">Kentucky</option> 
                        <option value="LA">Louisiana</option> 
                        <option value="ME">Maine</option> 
                        <option value="MD">Maryland</option> 
                        <option value="MA">Massachusetts</option> 
                        <option value="MI">Michigan</option> 
                        <option value="MN">Minnesota</option> 
                        <option value="MS">Mississippi</option> 
                        <option value="MO">Missouri</option> 
                        <option value="MT">Montana</option> 
                        <option value="NE">Nebraska</option> 
                        <option value="NV">Nevada</option> 
                        <option value="NH">New Hampshire</option> 
                        <option value="NJ">New Jersey</option> 
                        <option value="NM">New Mexico</option> 
                        <option value="NY">New York</option> 
                        <option value="NC">North Carolina</option> 
                        <option value="ND">North Dakota</option> 
                        <option value="OH">Ohio</option> 
                        <option value="OK">Oklahoma</option> 
                        <option value="OR">Oregon</option> 
                        <option value="PA">Pennsylvania</option> 
                        <option value="RI">Rhode Island</option> 
                        <option value="SC">South Carolina</option> 
                        <option value="SD">South Dakota</option> 
                        <option value="TN">Tennessee</option> 
                        <option value="TX">Texas</option> 
                        <option value="UT">Utah</option> 
                        <option value="VT">Vermont</option> 
                        <option value="VA">Virginia</option> 
                        <option value="WA">Washington</option> 
                        <option value="WV">West Virginia</option> 
                        <option value="WI">Wisconsin</option> 
                        <option value="WY">Wyoming</option> 
                    </select> 
                </div> 

                <div data-role="fieldcontain"> 
                    <label for="select-choice-a" class="select">Choose shipping method:</label> 
                    <select name="select-choice-a" id="select-choice-a" data-native-menu="false"> 
                        <option>Custom menu example</option> 
                        <option value="standard">Standard: 7 day</option> 
                        <option value="rush">Rush: 3 days</option> 
                        <option value="express">Express: next day</option> 
                        <option value="overnight">Overnight</option> 
                    </select> 
                </div> 

                <div class="ui-body ui-body-b"> 
                    <fieldset class="ui-grid-a"> 
                        <div class="ui-block-a"><button type="submit" data-theme="d">Cancel</button></div> 
                        <div class="ui-block-b"><button type="submit" data-theme="a">Submit</button></div> 
                    </fieldset> 
                </div> 
            </form> 
        </div><!--/content-primary -->        

        <div class="content-secondary"> 

            <div data-role="collapsible" data-collapsed="true" data-theme="b"> 

                <h3>More in this section</h3> 

                <ul data-role="listview" data-theme="c" data-dividertheme="d"> 

                    <li data-role="list-divider">Form elements</li> 
                    <li><a href="docs-forms.html">Form basics</a></li> 
                    <li data-theme="a"><a href="forms-all.html">Form element gallery</a></li> 
                    <li><a href="texts/index.html">Text inputs</a></li> 
                    <li><a href="forms-search.html">Search inputs</a></li> 
                    <li><a href="forms-slider.html">Slider</a></li> 
                    <li><a href="forms-switch.html">Flip toggle switch</a></li> 
                    <li><a href="radiobuttons/index.html">Radio buttons</a></li> 
                    <li><a href="checkboxes/index.html">Checkboxes</a></li> 
                    <li><a href="selects/index.html">Select menus</a></li> 
                    <li><a href="forms-themes.html">Theming forms</a></li> 
                    <li><a href="forms-all-native.html">Native form elements</a></li> 
                    <li><a href="forms-sample.html">Submitting forms</a></li> 
                    <li><a href="plugin-eventsmethods.html">Plugin methods</a></li> 

                </ul> 
            </div> 
        </div>        
    </div>
</div>
like image 10
Phill Pafford Avatar answered Nov 01 '22 14:11

Phill Pafford


What worked for me is:

//set button active
$(this).parent().addClass('ui-btn-active');
//set button inactive
$(this).parent().removeClass('ui-btn-active');

Adding the class 'ui-btn-active' to the parent will set the current button to active and change the data-theme to 'b'. This will not work for any arbitrary swatch though. So you may still need one of the longer solutions mentioned earlier.

like image 3
fosstrack Avatar answered Nov 01 '22 12:11

fosstrack


Yes, looks like there is no way to simply change the theme swatch.

I hacked a simple function to exchange the color by regex:

$.fn.changeColorSwatch = function(theme, type) {
  if (!type) {
    type = 'theme';
  }
  var currentTheme = this.attr('data-' + type);
  if (!currentTheme) {
    currentTheme = 'c';
  }
  this.attr('data-' + type, theme);
  var regex = new RegExp('^ui-(.*)-' + currentTheme + '$');
  var classes = $.extend({}, this[0].classList);
  var i = classes.length;
  while (i--) {
    var match = classes[i].match(regex);
    if (match) {
      this.removeClass(match[0]);
      this.addClass('ui-' + match[1] + '-' + theme);
    }
  }
};

I know, it should use jqmData instead of attr, but the data-theme attribute wasn't changed properly.

like image 1
Philipp Melab Avatar answered Nov 01 '22 13:11

Philipp Melab