1(function ($) { 2 'use strict'; 3 4 Drupal.form_placeholder = {}; 5 6 Drupal.form_placeholder.elementIsSupported = function ($element) { 7 var supportedElement = $element.is('input[type=number], input[type=text], input[type=date], input[type=email], input[type=url], input[type=tel], input[type=password], textarea'); 8 var hasId = $element.attr('id'); 9 return supportedElement && hasId; 10 }; 11 12 Drupal.form_placeholder.placeholderIsSupported = function () { 13 // Opera Mini v7 doesnât support placeholder although its DOM seems to 14 // indicate so. 15 var isOperaMini = Object.prototype.toString.call(window.operamini) == '[object OperaMini]'; 16 return 'placeholder' in document.createElement('input') && !isOperaMini; 17 }; 18 19 Drupal.behaviors.form_placeholder = { 20 attach: function (context, settings) { 21 // In some cases settings after ajax form submit could contain only 22 // settings from response but not all Drupal.settings data. 23 if (!settings.hasOwnProperty('form_placeholder')) { 24 settings = Drupal.settings; 25 } 26 var include = settings.form_placeholder.include; 27 if (include) { 28 include += ', '; 29 } 30 include += '.form-placeholder-include-children *'; 31 include += ', .form-placeholder-include'; 32 var exclude = settings.form_placeholder.exclude; 33 if (exclude) { 34 exclude += ', '; 35 } 36 exclude += '.form-placeholder-exclude-children *'; 37 exclude += ', .form-placeholder-exclude'; 38 39 var required_indicator = settings.form_placeholder.required_indicator; 40 41 $(include, context).not(exclude).each(function () { 42 var $textfield = $(this); 43 var elementSupported = Drupal.form_placeholder.elementIsSupported($textfield); 44 var placeholderSupported = Drupal.form_placeholder.placeholderIsSupported() || $().placeholder; 45 46 // Placeholder is supported. 47 if (elementSupported && placeholderSupported) { 48 var $form = $textfield.closest('form'); 49 var $label = $form.find('label[for=' + this.id + ']'); 50 var placeholder = $.trim($label.text()); 51 52 // Handle required field marker. 53 if ($label.hasClass('form-required')) { 54 switch (required_indicator) { 55 case 'append': 56 $textfield.after('<span class="form-required"></span>'); 57 break; 58 case 'remove': 59 // It's removed anyway, so we don't have to do anything. 60 break; 61 case 'leave': 62 placeholder += ' *'; 63 break; 64 case 'text': 65 placeholder += ' (' + Drupal.t('required') + ')'; 66 break; 67 } 68 } 69 else if (required_indicator === 'optional') { 70 placeholder += ' (' + Drupal.t('optional') + ')'; 71 } 72 73 if (!$textfield.attr('placeholder')) { 74 $textfield.attr('placeholder', placeholder); 75 $label.addClass('visually-hidden'); 76 } 77 78 // Fallback support for older browsers. 79 if (!Drupal.form_placeholder.placeholderIsSupported() && $().placeholder) { 80 $textfield.placeholder(); 81 } 82 } 83 }); 84 } 85 }; 86 87})(jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.