A wrapper for asynchronous HTTP requests supporting XMLHttpRequest, JSONP, CORS, and CommonJS Promises
—
Comprehensive form handling and data serialization utilities for converting form elements to various formats, processing query strings, and managing request data. These utilities work independently of the main request functions and are available as static methods on the reqwest object.
Serializes form elements to various formats (query strings, objects, arrays) with flexible configuration options.
/**
* Serializes form elements to various formats
* @param {Element|NodeList|Array} elements - Form elements to serialize
* @param {Object} options - Serialization options
* @returns {string|Object|Array} Serialized data in requested format
*/
reqwest.serialize(elements, options);
interface SerializeOptions {
type?: string; // 'map' | 'array' | undefined (query string)
}Usage Examples:
// Query string format (default)
const form = document.getElementById('myform');
const queryString = reqwest.serialize(form);
// Result: "name=John&email=john@example.com&age=25"
// Object format
const dataObject = reqwest.serialize(form, {type: 'map'});
// Result: { name: "John", email: "john@example.com", age: "25" }
// Array format
const dataArray = reqwest.serialize(form, {type: 'array'});
// Result: [
// { name: "name", value: "John" },
// { name: "email", value: "john@example.com" },
// { name: "age", value: "25" }
// ]
// Serialize specific elements
const inputs = document.querySelectorAll('input[type=text]');
const textData = reqwest.serialize(inputs);
// Serialize mixed element types
const elements = [
document.getElementById('name'),
document.getElementById('email'),
document.querySelector('select[name=country]')
];
const mixedData = reqwest.serialize(elements, {type: 'map'});Serializes form elements to an array of name/value pairs, providing a normalized format for form data.
/**
* Serializes form elements to array of name/value pairs
* @param {Element|NodeList|Array} elements - Form elements to serialize
* @returns {Array} Array of {name, value} objects
*/
reqwest.serializeArray(elements);Usage Examples:
// Serialize entire form
const form = document.getElementById('registrationForm');
const formArray = reqwest.serializeArray(form);
// Result: [
// { name: "username", value: "alice" },
// { name: "email", value: "alice@example.com" },
// { name: "newsletter", value: "on" }
// ]
// Process array data
formArray.forEach(function(field) {
console.log(`Field ${field.name}: ${field.value}`);
});
// Convert to object if needed
const formObject = {};
reqwest.serializeArray(form).forEach(function(field) {
formObject[field.name] = field.value;
});
// Filter specific fields
const emailFields = reqwest.serializeArray(form)
.filter(field => field.name.includes('email'));Converts JavaScript objects to URL query strings with support for nested objects and array serialization.
/**
* Converts object to URL query string
* @param {Object} object - Data object to serialize
* @param {boolean} traditional - Use traditional array serialization
* @returns {string} URL query string
*/
reqwest.toQueryString(object, traditional);Usage Examples:
// Simple object
const data = { name: 'John', age: 30, active: true };
const query = reqwest.toQueryString(data);
// Result: "name=John&age=30&active=true"
// Object with arrays (modern style, default)
const searchData = {
query: 'javascript',
tags: ['tutorial', 'beginner', 'web'],
author: 'john'
};
const modernQuery = reqwest.toQueryString(searchData);
// Result: "query=javascript&tags[]=tutorial&tags[]=beginner&tags[]=web&author=john"
// Object with arrays (traditional style)
const traditionalQuery = reqwest.toQueryString(searchData, true);
// Result: "query=javascript&tags=tutorial&tags=beginner&tags=web&author=john"
// Nested objects
const complexData = {
user: {
name: 'Alice',
profile: {
age: 25,
city: 'New York'
}
},
preferences: ['email', 'sms']
};
const nestedQuery = reqwest.toQueryString(complexData);
// Result: "user[name]=Alice&user[profile][age]=25&user[profile][city]=New%20York&preferences[]=email&preferences[]=sms"
// Use in requests
reqwest({
url: '/api/search?' + reqwest.toQueryString({
q: 'javascript frameworks',
limit: 10,
sort: 'relevance'
}),
success: function(results) {
console.log('Search results:', results);
}
});Gets the callback prefix used for generating unique JSONP callback function names.
/**
* Gets the JSONP callback prefix used for generating callback names
* @returns {string} Callback prefix string used for JSONP requests
*/
reqwest.getcallbackPrefix();Usage Examples:
// Get the current callback prefix
const prefix = reqwest.getcallbackPrefix();
console.log('Callback prefix:', prefix);
// Result: "reqwest_1234567890123" (includes timestamp)
// Understanding JSONP callback naming
reqwest({
url: '/api/data',
type: 'jsonp',
jsonpCallback: 'callback'
});
// This will generate a callback function named something like:
// reqwest_1234567890123_0, reqwest_1234567890123_1, etc.
// For debugging JSONP requests
function debugJsonpRequest(url) {
const prefix = reqwest.getcallbackPrefix();
console.log('JSONP requests will use prefix:', prefix);
reqwest({
url: url,
type: 'jsonp',
success: function(data) {
console.log('JSONP callback executed successfully');
}
});
}When used with the Ender framework, these utilities are available as jQuery-style methods:
// Available when reqwest is used with Ender
$.serialize(elements, options); // Alias for reqwest.serialize
$.serializeArray(elements); // Alias for reqwest.serializeArray
$.toQueryString(object, traditional); // Alias for reqwest.toQueryString
// jQuery-style element methods
$(form).serialize(); // Serialize form as query string
$(form).serialize({type: 'array'}); // Serialize form as array
$(form).serialize({type: 'map'}); // Serialize form as object
$(form).serializeArray(); // Serialize form as arrayUsage Examples with Ender:
// Form serialization
$('#contactForm').serialize(); // Query string
$('#contactForm').serialize({type: 'map'}); // Object
$('#contactForm').serializeArray(); // Array
// Specific element selection
$('input[type=text], select').serialize({type: 'map'});
$('#myform input[name=categories]').serialize({type: 'map'})['categories'];
// Object to query string
$.toQueryString({
search: 'ajax library',
category: 'javascript',
tags: ['xhr', 'promises']
});// Traditional form submission
const form = document.getElementById('userForm');
form.addEventListener('submit', function(e) {
e.preventDefault();
reqwest({
url: '/api/users',
method: 'POST',
data: reqwest.serialize(form, {type: 'map'}),
success: function(response) {
console.log('User created:', response);
}
});
});
// Dynamic form validation
const formData = reqwest.serializeArray(form);
const errors = [];
formData.forEach(function(field) {
if (field.name === 'email' && !field.value.includes('@')) {
errors.push('Invalid email format');
}
if (field.name === 'age' && parseInt(field.value) < 18) {
errors.push('Must be 18 or older');
}
});// Build search URLs
function buildSearchUrl(baseUrl, filters) {
const queryString = reqwest.toQueryString(filters);
return baseUrl + (queryString ? '?' + queryString : '');
}
const searchUrl = buildSearchUrl('/api/products', {
category: 'electronics',
price_min: 100,
price_max: 500,
brands: ['Apple', 'Samsung'],
in_stock: true
});
// Result: "/api/products?category=electronics&price_min=100&price_max=500&brands[]=Apple&brands[]=Samsung&in_stock=true"
// Pagination URLs
function buildPaginationUrl(baseUrl, currentParams, page) {
const params = Object.assign({}, currentParams, { page: page });
return baseUrl + '?' + reqwest.toQueryString(params);
}// Convert form data for API
function processFormForApi(form) {
const formArray = reqwest.serializeArray(form);
const processedData = {};
formArray.forEach(function(field) {
// Convert numeric strings to numbers
if (field.name.includes('_number') || field.name === 'age') {
processedData[field.name] = parseInt(field.value);
}
// Convert boolean strings
else if (field.value === 'true' || field.value === 'false') {
processedData[field.name] = field.value === 'true';
}
// Handle arrays (checkboxes, multi-selects)
else if (processedData[field.name]) {
if (!Array.isArray(processedData[field.name])) {
processedData[field.name] = [processedData[field.name]];
}
processedData[field.name].push(field.value);
}
else {
processedData[field.name] = field.value;
}
});
return processedData;
}
// Use processed data in request
const form = document.getElementById('advancedForm');
const apiData = processFormForApi(form);
reqwest({
url: '/api/advanced-endpoint',
method: 'POST',
data: apiData,
success: function(response) {
console.log('Processed data submitted:', response);
}
});// Handle various form element types
function getFormElements(form) {
const elements = [];
// Modern browsers
if (form.elements) {
return Array.from(form.elements);
}
// Legacy browser support
const inputs = form.getElementsByTagName('input');
const selects = form.getElementsByTagName('select');
const textareas = form.getElementsByTagName('textarea');
for (let i = 0; i < inputs.length; i++) elements.push(inputs[i]);
for (let i = 0; i < selects.length; i++) elements.push(selects[i]);
for (let i = 0; i < textareas.length; i++) elements.push(textareas[i]);
return elements;
}
// Use with reqwest utilities
const form = document.getElementById('compatForm');
const elements = getFormElements(form);
const serializedData = reqwest.serialize(elements, {type: 'map'});Install with Tessl CLI
npx tessl i tessl/npm-reqwest