|
|
- // https://github.com/jquery/jquery/blob/2.1.3/src/manipulation/var/rcheckableType.js
- // https://github.com/jquery/jquery/blob/2.1.3/src/serialize.js
- var submittableSelector = 'input,select,textarea,keygen',
- r20 = /%20/g,
- rCRLF = /\r?\n/g,
- _ = {
- map: require('lodash.map')
- };
-
- exports.serialize = function() {
- // Convert form elements into name/value objects
- var arr = this.serializeArray();
-
- // Serialize each element into a key/value string
- var retArr = _.map(arr, function(data) {
- return encodeURIComponent(data.name) + '=' + encodeURIComponent(data.value);
- });
-
- // Return the resulting serialization
- return retArr.join('&').replace(r20, '+');
- };
-
- exports.serializeArray = function() {
- // Resolve all form elements from either forms or collections of form elements
- var Cheerio = this.constructor;
- return this.map(function() {
- var elem = this;
- var $elem = Cheerio(elem);
- if (elem.name === 'form') {
- return $elem.find(submittableSelector).toArray();
- } else {
- return $elem.filter(submittableSelector).toArray();
- }
- }).filter(
- // Verify elements have a name (`attr.name`) and are not disabled (`:disabled`)
- '[name!=""]:not(:disabled)'
- // and cannot be clicked (`[type=submit]`) or are used in `x-www-form-urlencoded` (`[type=file]`)
- + ':not(:submit, :button, :image, :reset, :file)'
- // and are either checked/don't have a checkable state
- + ':matches([checked], :not(:checkbox, :radio))'
- // Convert each of the elements to its value(s)
- ).map(function(i, elem) {
- var $elem = Cheerio(elem);
- var name = $elem.attr('name');
- var val = $elem.val();
-
- // If there is no value set (e.g. `undefined`, `null`), then return nothing
- if (val == null) {
- return null;
- } else {
- // If we have an array of values (e.g. `<select multiple>`), return an array of key/value pairs
- if (Array.isArray(val)) {
- return _.map(val, function(val) {
- // We trim replace any line endings (e.g. `\r` or `\r\n` with `\r\n`) to guarantee consistency across platforms
- // These can occur inside of `<textarea>'s`
- return {name: name, value: val.replace( rCRLF, '\r\n' )};
- });
- // Otherwise (e.g. `<input type="text">`, return only one key/value pair
- } else {
- return {name: name, value: val.replace( rCRLF, '\r\n' )};
- }
- }
- // Convert our result to an array
- }).get();
- };
|