import { isTag } from '../utils.js'; | |
/* | |
* 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 | |
*/ | |
const submittableSelector = 'input,select,textarea,keygen'; | |
const r20 = /%20/g; | |
const rCRLF = /\r?\n/g; | |
/** | |
* Encode a set of form elements as a string for submission. | |
* | |
* @category Forms | |
* @example | |
* | |
* ```js | |
* $('<form><input name="foo" value="bar" /></form>').serialize(); | |
* //=> 'foo=bar' | |
* ``` | |
* | |
* @returns The serialized form. | |
* @see {@link https://api.jquery.com/serialize/} | |
*/ | |
export function serialize() { | |
// Convert form elements into name/value objects | |
const arr = this.serializeArray(); | |
// Serialize each element into a key/value string | |
const retArr = arr.map((data) => `${encodeURIComponent(data.name)}=${encodeURIComponent(data.value)}`); | |
// Return the resulting serialization | |
return retArr.join('&').replace(r20, '+'); | |
} | |
/** | |
* Encode a set of form elements as an array of names and values. | |
* | |
* @category Forms | |
* @example | |
* | |
* ```js | |
* $('<form><input name="foo" value="bar" /></form>').serializeArray(); | |
* //=> [ { name: 'foo', value: 'bar' } ] | |
* ``` | |
* | |
* @returns The serialized form. | |
* @see {@link https://api.jquery.com/serializeArray/} | |
*/ | |
export function serializeArray() { | |
// Resolve all form elements from either forms or collections of form elements | |
return this.map((_, elem) => { | |
const $elem = this._make(elem); | |
if (isTag(elem) && elem.name === 'form') { | |
return $elem.find(submittableSelector).toArray(); | |
} | |
return $elem.filter(submittableSelector).toArray(); | |
}) | |
.filter( | |
// Verify elements have a name (`attr.name`) and are not disabled (`:enabled`) | |
'[name!=""]:enabled' + | |
// 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((_, elem) => { | |
var _a; | |
const $elem = this._make(elem); | |
const name = $elem.attr('name'); // We have filtered for elements with a name before. | |
// If there is no value set (e.g. `undefined`, `null`), then default value to empty | |
const value = (_a = $elem.val()) !== null && _a !== void 0 ? _a : ''; | |
// If we have an array of values (e.g. `<select multiple>`), return an array of key/value pairs | |
if (Array.isArray(value)) { | |
return value.map((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` | |
*/ | |
({ name, value: val.replace(rCRLF, '\r\n') })); | |
} | |
// Otherwise (e.g. `<input type="text">`, return only one key/value pair | |
return { name, value: value.replace(rCRLF, '\r\n') }; | |
}) | |
.toArray(); | |
} | |
//# sourceMappingURL=forms.js.map |