mirror of
https://github.com/Hopiu/jquery-mobile.git
synced 2026-05-13 00:53:10 +00:00
- Internally, each plugin self-initializes by binding to the pagecreate event. - Unit tests have been added and adjusted to support some internal changes involved in this commit. - In the process, the portions of the page plugin that were used to enhance the header,content,and footer sections of a native-app style page layout are now located in jquery.mobile.page.sections.js. - No public API options have changed, except that the page plugin no longer has options for keepNative, and degradeInputs, as plugins now handle these internally (keepNative was never documented, and degradeInputs only affected slider, so it lives there now. Page options related to the page sections are now located in the page.sections script, but they are still configurable via the page plugin's options api. - Make, Ant, and index files are updated with a new load order for all JS files.
192 lines
4.7 KiB
JavaScript
192 lines
4.7 KiB
JavaScript
/*
|
|
* jQuery Mobile Framework : "checkboxradio" plugin
|
|
* Copyright (c) jQuery Project
|
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
|
* http://jquery.org/license
|
|
*/
|
|
|
|
(function( $, undefined ) {
|
|
|
|
//auto self-init widgets
|
|
$( document ).bind( "pagecreate", function( e ){
|
|
$( "input[type='checkbox'],input[type='radio']", e.target )
|
|
.not( ":jqmData(role='none'), :jqmData(role='nojs')" )
|
|
.checkboxradio();
|
|
});
|
|
|
|
$.widget( "mobile.checkboxradio", $.mobile.widget, {
|
|
options: {
|
|
theme: null
|
|
},
|
|
_create: function() {
|
|
var self = this,
|
|
input = this.element,
|
|
// NOTE: Windows Phone could not find the label through a selector
|
|
// filter works though.
|
|
label = input.closest( "form,fieldset,:jqmData(role='page')" ).find( "label" ).filter( "[for='" + input[ 0 ].id + "']"),
|
|
inputtype = input.attr( "type" ),
|
|
checkedState = inputtype + "-on",
|
|
uncheckedState = inputtype + "-off",
|
|
icon = input.parents( ":jqmData(type='horizontal')" ).length ? undefined : uncheckedState,
|
|
activeBtn = icon ? "" : " " + $.mobile.activeBtnClass,
|
|
checkedClass = "ui-" + checkedState + activeBtn,
|
|
uncheckedClass = "ui-" + uncheckedState,
|
|
checkedicon = "ui-icon-" + checkedState,
|
|
uncheckedicon = "ui-icon-" + uncheckedState;
|
|
|
|
if ( inputtype !== "checkbox" && inputtype !== "radio" ) {
|
|
return;
|
|
}
|
|
|
|
// Expose for other methods
|
|
$.extend( this, {
|
|
label: label,
|
|
inputtype: inputtype,
|
|
checkedClass: checkedClass,
|
|
uncheckedClass: uncheckedClass,
|
|
checkedicon: checkedicon,
|
|
uncheckedicon: uncheckedicon
|
|
});
|
|
|
|
// If there's no selected theme...
|
|
if( !this.options.theme ) {
|
|
this.options.theme = this.element.jqmData( "theme" );
|
|
}
|
|
|
|
label.buttonMarkup({
|
|
theme: this.options.theme,
|
|
icon: icon,
|
|
shadow: false
|
|
});
|
|
|
|
// Wrap the input + label in a div
|
|
input.add( label )
|
|
.wrapAll( "<div class='ui-" + inputtype + "'></div>" );
|
|
|
|
label.bind({
|
|
vmouseover: function() {
|
|
if ( $( this ).parent().is( ".ui-disabled" ) ) {
|
|
return false;
|
|
}
|
|
},
|
|
|
|
vclick: function( event ) {
|
|
if ( input.is( ":disabled" ) ) {
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
|
|
self._cacheVals();
|
|
|
|
input.prop( "checked", inputtype === "radio" && true || !input.prop( "checked" ) );
|
|
|
|
// Input set for common radio buttons will contain all the radio
|
|
// buttons, but will not for checkboxes. clearing the checked status
|
|
// of other radios ensures the active button state is applied properly
|
|
self._getInputSet().not( input ).prop( "checked", false );
|
|
|
|
self._updateAll();
|
|
return false;
|
|
}
|
|
|
|
});
|
|
|
|
input
|
|
.bind({
|
|
vmousedown: function() {
|
|
this._cacheVals();
|
|
},
|
|
|
|
vclick: function() {
|
|
|
|
var $this = $(this);
|
|
|
|
// Adds checked attribute to checked input when keyboard is used
|
|
if ( $this.is( ":checked" ) ) {
|
|
|
|
$this.prop( "checked", true);
|
|
self._getInputSet().not($this).prop( "checked", false );
|
|
} else {
|
|
|
|
$this.prop( "checked", false );
|
|
}
|
|
|
|
self._updateAll();
|
|
},
|
|
|
|
focus: function() {
|
|
label.addClass( "ui-focus" );
|
|
},
|
|
|
|
blur: function() {
|
|
label.removeClass( "ui-focus" );
|
|
}
|
|
});
|
|
|
|
this.refresh();
|
|
},
|
|
|
|
_cacheVals: function() {
|
|
this._getInputSet().each(function() {
|
|
var $this = $(this);
|
|
|
|
$this.jqmData( "cacheVal", $this.is( ":checked" ) );
|
|
});
|
|
},
|
|
|
|
//returns either a set of radios with the same name attribute, or a single checkbox
|
|
_getInputSet: function(){
|
|
if(this.inputtype == "checkbox") {
|
|
return this.element;
|
|
}
|
|
return this.element.closest( "form,fieldset,:jqmData(role='page')" )
|
|
.find( "input[name='"+ this.element.attr( "name" ) +"'][type='"+ this.inputtype +"']" );
|
|
},
|
|
|
|
_updateAll: function() {
|
|
var self = this;
|
|
|
|
this._getInputSet().each(function() {
|
|
var $this = $(this);
|
|
|
|
if ( $this.is( ":checked" ) || self.inputtype === "checkbox" ) {
|
|
$this.trigger( "change" );
|
|
}
|
|
})
|
|
.checkboxradio( "refresh" );
|
|
},
|
|
|
|
refresh: function() {
|
|
var input = this.element,
|
|
label = this.label,
|
|
icon = label.find( ".ui-icon" );
|
|
|
|
// input[0].checked expando doesn't always report the proper value
|
|
// for checked='checked'
|
|
if ( $( input[ 0 ] ).prop( "checked" ) ) {
|
|
|
|
label.addClass( this.checkedClass ).removeClass( this.uncheckedClass );
|
|
icon.addClass( this.checkedicon ).removeClass( this.uncheckedicon );
|
|
|
|
} else {
|
|
|
|
label.removeClass( this.checkedClass ).addClass( this.uncheckedClass );
|
|
icon.removeClass( this.checkedicon ).addClass( this.uncheckedicon );
|
|
}
|
|
|
|
if ( input.is( ":disabled" ) ) {
|
|
this.disable();
|
|
} else {
|
|
this.enable();
|
|
}
|
|
},
|
|
|
|
disable: function() {
|
|
this.element.prop( "disabled", true ).parent().addClass( "ui-disabled" );
|
|
},
|
|
|
|
enable: function() {
|
|
this.element.prop( "disabled", false ).parent().removeClass( "ui-disabled" );
|
|
}
|
|
});
|
|
})( jQuery );
|