양식 제출과 같은 JavaScript 게시물 요청


1530

브라우저를 다른 페이지로 보내려고합니다. GET 요청을 원한다면

document.location.href = 'http://example.com/q=a';

그러나 POST 요청을 사용하지 않으면 액세스하려는 리소스가 제대로 응답하지 않습니다. 이것이 동적으로 생성되지 않으면 HTML을 사용할 수 있습니다

<form action="http://example.com/" method="POST">
  <input type="hidden" name="q" value="a">
</form>

그런 다음 DOM에서 양식을 제출하십시오.

하지만 실제로 말할 수있는 JavaScript 코드를 원합니다

post_to_url('http://example.com/', {'q':'a'});

최고의 크로스 브라우저 구현은 무엇입니까?

편집하다

명확하지 않아서 죄송합니다. 양식을 제출하는 것처럼 브라우저의 위치를 ​​변경하는 솔루션이 필요합니다. XMLHttpRequest 로 이것이 가능하다면 분명하지 않습니다. 그리고 이것은 비동기식이거나 XML을 사용해서는 안되므로 Ajax가 답이 아닙니다.


1
다른 스레드에서 언급했듯이 POST 또는 GET 메소드와 함께 작동하는 jquery ".redirect"플러그인이 있습니다. 숨겨진 입력이있는 양식을 작성하여 제출합니다. 예 : $ .redirect ( 'demo.php', { 'arg1': 'value1', 'arg2': 'value2'}); github.com/mgalante/jquery.redirect/blob/master/…
OG Sean

답변:


2144

<input>양식에서 s를 동적으로 작성 하여 제출

/**
 * sends a request to the specified url from a form. this will change the window location.
 * @param {string} path the path to send the post request to
 * @param {object} params the paramiters to add to the url
 * @param {string} [method=post] the method to use on the form
 */

function post(path, params, method='post') {

  // The rest of this code assumes you are not using a library.
  // It can be made less wordy if you use one.
  const form = document.createElement('form');
  form.method = method;
  form.action = path;

  for (const key in params) {
    if (params.hasOwnProperty(key)) {
      const hiddenField = document.createElement('input');
      hiddenField.type = 'hidden';
      hiddenField.name = key;
      hiddenField.value = params[key];

      form.appendChild(hiddenField);
    }
  }

  document.body.appendChild(form);
  form.submit();
}

예:

post('/contact/', {name: 'Johnny Bravo'});

편집 : 이것은 너무 많이 찬성했기 때문에 사람들이 이것을 많이 복사하여 붙여 넣을 것이라고 생각합니다. 그래서 hasOwnProperty부주의 한 버그를 수정하기 위해 수표를 추가했습니다 .


10
데이터 매개 변수의 배열은 어떻습니까? Jquery post ()는 "data : {array : [1, 2, 3]}"을? array = 1 & array = 2 & array = 3으로 해석합니다. Whis 코드는 또 다른 결과를 제공합니다.
Scit

18
경고 : 다수의 업 보트에도 불구하고이 솔루션은 제한적이며 폼 내부의 배열 또는 중첩 된 개체를 처리하지 않습니다. 그렇지 않으면 훌륭한 답변입니다.
emragins

3
놀랍게도 이것은 jquery가 아닌 html 또는 javascript 중 하나에서 기본적으로 지원되지 않습니다 .. 이것을 코딩해야합니다.
eugene

14
@mricci이 스 니펫의 요점은 브라우저를 액션으로 지정된 새 URL로 리디렉션하는 것입니다. 같은 페이지에 머무르면 전통적인 AJAX를 사용하여 데이터를 게시 할 수 있습니다. 브라우저가 새 페이지로 이동해야하므로 현재 페이지의 DOM 내용은 중요하지 않습니다.
Ken Bellows

6
Python, Django 및 Flask 사용자는 "제한되지 않은 (403). CSRF 확인에 실패했습니다. 요청이 중단되었습니다."라는 오류가 표시됩니다. 이 경우 다음과 같이 csrf 토큰을 전달해야합니다. post ( '/ contact /', {name : 'Johnny Bravo', csrfmiddlewaretoken : $ ( "# csrf_token"). val ()});
Davidson Lima

129

이것은 jQuery를 사용하여 선택한 답변의 버전입니다 .

// Post to the provided URL with the specified parameters.
function post(path, parameters) {
    var form = $('<form></form>');

    form.attr("method", "post");
    form.attr("action", path);

    $.each(parameters, function(key, value) {
        var field = $('<input></input>');

        field.attr("type", "hidden");
        field.attr("name", key);
        field.attr("value", value);

        form.append(field);
    });

    // The form needs to be a part of the document in
    // order for us to be able to submit it.
    $(document.body).append(form);
    form.submit();
}

2
고정 : 이제 document.body에 추가
Ryan Delucchi

7
배열 및 객체를 지원하도록 이것을 약간 수정했습니다. gist.github.com/hom3chuk/692bf12fe7dac2486212
НЛО

3
값에 dangeours xml 문자가 포함되어 있으면 ASP.NET에서 작동하지 않습니다. encodeUriComponent (value)가 필요합니다. 그런 다음 서버 측에서도 UrlDecode가 필요합니다.
Stefan Steiger

당신의 요구가 단순하다면,이 기능은 불필요합니다. 이 하나의 라이너로 충분합니다.$("<form method='POST' action='https://example.com'><input type='hidden' name='q' value='a'/></form>").appendTo("body").submit();
rinogo

71

@Aaron 답변의 간단하고 빠른 구현 :

document.body.innerHTML += '<form id="dynForm" action="http://example.com/" method="post"><input type="hidden" name="q" value="a"></form>';
document.getElementById("dynForm").submit();

물론 Prototype 또는 jQuery 와 같은 JavaScript 프레임 워크를 사용해야합니다 .


6
현재 브라우저 창 / 탭에 웹 페이지가로드되지 않고이 작업을 수행 할 수 있습니까?
pbreitenbach

54

이 답변에createElement 제공된 함수를 사용하면 다음 과 같이 정상적으로 작성된 요소 의 name 속성IE에서 끊어 지기 때문에 필요 합니다 .document.createElement

function postToURL(url, values) {
    values = values || {};

    var form = createElement("form", {action: url,
                                      method: "POST",
                                      style: "display: none"});
    for (var property in values) {
        if (values.hasOwnProperty(property)) {
            var value = values[property];
            if (value instanceof Array) {
                for (var i = 0, l = value.length; i < l; i++) {
                    form.appendChild(createElement("input", {type: "hidden",
                                                             name: property,
                                                             value: value[i]}));
                }
            }
            else {
                form.appendChild(createElement("input", {type: "hidden",
                                                         name: property,
                                                         value: value}));
            }
        }
    }
    document.body.appendChild(form);
    form.submit();
    document.body.removeChild(form);
}

6
제출 후 아이를 제거해야합니까? 그래도 페이지가 사라지지 않습니까?
Nils

2
세션이 사용되고 해당 데이터가 저장된 경우를 제외하고는 제출 후 하위를 제거하는 데 사용할 수 없습니다.
Miloš

6
@CantucciHQ 양식 대상이 설정되지 않은 경우에도 페이지가 그대로 유지 될 수 있습니다. 예를 들어 204 No Content 가 있습니다 .
Eugene Ryabtsev

38

Rakesh Pai의 답변 은 훌륭하지만 ( Safari에서 )라는 필드가있는 양식을 게시하려고 할 때 발생하는 문제가 submit있습니다. 예를 들면 다음과 같습니다 post_to_url("http://google.com/",{ submit: "submit" } );. 이 가변 공간 충돌을 피하기 위해 함수를 약간 패치했습니다.

    function post_to_url(path, params, method) {
        method = method || "post";

        var form = document.createElement("form");

        //Move the submit function to another variable
        //so that it doesn't get overwritten.
        form._submit_function_ = form.submit;

        form.setAttribute("method", method);
        form.setAttribute("action", path);

        for(var key in params) {
            var hiddenField = document.createElement("input");
            hiddenField.setAttribute("type", "hidden");
            hiddenField.setAttribute("name", key);
            hiddenField.setAttribute("value", params[key]);

            form.appendChild(hiddenField);
        }

        document.body.appendChild(form);
        form._submit_function_(); //Call the renamed function.
    }
    post_to_url("http://google.com/", { submit: "submit" } ); //Works!

7
2018 년에도 여전히 더 나은 대답은 아닙니다?
iiirxs 2016 년

30

아니요. 양식 제출과 같은 자바 스크립트 게시 요청을 할 수 없습니다.

당신이 가질 수있는 것은 HTML로 된 양식이며, JavaScript로 제출하십시오. (이 페이지에서 여러 번 설명했듯이).

HTML을 직접 만들 수 있으며 HTML을 작성하기 위해 JavaScript가 필요하지 않습니다. 사람들이 제안한다면 그것은 어리석은 일입니다.

<form id="ninja" action="http://example.com/" method="POST">
  <input id="donaldduck" type="hidden" name="q" value="a">
</form>

함수는 원하는 방식으로 양식을 구성합니다.

function postToURL(a,b,c){
   document.getElementById("ninja").action     = a;
   document.getElementById("donaldduck").name  = b;
   document.getElementById("donaldduck").value = c;
   document.getElementById("ninja").submit();
}

그런 다음 사용하십시오.

postToURL("http://example.com/","q","a");

그러나 나는 그 기능을 생략하고 그냥 할 것입니다.

document.getElementById('donaldduck').value = "a";
document.getElementById("ninja").submit();

마지막으로 스타일 결정은 ccs 파일에 적용됩니다.

#ninja{ 
  display:none;
}

개인적으로 양식은 이름으로 처리해야한다고 생각하지만 지금은 중요하지 않습니다.


26

당신이있는 경우 프로토 타입 설치, 당신은 생성과 같은 숨겨진 양식을 제출 코드를 조여 수 있습니다 :

 var form = new Element('form',
                        {method: 'post', action: 'http://example.com/'});
 form.insert(new Element('input',
                         {name: 'q', value: 'a', type: 'hidden'}));
 $(document.body).insert(form);
 form.submit();

25

이것은 rakesh의 답변이지만 배열을 지원합니다 (형태에서 매우 일반적입니다).

일반 자바 스크립트 :

function post_to_url(path, params, method) {
    method = method || "post"; // Set method to post by default, if not specified.

    // The rest of this code assumes you are not using a library.
    // It can be made less wordy if you use one.
    var form = document.createElement("form");
    form.setAttribute("method", method);
    form.setAttribute("action", path);

    var addField = function( key, value ){
        var hiddenField = document.createElement("input");
        hiddenField.setAttribute("type", "hidden");
        hiddenField.setAttribute("name", key);
        hiddenField.setAttribute("value", value );

        form.appendChild(hiddenField);
    }; 

    for(var key in params) {
        if(params.hasOwnProperty(key)) {
            if( params[key] instanceof Array ){
                for(var i = 0; i < params[key].length; i++){
                    addField( key, params[key][i] )
                }
            }
            else{
                addField( key, params[key] ); 
            }
        }
    }

    document.body.appendChild(form);
    form.submit();
}

아, 그리고 여기 jquery 버전이 있습니다 : (약간 다른 코드이지만 똑같은 것으로 요약됩니다)

function post_to_url(path, params, method) {
    method = method || "post"; // Set method to post by default, if not specified.

    var form = $(document.createElement( "form" ))
        .attr( {"method": method, "action": path} );

    $.each( params, function(key,value){
        $.each( value instanceof Array? value : [value], function(i,val){
            $(document.createElement("input"))
                .attr({ "type": "hidden", "name": key, "value": val })
                .appendTo( form );
        }); 
    } ); 

    form.appendTo( document.body ).submit(); 
}

3
추신 : 나는 그 기능을 사용하는 것을 좋아하지만 마지막에 양식을 제출하는 대신 단순히 호출자에게 반환합니다. 이 방법으로 쉽게 추가 속성을 설정하거나 필요한 경우 다른 속성을 사용할 수 있습니다.
kritzikratzi

3
큰! 매우 유용한. 이 양식의 서버 측에서 PHP를 사용하는 사람들을위한 작은 변경으로 addField (key, params [key] [i])를 addField (key + '[]', params [key] [i])로 변경했습니다. 이것은 $ _POST [key]를 배열로 사용할 수있게합니다.
Thava

2
@Thava 입력 필드에 name = "bla []"를 설정할 수도 있습니다. 어쨌든, [] 구문을 지원하지 않는 PHP 이외의 언어가 있으므로 변경하지 마십시오.
kritzikratzi

17

한 가지 해결책은 양식을 생성하여 제출하는 것입니다. 한 가지 구현은

function post_to_url(url, params) {
    var form = document.createElement('form');
    form.action = url;
    form.method = 'POST';

    for (var i in params) {
        if (params.hasOwnProperty(i)) {
            var input = document.createElement('input');
            input.type = 'hidden';
            input.name = i;
            input.value = params[i];
            form.appendChild(input);
        }
    }

    form.submit();
}

그래서 간단한 URL 단축 북마크를 구현할 수 있습니다.

javascript:post_to_url('http://is.gd/create.php', {'URL': location.href});

16

글쎄, 나는 다른 모든 게시물을 읽었기를 바랍니다. 그래서 나는 Rakesh Pai의 답변에서 이것을 만드는 데 시간을 잃지 않았습니다. 다음은 배열 및 객체와 함께 작동하는 재귀 솔루션입니다. jQuery에 의존하지 않습니다.

전체 양식을 배열처럼 제출해야하는 경우를 처리하기 위해 세그먼트를 추가했습니다. (즉, 항목 목록 주위에 래퍼 객체가없는 경우)

/**
 * Posts javascript data to a url using form.submit().  
 * Note: Handles json and arrays.
 * @param {string} path - url where the data should be sent.
 * @param {string} data - data as javascript object (JSON).
 * @param {object} options -- optional attributes
 *  { 
 *    {string} method: get/post/put/etc,
 *    {string} arrayName: name to post arraylike data.  Only necessary when root data object is an array.
 *  }
 * @example postToUrl('/UpdateUser', {Order {Id: 1, FirstName: 'Sally'}});
 */
function postToUrl(path, data, options) {
    if (options === undefined) {
        options = {};
    }

    var method = options.method || "post"; // Set method to post by default if not specified.

    var form = document.createElement("form");
    form.setAttribute("method", method);
    form.setAttribute("action", path);

    function constructElements(item, parentString) {
        for (var key in item) {
            if (item.hasOwnProperty(key) && item[key] != null) {
                if (Object.prototype.toString.call(item[key]) === '[object Array]') {
                    for (var i = 0; i < item[key].length; i++) {
                        constructElements(item[key][i], parentString + key + "[" + i + "].");
                    }
                } else if (Object.prototype.toString.call(item[key]) === '[object Object]') {
                    constructElements(item[key], parentString + key + ".");
                } else {
                    var hiddenField = document.createElement("input");
                    hiddenField.setAttribute("type", "hidden");
                    hiddenField.setAttribute("name", parentString + key);
                    hiddenField.setAttribute("value", item[key]);
                    form.appendChild(hiddenField);
                }
            }
        }
    }

    //if the parent 'data' object is an array we need to treat it a little differently
    if (Object.prototype.toString.call(data) === '[object Array]') {
        if (options.arrayName === undefined) console.warn("Posting array-type to url will doubtfully work without an arrayName defined in options.");
        //loop through each array item at the parent level
        for (var i = 0; i < data.length; i++) {
            constructElements(data[i], (options.arrayName || "") + "[" + i + "].");
        }
    } else {
        //otherwise treat it normally
        constructElements(data, "");
    }

    document.body.appendChild(form);
    form.submit();
};

1
이것은 중첩 된 객체를 올바르게 인코딩하지 않는 것 같습니다.
mpen

1
@mpen 바이올린이 있습니까?
emragins

1
아니요, 죄송합니다. 나 자신을 쓰는 것이 쉬웠다. 디버깅 할 가치가 없습니다.
mpen

12

세 가지 옵션이 있습니다.

  1. 표준 JavaScript 답변 : 프레임 워크를 사용하십시오! 대부분의 Ajax 프레임 워크는 XMLHTTPRequest POST 를 작성하는 쉬운 방법을 추상화했다 .

  2. get 대신 open 메소드에 post를 전달하여 XMLHTTPRequest 요청을 직접 작성하십시오. ( XMLHTTPRequest (Ajax)에서 POST 메소드 사용에 대한 자세한 정보 )

  3. JavaScript를 통해 동적으로 양식을 작성하고 조치를 추가하고 입력을 추가 한 후 제출하십시오.


5
XMLHTTPRequest는 창을 업데이트하지 않습니다. document.write (http.responseText)로 AJAX를 끝내야한다고 말하고 있습니까?
Joseph Holsten

11
그가 프레임 워크로 다른 작업을 수행한다면 왜 프로젝트에 30k +를 더해야합니까?
Dementic

12

다른 사람들이 다음과 같이 제안한대로 Ajax 경로를 따라갈 것입니다.

var xmlHttpReq = false;

var self = this;
// Mozilla/Safari
if (window.XMLHttpRequest) {
    self.xmlHttpReq = new XMLHttpRequest();
}
// IE
else if (window.ActiveXObject) {
    self.xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
}

self.xmlHttpReq.open("POST", "YourPageHere.asp", true);
self.xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');

self.xmlHttpReq.setRequestHeader("Content-length", QueryString.length);



self.xmlHttpReq.send("?YourQueryString=Value");

1
잡히지 않은 ReferenceError : QueryString이 정의되지 않았습니다.
체이스 로버츠

11

가장 쉬운 방법은 Ajax Post Request를 사용하는 것입니다.

$.ajax({
    type: "POST",
    url: 'http://www.myrestserver.com/api',
    data: data,
    success: success,
    dataType: dataType
    });

어디:

  • 데이터는 객체이다
  • dataType은 서버에서 예상되는 데이터입니다 (xml, json, script, text, html).
  • url은 RESt 서버의 주소 또는 서버 측에서 HTTP-POST를 허용하는 기능입니다.

그런 다음 성공 처리기에서 window.location과 같은 방법으로 브라우저를 리디렉션하십시오.


5
제공하는 접근 방식이 jQuery JavaScript 라이브러리를 기반으로한다는 점은 언급하지 않았습니다 .
DavidRR

8
당신은 또한 질문의 요점을 놓쳤습니다. 그는 아약스 요청을하지 않고 '브라우저를 다른 페이지로 연결하고 싶습니다.'
Black

응답을 기다렸다가 document.location = {url}; 이것이 작동하지 않을 것이라고 생각할 수있는 유일한 장소는 파일 다운로드로 리디렉션하는 경우입니다.
Epirocks

11

다음은 jQuery를 사용하여 작성한 방법입니다. Firefox 및 Internet Explorer에서 테스트되었습니다.

function postToUrl(url, params, newWindow) {
    var form = $('<form>');
    form.attr('action', url);
    form.attr('method', 'POST');
    if(newWindow){ form.attr('target', '_blank'); 
  }

  var addParam = function(paramName, paramValue) {
      var input = $('<input type="hidden">');
      input.attr({ 'id':     paramName,
                 'name':   paramName,
                 'value':  paramValue });
      form.append(input);
    };

    // Params is an Array.
    if(params instanceof Array){
        for(var i=0; i<params.length; i++) {
            addParam(i, params[i]);
        }
    }

    // Params is an Associative array or Object.
    if(params instanceof Object) {
        for(var key in params){
            addParam(key, params[key]);
        }
    }

    // Submit the form, then remove it from the page
    form.appendTo(document.body);
    form.submit();
    form.remove();
}

1
나를 위해 일했다. 감사. (Chrome에서 테스트)
dannie.f

2
여기서 문제는 제출이 반환되기 전에 양식이 제거되었다는 것입니다. 제출이 완료되기 전에 양식을 이동하거나 제거하면 일부 브라우저에서 처리기가 실행되지 않는다고 들었습니다. 대신 핸들러의 문서에서 양식을 제거하십시오.
Jeff DQ

매력처럼 작동합니다. Firefox + Chrome + IE11에서 테스트되었습니다. 대단히 감사합니다!
Deunz 2016 년

6

프로토 타입 라이브러리는 쉽게 쿼리 문자열 스타일의 문자열로 자바 스크립트 객체 / 구조를 설정 할 수있는 ".toQueryString ()"방법과 해시 테이블 객체를 포함하고 있습니다. 게시물은 요청의 "본문"이 쿼리 문자열 형식의 문자열이어야하므로 Ajax 요청이 게시물로 올바르게 작동 할 수 있습니다. 다음은 프로토 타입을 사용하는 예입니다.

$req = new Ajax.Request("http://foo.com/bar.php",{
    method: 'post',
    parameters: $H({
        name: 'Diodeus',
        question: 'JavaScript posts a request like a form request',
        ...
    }).toQueryString();
};

1
이 솔루션은 서버 응답의 반환으로 현재 표시된 문서를 대체하지 않는 몇 가지 솔루션 중 하나입니다.
dothebart

4

이것은 내 경우에 완벽하게 작동합니다.

document.getElementById("form1").submit();

다음과 같은 기능으로 사용할 수 있습니다.

function formSubmit() {
     document.getElementById("frmUserList").submit();
} 

이를 사용하여 모든 입력 값을 게시 할 수 있습니다.


3

또 다른 재귀 솔루션은 다른 것들 중 일부가 고장난 것 같습니다 (모두 테스트하지는 않았습니다). 이것은 lodash 3.x 및 ES6 에 따라 다릅니다 (jQuery는 필요하지 않음).

function createHiddenInput(name, value) {
    let input = document.createElement('input');
    input.setAttribute('type','hidden');
    input.setAttribute('name',name);
    input.setAttribute('value',value);
    return input;
}

function appendInput(form, name, value) {
    if(_.isArray(value)) {
        _.each(value, (v,i) => {
            appendInput(form, `${name}[${i}]`, v);
        });
    } else if(_.isObject(value)) {
        _.forOwn(value, (v,p) => {
            appendInput(form, `${name}[${p}]`, v);
        });
    } else {
        form.appendChild(createHiddenInput(name, value));
    }
}

function postToUrl(url, data) {
    let form = document.createElement('form');
    form.setAttribute('method', 'post');
    form.setAttribute('action', url);

    _.forOwn(data, (value, name) => {
        appendInput(form, name, value);
    });

    form.submit();
}

3

내 솔루션은 @RakeshPai에서 현재 허용되는 솔루션과 달리 깊이 중첩 된 객체를 인코딩합니다.

'qs'npm 라이브러리와 stringify 함수를 사용하여 중첩 된 오브젝트를 매개 변수로 변환합니다.

이 코드는 Rails 백엔드에서 잘 작동하지만 stringify에 전달 된 옵션을 수정하여 필요한 백엔드에서 작동하도록 수정할 수 있어야합니다. Rails에서는 arrayFormat을 "brackets"로 설정해야합니다.

import qs from "qs"

function normalPost(url, params) {
  var form = document.createElement("form");
  form.setAttribute("method", "POST");
  form.setAttribute("action", url);

  const keyValues = qs
    .stringify(params, { arrayFormat: "brackets", encode: false })
    .split("&")
    .map(field => field.split("="));

  keyValues.forEach(field => {
    var key = field[0];
    var value = field[1];
    var hiddenField = document.createElement("input");
    hiddenField.setAttribute("type", "hidden");
    hiddenField.setAttribute("name", key);
    hiddenField.setAttribute("value", value);
    form.appendChild(hiddenField);
  });
  document.body.appendChild(form);
  form.submit();
}

예:

normalPost("/people/new", {
      people: [
        {
          name: "Chris",
          address: "My address",
          dogs: ["Jordan", "Elephant Man", "Chicken Face"],
          information: { age: 10, height: "3 meters" }
        },
        {
          name: "Andrew",
          address: "Underworld",
          dogs: ["Doug", "Elf", "Orange"]
        },
        {
          name: "Julian",
          address: "In a hole",
          dogs: ["Please", "Help"]
        }
      ]
    });

다음 Rails 매개 변수를 생성합니다.

{"authenticity_token"=>"...",
 "people"=>
  [{"name"=>"Chris", "address"=>"My address", "dogs"=>["Jordan", "Elephant Man", "Chicken Face"], "information"=>{"age"=>"10", "height"=>"3 meters"}},
   {"name"=>"Andrew", "address"=>"Underworld", "dogs"=>["Doug", "Elf", "Orange"]},
   {"name"=>"Julian", "address"=>"In a hole", "dogs"=>["Please", "Help"]}]}

2

FormObject 는 옵션입니다. 그러나 FormObject는 현재 대부분의 브라우저에서 지원되지 않습니다.


1

이것은 Alan의 옵션 2와 같습니다 (위). httpobj를 인스턴스화하는 방법은 연습으로 남아 있습니다.

httpobj.open("POST", url, true);
httpobj.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8');
httpobj.onreadystatechange=handler;
httpobj.send(post);

1

이것은 jQuery를 사용하는 beauSD의 코드를 기반으로합니다. 객체에서 재귀 적으로 작동하도록 개선되었습니다.

function post(url, params, urlEncoded, newWindow) {
    var form = $('<form />').hide();
    form.attr('action', url)
        .attr('method', 'POST')
        .attr('enctype', urlEncoded ? 'application/x-www-form-urlencoded' : 'multipart/form-data');
    if(newWindow) form.attr('target', '_blank');

    function addParam(name, value, parent) {
        var fullname = (parent.length > 0 ? (parent + '[' + name + ']') : name);
        if(value instanceof Object) {
            for(var i in value) {
                addParam(i, value[i], fullname);
            }
        }
        else $('<input type="hidden" />').attr({name: fullname, value: value}).appendTo(form);
    };

    addParam('', params, '');

    $('body').append(form);
    form.submit();
}

1

DHTML을 사용하여 양식을 동적으로 추가 한 다음 제출할 수 있습니다.



1

나는 document.forms java를 사용하고 그것을 루프하여 양식의 모든 요소를 ​​얻은 다음 xhttp를 통해 보냅니다. 그래서 이것은 javascript / ajax submit (모든 HTML을 예제로 포함)에 대한 내 솔루션입니다.

          <!DOCTYPE html>
           <html>
           <body>
           <form>
       First name: <input type="text" name="fname" value="Donald"><br>
        Last name: <input type="text" name="lname" value="Duck"><br>
          Addr1: <input type="text" name="add" value="123 Pond Dr"><br>
           City: <input type="text" name="city" value="Duckopolis"><br>
      </form> 



           <button onclick="smc()">Submit</button>

                   <script>
             function smc() {
                  var http = new XMLHttpRequest();
                       var url = "yourphpfile.php";
                     var x = document.forms[0];
                          var xstr = "";
                         var ta ="";
                    var tb ="";
                var i;
               for (i = 0; i < x.length; i++) {
     if (i==0){ta = x.elements[i].name+"="+ x.elements[i].value;}else{
       tb = tb+"&"+ x.elements[i].name +"=" + x.elements[i].value;
             } }

           xstr = ta+tb;
      http.open("POST", url, true);
       http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

      http.onreadystatechange = function() {
          if(http.readyState == 4 && http.status == 200) {

        // do whatever you want to with the html output response here

                } 

               }
            http.send(xstr);

              }
         </script>

         </body>
     </html>

1

버튼을 누르는 것처럼 jQuery의 트리거 메소드를 사용하여 양식을 제출할 수 있습니다.

$('form').trigger('submit')

브라우저에 제출됩니다.


0

사용자를 다른 페이지에 자동으로 게시하고 안내하는 방법은 숨겨진 양식을 작성한 다음 자동 제출하는 것입니다. 숨겨진 양식은 웹 페이지의 공간을 전혀 차지하지 않습니다. 코드는 다음과 같습니다.

    <form name="form1" method="post" action="somepage.php">
    <input name="fielda" type="text" id="fielda" type="hidden">

    <textarea name="fieldb" id="fieldb" cols="" rows="" style="display:none"></textarea>
</form>
    document.getElementById('fielda').value="some text for field a";
    document.getElementById('fieldb').innerHTML="some text for multiline fieldb";
    form1.submit();

자동 제출 신청

자동 제출을 적용하면 사용자가 자동으로 다른 페이지에 입력 한 양식 값을 해당 페이지로 전달합니다. 이러한 응용 프로그램은 다음과 같습니다.

fieldapost=<?php echo $_post['fielda'];>
if (fieldapost !="") {
document.write("<form name='form1' method='post' action='previouspage.php'>
  <input name='fielda' type='text' id='fielda' type='hidden'>
</form>");
document.getElementById('fielda').value=fieldapost;
form1.submit();
}

0

내가하는 방법은 다음과 같습니다.

function redirectWithPost(url, data){
        var form = document.createElement('form');
        form.method = 'POST';
        form.action = url;

        for(var key in data){
            var input = document.createElement('input');
            input.name = key;
            input.value = data[key];
            input.type = 'hidden';
            form.appendChild(input)
        }
        document.body.appendChild(form);
        form.submit();
    }

0

위의 솔루션 중 어느 것도 jQuery로 깊은 중첩 매개 변수를 처리하지 않았으므로 여기에 2 센트 솔루션이 있습니다.

jQuery를 사용 중이고 깊은 중첩 매개 변수를 처리해야하는 경우 아래에서이 함수를 사용할 수 있습니다.

    /**
     * Original code found here: https://github.com/mgalante/jquery.redirect/blob/master/jquery.redirect.js
     * I just simplified it for my own taste.
     */
    function postForm(parameters, url) {

        // generally we post the form with a blank action attribute
        if ('undefined' === typeof url) {
            url = '';
        }


        //----------------------------------------
        // SOME HELPER FUNCTIONS
        //----------------------------------------
        var getForm = function (url, values) {

            values = removeNulls(values);

            var form = $('<form>')
                .attr("method", 'POST')
                .attr("action", url);

            iterateValues(values, [], form, null);
            return form;
        };

        var removeNulls = function (values) {
            var propNames = Object.getOwnPropertyNames(values);
            for (var i = 0; i < propNames.length; i++) {
                var propName = propNames[i];
                if (values[propName] === null || values[propName] === undefined) {
                    delete values[propName];
                } else if (typeof values[propName] === 'object') {
                    values[propName] = removeNulls(values[propName]);
                } else if (values[propName].length < 1) {
                    delete values[propName];
                }
            }
            return values;
        };

        var iterateValues = function (values, parent, form, isArray) {
            var i, iterateParent = [];
            Object.keys(values).forEach(function (i) {
                if (typeof values[i] === "object") {
                    iterateParent = parent.slice();
                    iterateParent.push(i);
                    iterateValues(values[i], iterateParent, form, Array.isArray(values[i]));
                } else {
                    form.append(getInput(i, values[i], parent, isArray));
                }
            });
        };

        var getInput = function (name, value, parent, array) {
            var parentString;
            if (parent.length > 0) {
                parentString = parent[0];
                var i;
                for (i = 1; i < parent.length; i += 1) {
                    parentString += "[" + parent[i] + "]";
                }

                if (array) {
                    name = parentString + "[" + name + "]";
                } else {
                    name = parentString + "[" + name + "]";
                }
            }

            return $("<input>").attr("type", "hidden")
                .attr("name", name)
                .attr("value", value);
        };


        //----------------------------------------
        // NOW THE SYNOPSIS
        //----------------------------------------
        var generatedForm = getForm(url, parameters);

        $('body').append(generatedForm);
        generatedForm.submit();
        generatedForm.remove();
    }

사용 방법의 예는 다음과 같습니다. HTML 코드 :

<button id="testButton">Button</button>

<script>
    $(document).ready(function () {
        $("#testButton").click(function () {
            postForm({
                csrf_token: "abcd",
                rows: [
                    {
                        user_id: 1,
                        permission_group_id: 1
                    },
                    {
                        user_id: 1,
                        permission_group_id: 2
                    }
                ],
                object: {
                    apple: {
                        color: "red",
                        age: "23 days",
                        types: [
                            "golden",
                            "opal",
                        ]
                    }
                },
                the_null: null, // this will be dropped, like non-checked checkboxes are dropped
            });
        });
    });
</script>

테스트 버튼을 클릭하면 양식이 게시되고 POST에 다음 값이 표시됩니다.

array(3) {
  ["csrf_token"] => string(4) "abcd"
  ["rows"] => array(2) {
    [0] => array(2) {
      ["user_id"] => string(1) "1"
      ["permission_group_id"] => string(1) "1"
    }
    [1] => array(2) {
      ["user_id"] => string(1) "1"
      ["permission_group_id"] => string(1) "2"
    }
  }
  ["object"] => array(1) {
    ["apple"] => array(3) {
      ["color"] => string(3) "red"
      ["age"] => string(7) "23 days"
      ["types"] => array(2) {
        [0] => string(6) "golden"
        [1] => string(4) "opal"
      }
    }
  }
}

참고 : 현재 페이지가 아닌 다른 URL에 양식을 게시하려면 url을 postForm 함수의 두 번째 인수로 지정할 수 있습니다.

예를 들어 (예 : 재사용)

postForm({'q':'a'}, 'http://example.com/');

도움이 되었기를 바랍니다.

참고 2 : 코드는 리디렉션 플러그인 에서 가져 왔습니다 . 나는 기본적으로 내 필요에 맞게 단순화했습니다.


-1

POST 또는 GET으로 리디렉션하기위한 jQuery 플러그인 :

https://github.com/mgalante/jquery.redirect/blob/master/jquery.redirect.js

테스트하려면 위의 .js 파일을 포함 시키거나 클래스에 코드를 복사 / 붙여 넣은 다음 "args"를 변수 이름으로 바꾸고 "values"를 해당 변수의 값으로 바꾸십시오.

$.redirect('demo.php', {'arg1': 'value1', 'arg2': 'value2'});

이것은 또한 여기에 언급되었습니다 : stackoverflow.com/questions/8389646/…
OG Sean

이 솔루션은 여전히 ​​우리에게 적합합니다. 다운 투표를 한 경우 이유에 대한 의견을 남겨주십시오.
OG Sean

-2

AJAX 호출을 할 수 있습니다 (Prototype.js 또는 JQuery 사용과 같은 라이브러리 사용). AJAX는 GET 및 POST 옵션을 모두 처리 할 수 ​​있습니다.


5
XMLHttpRequest를 사용하면 브라우저가 다른 페이지로 이동하지 않습니다.
Jonny Buchanan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.