123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281 |
- /*!
- * jQuery Placeholder Plugin v2.3.1
- * https://github.com/mathiasbynens/jquery-placeholder
- *
- * Copyright 2011, 2015 Mathias Bynens
- * Released under the MIT license
- */
- (function(factory) {
- if (typeof define === 'function' && define.amd) {
- // AMD
- define(['jquery'], factory);
- } else if (typeof module === 'object' && module.exports) {
- factory(require('jquery'));
- } else {
- // Browser globals
- factory(jQuery);
- }
- }(function($) {
- /****
- * Allows plugin behavior simulation in modern browsers for easier debugging.
- * When setting to true, use attribute "placeholder-x" rather than the usual "placeholder" in your inputs/textareas
- * i.e. <input type="text" placeholder-x="my placeholder text" />
- */
- var debugMode = false;
- // 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 && !debugMode;
- var isTextareaSupported = 'placeholder' in document.createElement('textarea') && !isOperaMini && !debugMode;
- var valHooks = $.valHooks;
- var propHooks = $.propHooks;
- var hooks;
- var placeholder;
- var settings = {};
- if (isInputSupported && isTextareaSupported) {
- placeholder = $.fn.placeholder = function() {
- return this;
- };
- placeholder.input = true;
- placeholder.textarea = true;
- } else {
- placeholder = $.fn.placeholder = function(options) {
- var defaults = {customClass: 'placeholder'};
- settings = $.extend({}, defaults, options);
- return this.filter((isInputSupported ? 'textarea' : ':input') + '[' + (debugMode ? 'placeholder-x' : 'placeholder') + ']')
- .not('.'+settings.customClass)
- .not(':radio, :checkbox, [type=hidden]')
- .bind({
- 'focus.placeholder': clearPlaceholder,
- 'blur.placeholder': setPlaceholder
- })
- .data('placeholder-enabled', true)
- .trigger('blur.placeholder');
- };
- 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(settings.customClass) ? '' : element.value;
- },
- 'set': function(element, value) {
- var $element = $(element);
- var $replacement;
- var $passwordInput;
- if (value !== '') {
- $replacement = $element.data('placeholder-textinput');
- $passwordInput = $element.data('placeholder-password');
- if ($replacement) {
- clearPlaceholder.call($replacement[0], true, value) || (element.value = value);
- $replacement[0].value = value;
- } else if ($passwordInput) {
- clearPlaceholder.call(element, true, value) || ($passwordInput[0].value = value);
- element.value = value;
- }
- }
- if (!$element.data('placeholder-enabled')) {
- element.value = value;
- return $element;
- }
- if (value === '') {
-
- element.value = value;
-
- // 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(settings.customClass)) {
- clearPlaceholder.call(element);
- }
- 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 = $('.'+settings.customClass, this).each(function() {
- clearPlaceholder.call(this, true, '');
- });
- setTimeout(function() {
- $inputs.each(setPlaceholder);
- }, 10);
- });
- });
- // Clear placeholder values upon page reload
- $(window).bind('beforeunload.placeholder', function() {
- var clearPlaceholders = true;
- try {
- // Prevent IE javascript:void(0) anchors from causing cleared values
- if (document.activeElement.toString() === 'javascript:void(0)') {
- clearPlaceholders = false;
- }
- } catch (exception) { }
- if (clearPlaceholders) {
- $('.'+settings.customClass).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 = $(this);
-
- if (input.value === $input.attr((debugMode ? 'placeholder-x' : 'placeholder')) && $input.hasClass(settings.customClass)) {
-
- input.value = '';
- $input.removeClass(settings.customClass);
- if ($input.data('placeholder-password')) {
- $input = $input.hide().nextAll('input[type="password"]:first').show().attr('id', $input.removeAttr('id').data('placeholder-id'));
-
- // If `clearPlaceholder` was called from `$.valHooks.input.set`
- if (event === true) {
- $input[0].value = value;
- return value;
- }
- $input.focus();
- } else {
- input == safeActiveElement() && input.select();
- }
- }
- }
- function setPlaceholder(event) {
- var $replacement;
- var input = this;
- var $input = $(this);
- var id = input.id;
- // If the placeholder is activated, triggering blur event (`$input.trigger('blur')`) should do nothing.
- if (event && event.type === 'blur' && $input.hasClass(settings.customClass)) {
- return;
- }
- if (input.value === '') {
- if (input.type === 'password') {
- if (!$input.data('placeholder-textinput')) {
-
- try {
- $replacement = $input.clone().prop({ 'type': 'text' });
- } catch(e) {
- $replacement = $('<input>').attr($.extend(args(this), { 'type': 'text' }));
- }
- $replacement
- .removeAttr('name')
- .data({
- 'placeholder-enabled': true,
- 'placeholder-password': $input,
- 'placeholder-id': id
- })
- .bind('focus.placeholder', clearPlaceholder);
- $input
- .data({
- 'placeholder-textinput': $replacement,
- 'placeholder-id': id
- })
- .before($replacement);
- }
- input.value = '';
- $input = $input.removeAttr('id').hide().prevAll('input[type="text"]:first').attr('id', $input.data('placeholder-id')).show();
- } else {
-
- var $passwordInput = $input.data('placeholder-password');
- if ($passwordInput) {
- $passwordInput[0].value = '';
- $input.attr('id', $input.data('placeholder-id')).show().nextAll('input[type="password"]:last').hide().removeAttr('id');
- }
- }
- $input.addClass(settings.customClass);
- $input[0].value = $input.attr((debugMode ? 'placeholder-x' : 'placeholder'));
- } else {
- $input.removeClass(settings.customClass);
- }
- }
- function safeActiveElement() {
- // Avoid IE9 `document.activeElement` of death
- try {
- return document.activeElement;
- } catch (exception) {}
- }
- }));
|