Прописать код проще
(dt = new FormData()).append('md', 'v');
dt.append('po', 'stats');
dt.append('wi', sessionStorage.getItem('wi'));
dt.append('rf', sessionStorage.getItem('rf'));
dt.append('id', sessionStorage.getItem('id'));
navigator.sendBeacon("/ajax/", dt);
Каким образом, возможно прописать проще. Напрягает, когда необходимо добавлять каждый параметр по отдельности. Нет бы сразу массивом...
Ответы (2 шт):
Автор решения: OPTIMUS PRIME
→ Ссылка
Подготовьте набор вспомогательных функций:
function storage_get(key) {
return sessionStorage.getItem(key);
}
if (FormData.prototype.appendAll) {
throw new Error("Метод с названием appendAll уже встроен в FormData.\n" +
"Измените название");
}
FormData.prototype.appendAll = function(obj) {
for (let key in obj) {
this.append(key, obj[key]);
}
return this;
};
/***/
let dt = new FormData().appendAll({
'md': 'v',
'po': 'stats',
'wi': storage_get('wi'),
'rf': storage_get('rf'),
'id': storage_get('id'),
});
navigator.sendBeacon("/ajax/", dt);
FormData.prototype.appendAll... У каждой функции есть свойство prototype. Оно хранит объект, свойства которых будут доступны всем объектам-экземплярам, созданным через вызов функции с оператором new → new FormData()
this внутри метода: «объект перед точкой» при вызове метода new FormData().appendAll(), т.е. созданный (new FormData())
Конечно, можно и не лезть в прототип, а записать обычную функцию:
function storage_get(key) {
return sessionStorage.getItem(key);
}
function appendAll(instance, obj) {
for (let key in obj) {
instance.append(key, obj[key]);
}
return instance;
};
/***/
let dt = appendAll(new FormData(), {
'md': 'v',
'po': 'stats',
'wi': storage_get('wi'),
'rf': storage_get('rf'),
'id': storage_get('id'),
});
navigator.sendBeacon("/ajax/", dt);
Автор решения: Alexander Lonberg
→ Ссылка
Не проверял, но думаю должно работать
class CustomFormData extends FormData {
append(name, value) {
super.append(name, value)
return this
}
appendAsSpread(...args) {
for (let arg of args) {
super.append(...arg)
}
return this
}
appendAsMap(map) {
for (let [key, value] of Object.entries(map)) {
super.append(key, value)
}
return this
}
}
const fd = new CustomFormData()
fd.append('name', 'Vasy')
.append('surname', 'Lihachev')
.appendAsSpread(['file', new Blob([1, 2, 3]), 'filename'], ['file2', new Blob([1, 2, 3]), 'filename'])
.appendAsMap({
key1: 'data1',
key2: 'data2'
})
console.log(
[...fd.entries()]
)