0

我目前正在网站上工作,我需要在不执行重定向的情况下发送表单。

为此,我已执行以下操作:

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。

问题似乎是new URLSearchParams(new FormData(my_form)).toString(); 返回一个空字符串。

有没有人有同样的问题?

4

2 回答 2

0

请参阅MDN 文档,该文档显示URLSearchParams它非常闪亮和新,因此没有广泛的浏览器支持。

它链接到Google 博客条目和库,而库又链接到polyfill

当然,这是一个第三方库,没有随浏览器一起分发,所以可能不算是vanilla JS,所以你必须从头开始重新实现它。

于 2018-04-15T08:48:40.737 回答
0

所以我最终创建了自己的函数。

感谢昆汀的回答。

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);
}
于 2018-04-16T20:45:47.973 回答