1 /*! http://mths.be/placeholder v2.0.7 by @mathias */
\r
2 ;(function(window, document, $) {
\r
4 var isInputSupported = 'placeholder' in document.createElement('input'),
\r
5 isTextareaSupported = 'placeholder' in document.createElement('textarea'),
\r
7 valHooks = $.valHooks,
\r
11 if (isInputSupported && isTextareaSupported) {
\r
13 placeholder = prototype.placeholder = function() {
\r
17 placeholder.input = placeholder.textarea = true;
\r
21 placeholder = prototype.placeholder = function() {
\r
24 .filter((isInputSupported ? 'textarea' : ':input') + '[placeholder]')
\r
25 .not('.placeholder')
\r
27 'focus.placeholder': clearPlaceholder,
\r
28 'blur.placeholder': setPlaceholder
\r
30 .data('placeholder-enabled', true)
\r
31 .trigger('blur.placeholder');
\r
35 placeholder.input = isInputSupported;
\r
36 placeholder.textarea = isTextareaSupported;
\r
39 'get': function(element) {
\r
40 var $element = $(element);
\r
41 return $element.data('placeholder-enabled') && $element.hasClass('placeholder') ? '' : element.value;
\r
43 'set': function(element, value) {
\r
44 var $element = $(element);
\r
45 if (!$element.data('placeholder-enabled')) {
\r
46 return element.value = value;
\r
49 element.value = value;
\r
50 // Issue #56: Setting the placeholder causes problems if the element continues to have focus.
\r
51 if (element != document.activeElement) {
\r
52 // We can't use `triggerHandler` here because of dummy text/password inputs :(
\r
53 setPlaceholder.call(element);
\r
55 } else if ($element.hasClass('placeholder')) {
\r
56 clearPlaceholder.call(element, true, value) || (element.value = value);
\r
58 element.value = value;
\r
60 // `set` can not return `undefined`; see http://jsapi.info/jquery/1.7.1/val#L2363
\r
65 isInputSupported || (valHooks.input = hooks);
\r
66 isTextareaSupported || (valHooks.textarea = hooks);
\r
70 $(document).delegate('form', 'submit.placeholder', function() {
\r
71 // Clear the placeholder values so they don't get submitted
\r
72 var $inputs = $('.placeholder', this).each(clearPlaceholder);
\r
73 setTimeout(function() {
\r
74 $inputs.each(setPlaceholder);
\r
79 // Clear placeholder values upon page reload
\r
80 $(window).bind('beforeunload.placeholder', function() {
\r
81 $('.placeholder').each(function() {
\r
88 function args(elem) {
\r
89 // Return an object of element attributes
\r
91 rinlinejQuery = /^jQuery\d+$/;
\r
92 $.each(elem.attributes, function(i, attr) {
\r
93 if (attr.specified && !rinlinejQuery.test(attr.name)) {
\r
94 newAttrs[attr.name] = attr.value;
\r
100 function clearPlaceholder(event, value) {
\r
103 if (input.value == $input.attr('placeholder') && $input.hasClass('placeholder')) {
\r
104 if ($input.data('placeholder-password')) {
\r
105 $input = $input.hide().next().show().attr('id', $input.removeAttr('id').data('placeholder-id'));
\r
106 // If `clearPlaceholder` was called from `$.valHooks.input.set`
\r
107 if (event === true) {
\r
108 return $input[0].value = value;
\r
113 $input.removeClass('placeholder');
\r
114 input == document.activeElement && input.select();
\r
119 function setPlaceholder() {
\r
123 $origInput = $input,
\r
125 if (input.value == '') {
\r
126 if (input.type == 'password') {
\r
127 if (!$input.data('placeholder-textinput')) {
\r
129 $replacement = $input.clone().attr({ 'type': 'text' });
\r
131 $replacement = $('<input>').attr($.extend(args(this), { 'type': 'text' }));
\r
134 .removeAttr('name')
\r
136 'placeholder-password': true,
\r
137 'placeholder-id': id
\r
139 .bind('focus.placeholder', clearPlaceholder);
\r
142 'placeholder-textinput': $replacement,
\r
143 'placeholder-id': id
\r
145 .before($replacement);
\r
147 $input = $input.removeAttr('id').hide().prev().attr('id', id).show();
\r
148 // Note: `$input[0] != input` now!
\r
150 $input.addClass('placeholder');
\r
151 $input[0].value = $input.attr('placeholder');
\r
153 $input.removeClass('placeholder');
\r
157 }(this, document, jQuery));