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=email], input[type=url], input[type=tel], input[type=password], textarea, select'); 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 exclude += ', .form-placeholder-processed'; 39 40 var required_indicator = settings.form_placeholder.required_indicator; 41 42 $(include).not(exclude).each(function () { 43 var $textfield = $(this); 44 var elementSupported = Drupal.form_placeholder.elementIsSupported($textfield); 45 var placeholderSupported = Drupal.form_placeholder.placeholderIsSupported() || $().placeholder; 46 47 // Placeholder is supported. 48 if (elementSupported && placeholderSupported) { 49 var $form = $textfield.closest('form'); 50 var $label = $form.find('label[for=' + this.id + ']'); 51 var placeholder = $.trim($label.text()); 52 53 // Handle required field marker. 54 if ($label.hasClass('form-required')) { 55 switch (required_indicator) { 56 case 'append': 57 $textfield.after('<span class="form-required"></span>'); 58 break; 59 case 'remove': 60 // It's removed anyway, so we don't have to do anything. 61 break; 62 case 'leave': 63 placeholder += ' *'; 64 break; 65 case 'text': 66 placeholder += ' (' + Drupal.t('required') + ')'; 67 break; 68 } 69 } 70 else if (required_indicator === 'optional') { 71 placeholder += ' (' + Drupal.t('optional') + ')'; 72 } 73 74 if (!$textfield.attr('placeholder')) { 75 if ($textfield.is('select')) { 76 var $selected = $textfield.find('[value=""]'); 77 $selected.text($label.text()); 78 $selected.prop('disabled', true); 79 } 80 else { 81 $textfield.attr('placeholder', placeholder); 82 } 83 $label.addClass('visually-hidden'); 84 } 85 86 // Fallback support for older browsers. 87 if (!Drupal.form_placeholder.placeholderIsSupported() && $().placeholder) { 88 $textfield.placeholder(); 89 } 90 $textfield.addClass('form-placeholder-processed'); 91 } 92 }); 93 } 94 }; 95 96})(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.