/*! http://mths.be/placeholder v2.0.8 by @mathias */ ;(function(window, document, $) { // opera mini v7 doesn’t support placeholder although its dom seems to indicate so var isoperamini = object.prototype.tostring.call(window.operamini) == '[object operamini]'; var isinputsupported = 'placeholder' in document.createelement('input') && !isoperamini; var istextareasupported = 'placeholder' in document.createelement('textarea') && !isoperamini; var prototype = $.fn; var valhooks = $.valhooks; var prophooks = $.prophooks; var hooks; var placeholder; if (isinputsupported && istextareasupported) { placeholder = prototype.placeholder = function() { return this; }; placeholder.input = placeholder.textarea = true; } else { placeholder = prototype.placeholder = function() { var $this = this; $this .filter((isinputsupported ? 'textarea' : ':input') + '[placeholder]') .not('.placeholder') .bind({ 'focus.placeholder': clearplaceholder, 'blur.placeholder': setplaceholder }) .data('placeholder-enabled', true) .trigger('blur.placeholder'); return $this; }; placeholder.input = isinputsupported; placeholder.textarea = istextareasupported; hooks = { 'get': function(element) { var $element = $(element); var $passwordinput = $element.data('placeholder-password'); if ($passwordinput) { return $passwordinput[0].value; } return $element.data('placeholder-enabled') && $element.hasclass('placeholder') ? '' : element.value; }, 'set': function(element, value) { var $element = $(element); var $passwordinput = $element.data('placeholder-password'); if ($passwordinput) { return $passwordinput[0].value = value; } if (!$element.data('placeholder-enabled')) { return element.value = value; } if (value == '') { element.value = value; // issue #56: setting the placeholder causes problems if the element continues to have focus. if (element != safeactiveelement()) { // we can't use `triggerhandler` here because of dummy text/password inputs :( setplaceholder.call(element); } } else if ($element.hasclass('placeholder')) { clearplaceholder.call(element, true, value) || (element.value = value); } else { element.value = value; } // `set` can not return `undefined`; see http://jsapi.info/jquery/1.7.1/val#l2363 return $element; } }; if (!isinputsupported) { valhooks.input = hooks; prophooks.value = hooks; } if (!istextareasupported) { valhooks.textarea = hooks; prophooks.value = hooks; } $(function() { // look for forms $(document).delegate('form', 'submit.placeholder', function() { // clear the placeholder values so they don't get submitted var $inputs = $('.placeholder', this).each(clearplaceholder); settimeout(function() { $inputs.each(setplaceholder); }, 10); }); }); // clear placeholder values upon page reload $(window).bind('beforeunload.placeholder', function() { $('.placeholder').each(function() { this.value = ''; }); }); } function args(elem) { // return an object of element attributes var newattrs = {}; var rinlinejquery = /^jquery\d+$/; $.each(elem.attributes, function(i, attr) { if (attr.specified && !rinlinejquery.test(attr.name)) { newattrs[attr.name] = attr.value; } }); return newattrs; } function clearplaceholder(event, value) { var input = this; var $input = $(input); if (input.value == $input.attr('placeholder') && $input.hasclass('placeholder')) { if ($input.data('placeholder-password')) { $input = $input.hide().next().show().attr('id', $input.removeattr('id').data('placeholder-id')); // if `clearplaceholder` was called from `$.valhooks.input.set` if (event === true) { return $input[0].value = value; } $input.focus(); } else { input.value = ''; $input.removeclass('placeholder'); input == safeactiveelement() && input.select(); } } } function setplaceholder() { var $replacement; var input = this; var $input = $(input); var id = this.id; if (input.value == '') { if (input.type == 'password') { if (!$input.data('placeholder-textinput')) { try { $replacement = $input.clone().attr({ 'type': 'text' }); } catch(e) { $replacement = $('').attr($.extend(args(this), { 'type': 'text' })); } $replacement .removeattr('name') .data({ 'placeholder-password': $input, 'placeholder-id': id }) .bind('focus.placeholder', clearplaceholder); $input .data({ 'placeholder-textinput': $replacement, 'placeholder-id': id }) .before($replacement); } $input = $input.removeattr('id').hide().prev().attr('id', id).show(); // note: `$input[0] != input` now! } $input.addclass('placeholder'); $input[0].value = $input.attr('placeholder'); } else { $input.removeclass('placeholder'); } } function safeactiveelement() { // avoid ie9 `document.activeelement` of death // https://github.com/mathiasbynens/jquery-placeholder/pull/99 try { return document.activeelement; } catch (exception) {} } }(this, document, jquery));