Created
March 21, 2016 08:41
-
-
Save syhily/9a04d4c0aa93a2b971fb to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| ;(function(window, document, $) { | |
| var isInputSupported = 'placeholder' in document.createElement('input'), | |
| isTextareaSupported = 'placeholder' in document.createElement('textarea'), | |
| prototype = $.fn, | |
| valHooks = $.valHooks, | |
| hooks, | |
| 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); | |
| return $element.data('placeholder-enabled') && $element.hasClass('placeholder') ? '' : element.value; | |
| }, | |
| 'set': function(element, value) { | |
| var $element = $(element); | |
| 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 != document.activeElement) { | |
| // 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; | |
| } | |
| }; | |
| isInputSupported || (valHooks.input = hooks); | |
| isTextareaSupported || (valHooks.textarea = 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 = {}, | |
| 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, | |
| $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 == document.activeElement && input.select(); | |
| } | |
| } | |
| } | |
| function setPlaceholder() { | |
| var $replacement, | |
| input = this, | |
| $input = $(input), | |
| $origInput = $input, | |
| 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 = $('<input>').attr($.extend(args(this), { 'type': 'text' })); | |
| } | |
| $replacement | |
| .removeAttr('name') | |
| .data({ | |
| 'placeholder-password': true, | |
| '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'); | |
| } | |
| } | |
| }(this, document, jQuery)); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment