mirror of
https://github.com/Hopiu/jquery-mobile.git
synced 2026-03-17 06:20:26 +00:00
133 lines
4.6 KiB
JavaScript
133 lines
4.6 KiB
JavaScript
//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
|
|
//>>description: Enhances and consistently styles text inputs.
|
|
//>>label: Text Inputs
|
|
|
|
define( [ "jquery.mobile.core", "jquery.mobile.widget", "jquery.mobile.degradeInputs", "jquery.mobile.buttonMarkup" ], function() {
|
|
//>>excludeEnd("jqmBuildExclude");
|
|
(function( $, undefined ) {
|
|
|
|
$.widget( "mobile.textinput", $.mobile.widget, {
|
|
options: {
|
|
theme: null,
|
|
initSelector: "input[type='text'], input[type='search'], :jqmData(type='search'), input[type='number'], :jqmData(type='number'), input[type='password'], input[type='email'], input[type='url'], input[type='tel'], textarea, input[type='time'], input[type='date'], input[type='month'], input[type='week'], input[type='datetime'], input[type='datetime-local'], input[type='color'], input:not([type])"
|
|
},
|
|
|
|
_create: function() {
|
|
|
|
var input = this.element,
|
|
o = this.options,
|
|
theme = o.theme || $.mobile.getInheritedTheme( this.element, "c" ),
|
|
themeclass = " ui-body-" + theme,
|
|
focusedEl, clearbtn;
|
|
|
|
$( "label[for='" + input.attr( "id" ) + "']" ).addClass( "ui-input-text" );
|
|
|
|
focusedEl = input.addClass("ui-input-text ui-body-"+ theme );
|
|
|
|
// XXX: Temporary workaround for issue 785 (Apple bug 8910589).
|
|
// Turn off autocorrect and autocomplete on non-iOS 5 devices
|
|
// since the popup they use can't be dismissed by the user. Note
|
|
// that we test for the presence of the feature by looking for
|
|
// the autocorrect property on the input element. We currently
|
|
// have no test for iOS 5 or newer so we're temporarily using
|
|
// the touchOverflow support flag for jQM 1.0. Yes, I feel dirty. - jblas
|
|
if ( typeof input[0].autocorrect !== "undefined" && !$.support.touchOverflow ) {
|
|
// Set the attribute instead of the property just in case there
|
|
// is code that attempts to make modifications via HTML.
|
|
input[0].setAttribute( "autocorrect", "off" );
|
|
input[0].setAttribute( "autocomplete", "off" );
|
|
}
|
|
|
|
|
|
//"search" input widget
|
|
if ( input.is( "[type='search'],:jqmData(type='search')" ) ) {
|
|
|
|
focusedEl = input.wrap( "<div class='ui-input-search ui-shadow-inset ui-btn-corner-all ui-btn-shadow ui-icon-searchfield" + themeclass + "'></div>" ).parent();
|
|
clearbtn = $( "<a href='#' class='ui-input-clear' title='clear text'>clear text</a>" )
|
|
.tap(function( event ) {
|
|
input.val( "" ).focus();
|
|
input.trigger( "change" );
|
|
clearbtn.addClass( "ui-input-clear-hidden" );
|
|
event.preventDefault();
|
|
})
|
|
.appendTo( focusedEl )
|
|
.buttonMarkup({
|
|
icon: "delete",
|
|
iconpos: "notext",
|
|
corners: true,
|
|
shadow: true
|
|
});
|
|
|
|
function toggleClear() {
|
|
setTimeout(function() {
|
|
clearbtn.toggleClass( "ui-input-clear-hidden", !input.val() );
|
|
}, 0);
|
|
}
|
|
|
|
toggleClear();
|
|
|
|
input.bind('paste cut keyup focus change blur', toggleClear);
|
|
|
|
} else {
|
|
input.addClass( "ui-corner-all ui-shadow-inset" + themeclass );
|
|
}
|
|
|
|
input.focus(function() {
|
|
focusedEl.addClass( $.mobile.focusClass );
|
|
})
|
|
.blur(function(){
|
|
focusedEl.removeClass( $.mobile.focusClass );
|
|
});
|
|
|
|
// Autogrow
|
|
if ( input.is( "textarea" ) ) {
|
|
var extraLineHeight = 15,
|
|
keyupTimeoutBuffer = 100,
|
|
keyup = function() {
|
|
var scrollHeight = input[ 0 ].scrollHeight,
|
|
clientHeight = input[ 0 ].clientHeight;
|
|
|
|
if ( clientHeight < scrollHeight ) {
|
|
input.height(scrollHeight + extraLineHeight);
|
|
}
|
|
},
|
|
keyupTimeout;
|
|
|
|
input.keyup(function() {
|
|
clearTimeout( keyupTimeout );
|
|
keyupTimeout = setTimeout( keyup, keyupTimeoutBuffer );
|
|
});
|
|
|
|
// binding to pagechange here ensures that for pages loaded via
|
|
// ajax the height is recalculated without user input
|
|
$( document ).one( "pagechange", keyup );
|
|
|
|
// Issue 509: the browser is not providing scrollHeight properly until the styles load
|
|
if ( $.trim( input.val() ) ) {
|
|
// bind to the window load to make sure the height is calculated based on BOTH
|
|
// the DOM and CSS
|
|
$( window ).load( keyup );
|
|
}
|
|
}
|
|
},
|
|
|
|
disable: function(){
|
|
( this.element.attr( "disabled", true ).is( "[type='search'],:jqmData(type='search')" ) ?
|
|
this.element.parent() : this.element ).addClass( "ui-disabled" );
|
|
},
|
|
|
|
enable: function(){
|
|
( this.element.attr( "disabled", false).is( "[type='search'],:jqmData(type='search')" ) ?
|
|
this.element.parent() : this.element ).removeClass( "ui-disabled" );
|
|
}
|
|
});
|
|
|
|
//auto self-init widgets
|
|
$( document ).bind( "pagecreate create", function( e ){
|
|
$.mobile.textinput.prototype.enhanceWithin( e.target );
|
|
});
|
|
|
|
})( jQuery );
|
|
//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
|
|
});
|
|
//>>excludeEnd("jqmBuildExclude");
|