Невозможно выполнить ajax-запрос в браузере epihpany
В настоящее время я работаю над сайтом, и мне нужно отправить форму без перенаправления.
Для этого я сделал следующее:
my_form.addEventListener('submit',function (event){
event.preventDefault();
var request = new XMLHttpRequest();
var request_process = function (){
if (request.readyState == 4) {
if(request.status == 200){
window.location.replace('nice_URL');
}else if(request.status == 401){
login_display_error('Authentification error : '+request.responseText);
}else{
alert('Server response, '+request.status+' :'+request.responseText);
}
}
};
var requestURL = new String();
requestURL = "requestURL.com";
request.addEventListener("readystatechange", request_process, false);
request.withCredentials = true;
request.open("POST",requestURL , true);
request.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
var parameters = new URLSearchParams(new FormData(my_form)).toString();
request.send(parameters);
});
Он отлично работает на Google Chrome, Chromium, Firefox Quantum, но не работает с браузером Epiphany и некоторыми старыми браузерами.
Я хочу остаться в ванили JS.
Кажется, проблема в том, что новый URLSearchParams(new FormData(my_form)). ToString(); возвращает пустую строку.
У кого-нибудь была такая же проблема?
2 ответа
Смотрите документацию MDN, которая показывает URLSearchParams
очень блестящий и новый и, следовательно, не имеет широкой поддержки браузера.
Он ссылается на запись в блоге Google и библиотеку, которая, в свою очередь, ссылается на полифилл.
Конечно, это сторонняя библиотека, которая не распространяется вместе с браузером, поэтому, вероятно, не будет считаться ванильным JS, поэтому вам придется переопределить ее с нуля.
В итоге я создал свою собственную функцию.
Спасибо Квентин за ваш ответ.
function serialize (form, expected){
var encoded = new String();
var elements = form.elements;
var i;
for(i=0; i<elements.length; i++){
let e = elements[i];
if (expected.includes(e.name)){
if (e.multiple){
let options = e.options;
let j;
for(j=0; j<options.length;j++){
let o = options[j];
if(o.selected && !o.disabled){
encoded = encoded.concat('&',e.name,'=',o.value);
}
}
}else{
encoded = encoded.concat('&',e.name,'=',e.value);
}
}
}
return encoded.slice(1);
}