1YUI.add('io-form', function (Y, NAME) { 2 3/** 4* Extends IO to enable HTML form data serialization, when specified 5* in the transaction's configuration object. 6* @module io 7* @submodule io-form 8* @for IO 9*/ 10 11var eUC = encodeURIComponent; 12 13/** 14 * Enumerate through an HTML form's elements collection 15 * and return a string comprised of key-value pairs. 16 * 17 * @method stringify 18 * @static 19 * @param {Node|String} form YUI form node or HTML form id 20 * @param {Object} [options] Configuration options. 21 * @param {Boolean} [options.useDisabled=false] Whether to include disabled fields. 22 * @param {Object|String} [options.extra] Extra values to include. May be a query string or an object with key/value pairs. 23 * @return {String} 24 */ 25Y.IO.stringify = function(form, options) { 26 options = options || {}; 27 28 var s = Y.IO.prototype._serialize({ 29 id: form, 30 useDisabled: options.useDisabled 31 }, 32 options.extra && typeof options.extra === 'object' ? Y.QueryString.stringify(options.extra) : options.extra); 33 34 return s; 35}; 36 37Y.mix(Y.IO.prototype, { 38 /** 39 * Enumerate through an HTML form's elements collection 40 * and return a string comprised of key-value pairs. 41 * 42 * @method _serialize 43 * @private 44 * @param {Object} c 45 * @param {String|Element} c.id YUI form node or HTML form id 46 * @param {Boolean} c.useDisabled `true` to include disabled fields 47 * @param {String} s Key-value data defined in the configuration object. 48 * @return {String} 49 */ 50 _serialize: function(c, s) { 51 var data = [], 52 df = c.useDisabled || false, 53 item = 0, 54 id = (typeof c.id === 'string') ? c.id : c.id.getAttribute('id'), 55 e, f, n, v, d, i, il, j, jl, o; 56 57 if (!id) { 58 id = Y.guid('io:'); 59 c.id.setAttribute('id', id); 60 } 61 62 f = Y.config.doc.getElementById(id); 63 64 if (!f || !f.elements) { 65 return s || ''; 66 } 67 68 // Iterate over the form elements collection to construct the 69 // label-value pairs. 70 for (i = 0, il = f.elements.length; i < il; ++i) { 71 e = f.elements[i]; 72 d = e.disabled; 73 n = e.name; 74 75 if (df ? n : n && !d) { 76 n = eUC(n) + '='; 77 v = eUC(e.value); 78 79 switch (e.type) { 80 // Safari, Opera, FF all default options.value from .text if 81 // value attribute not specified in markup 82 case 'select-one': 83 if (e.selectedIndex > -1) { 84 o = e.options[e.selectedIndex]; 85 data[item++] = n + eUC(o.attributes.value && o.attributes.value.specified ? o.value : o.text); 86 } 87 break; 88 case 'select-multiple': 89 if (e.selectedIndex > -1) { 90 for (j = e.selectedIndex, jl = e.options.length; j < jl; ++j) { 91 o = e.options[j]; 92 if (o.selected) { 93 data[item++] = n + eUC(o.attributes.value && o.attributes.value.specified ? o.value : o.text); 94 } 95 } 96 } 97 break; 98 case 'radio': 99 case 'checkbox': 100 if (e.checked) { 101 data[item++] = n + v; 102 } 103 break; 104 case 'file': 105 // stub case as XMLHttpRequest will only send the file path as a string. 106 case undefined: 107 // stub case for fieldset element which returns undefined. 108 case 'reset': 109 // stub case for input type reset button. 110 case 'button': 111 // stub case for input type button elements. 112 break; 113 case 'submit': 114 default: 115 data[item++] = n + v; 116 } 117 } 118 } 119 120 if (s) { 121 data[item++] = s; 122 } 123 124 return data.join('&'); 125 } 126}, true); 127 128 129}, 'patched-v3.11.0', {"requires": ["io-base", "node-base"]});
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.