คำขอโพสต์ 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 ดังนั้นอาแจ็กซ์จึงไม่ใช่คำตอบ


1
ดังกล่าวในหัวข้ออื่นมีปลั๊กอิน ".redirect" jquery ที่ทำงานร่วมกับวิธีการ POST หรือ GET มันสร้างฟอร์มที่มีอินพุตที่ซ่อนอยู่และส่งให้คุณ ตัวอย่าง: $ .redirect ('demo.php', {'arg1': 'value1', 'arg2': 'value2'}); github.com/mgalante/jquery.redirect/blob/master/ …
OG Sean

คำตอบ:


2144

สร้างแบบไดนามิก<input>ในแบบฟอร์มและส่ง

/**
 * 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'});

แก้ไข : ตั้งแต่นี้มี upvoting มากฉันเดาว่าคนจะคัดลอกวางนี้มาก ดังนั้นฉันจึงเพิ่มการhasOwnPropertyตรวจสอบเพื่อแก้ไขข้อบกพร่องโดยไม่ตั้งใจ


10
แล้วอาร์เรย์ใน data params ล่ะ โพสต์ Jquery () ตีความเช่น: "data: {array: [1, 2, 3]}" as? array = 1 & array = 2 & array = 3 รหัสที่ให้ผลลัพธ์อื่น
Scit

18
คำเตือน: แม้จะมีหลาย upvotes โซลูชันนี้มี จำกัด และไม่ได้จัดการอาร์เรย์หรือวัตถุที่ซ้อนกันภายในฟอร์ม มิฉะนั้นมันเป็นคำตอบที่ดี
emragins

3
น่าอัศจรรย์นี้ไม่ได้รับการสนับสนุนตามธรรมชาติทั้งโดย html และ javascript ไม่ jquery .. คุณต้องรหัสนี้
eugene

14
@mricci จุดตัวอย่างนี้คือการเปลี่ยนเส้นทางเบราว์เซอร์ไปยัง URL ใหม่ที่ระบุโดยการกระทำ; หากคุณอยู่ในหน้าเดียวกันคุณก็สามารถใช้ AJAX ดั้งเดิมเพื่อโพสต์ข้อมูลของคุณ เนื่องจากเบราว์เซอร์ควรจะนำทางไปยังหน้าใหม่เนื้อหา DOM ของหน้าปัจจุบันจะไม่สำคัญ
Ken Bellows

6
ผู้ใช้ Python, Django และ Flask อาจเห็นข้อผิดพลาดนี้: "Forbidden (403) การตรวจสอบ CSRF ล้มเหลวคำขอถูกยกเลิก" หากสร้างฟอร์มจากศูนย์ ในกรณีนี้คุณต้องผ่านโทเค็น csrf ด้วยวิธีนี้: โพสต์ ('/ contact /', {ชื่อ: '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 (ค่า) จากนั้น 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();

แน่นอนคุณควรใช้เฟรมเวิร์ก JavaScript เช่นPrototypeหรือjQuery ...


6
มีวิธีการทำเช่นนี้หรือไม่โดยไม่ต้องโหลดเว็บเพจในหน้าต่าง / แท็บเบราว์เซอร์ปัจจุบัน?
pbreitenbach

54

ใช้createElementฟังก์ชั่นที่ให้ไว้ในคำตอบนี้ซึ่งเป็นสิ่งจำเป็นเนื่องจากความเสียหายของ 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
คุณต้องการลบเด็กหลังจากส่งหรือไม่ หน้าไม่หายไปหรือไม่
นิลส์

2
ไม่มีประโยชน์ที่จะลบเด็กหลังจากส่งยกเว้นว่ามีการใช้งานเซสชันและข้อมูลเหล่านั้นจะถูกบันทึกไว้
Miloš

6
@CantucciHQ หน้าอาจจะยังคงไม่เปลี่ยนแปลงแม้ว่าเป้าหมายของแบบฟอร์มจะไม่ถูกตั้งค่า มี204 ไม่มีเนื้อหาตัวอย่างเช่น
Eugene Ryabtsev

38

คำตอบ Rakesh ปายเป็นที่น่าตื่นตาตื่นใจ แต่มีปัญหาที่เกิดขึ้นสำหรับผม (ใน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

30

ไม่คุณไม่สามารถส่งคำขอโพสต์ JavaScript เช่นส่งแบบฟอร์ม

สิ่งที่คุณมีคือฟอร์มใน HTML จากนั้นส่งพร้อม JavaScript (ตามที่อธิบายไว้หลายครั้งในหน้านี้)

คุณสามารถสร้าง HTML ได้ด้วยตัวเองโดยไม่ต้องใช้ JavaScript เพื่อเขียน HTML มันคงจะโง่ถ้ามีคนแนะนำว่า

<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

หากคุณมีPrototypeติดตั้งอยู่คุณสามารถทำให้โค้ดแน่นขึ้นเพื่อสร้างและส่งแบบฟอร์มที่ซ่อนอยู่ดังนี้:

 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
ps i ตอนนี้สนุกกับการใช้ฟังก์ชั่นนั้น แต่แทนที่จะส่งแบบฟอร์มในตอนท้ายฉันก็กลับไปที่ผู้โทร วิธีนี้ฉันสามารถตั้งค่าคุณสมบัติเพิ่มเติมหรือทำสิ่งอื่น ๆ ได้อย่างง่ายดายหากต้องการ
kritzikratzi

3
ที่ดี! มีประโยชน์มาก. การเปลี่ยนแปลงเล็กน้อยสำหรับผู้ที่พึ่งพา PHP ที่ฝั่งเซิร์ฟเวอร์ของแบบฟอร์มนี้ฉันเปลี่ยน addField (คีย์, params [key] [i]) เป็น addField (key + '[]', params [key] [i]) นี่ทำให้ $ _POST [key] พร้อมใช้งานเป็นอาร์เรย์
Thava

2
@Thava คุณสามารถตั้งชื่อ = "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();
}

ดังนั้นฉันสามารถใช้ bookmarklet ย่อ 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. คำตอบจาวาสคริปต์มาตรฐาน: ใช้เฟรมเวิร์ก! เฟรมเวิร์ก Ajax ส่วนใหญ่จะทำให้คุณเข้าใจได้ง่ายในการสร้างXMLHTTPRequest POST

  2. สร้างคำขอ XMLHTTPRequest ด้วยตัวคุณเองผ่านโพสต์ในวิธีการเปิดแทนการรับ (ข้อมูลเพิ่มเติมในการใช้วิธีการ POST ใน XMLHTTPRequest (Ajax) )

  3. ผ่าน JavaScript สร้างแบบฟอร์มเพิ่มแอคชั่นเพิ่มอินพุตของคุณและส่งสิ่งนั้น


5
XMLHTTPRequest ไม่อัปเดตหน้าต่าง คุณกำลังพยายามจะบอกว่าฉันควรลงท้ายด้วย AJAX ด้วย document.write (http.responseText)?
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
Uncaught ReferenceError: QueryString ไม่ได้ถูกกำหนดไว้
Chase Roberts

11

วิธีที่ง่ายที่สุดคือการใช้ Ajax Post Request:

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

ที่อยู่:

  • data เป็นวัตถุ
  • dataType คือข้อมูลที่เซิร์ฟเวอร์คาดหวัง (xml, json, script, text, html)
  • url คือที่อยู่ของเซิร์ฟเวอร์ RESt ของคุณหรือฟังก์ชั่นใด ๆ ในฝั่งเซิร์ฟเวอร์ที่ยอมรับ HTTP-POST

จากนั้นในตัวจัดการความสำเร็จเปลี่ยนเส้นทางเบราว์เซอร์ที่มีบางอย่างเช่น window.location


5
คุณไม่ได้พูดถึงว่าวิธีการที่คุณเสนอนั้นขึ้นอยู่กับไลบรารีjQuery JavaScript
DavidRR

8
คุณพลาดจุดคำถามไปแล้ว - เขาต้องการ 'นำเบราว์เซอร์ไปยังหน้าอื่น' ไม่ใช่ขอ ajax
ดำ

คุณสามารถรอการตอบกลับจากนั้น 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

6

ต้นแบบห้องสมุดมี Hashtable วัตถุด้วย ".toQueryString ()" วิธีการที่ช่วยให้คุณสามารถเปิด JavaScript วัตถุ / โครงสร้างเป็นสตริงสไตล์สตริงแบบสอบถาม เนื่องจากการโพสต์ต้องการ "เนื้อหา" ของการร้องขอเพื่อให้เป็นสตริงที่จัดรูปแบบของเคียวรีสตริงการทำเช่นนี้จะช่วยให้คำขอ Ajax ของคุณทำงานอย่างถูกต้องในฐานะโพสต์ นี่คือตัวอย่างการใช้ Prototype:

$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 back-end แม้ว่าคุณควรจะสามารถแก้ไขได้เพื่อทำงานกับแบ็กเอนด์อะไรก็ตามที่คุณต้องการโดยการแก้ไขตัวเลือกที่ส่งผ่านไปยังชุดอักขระ 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"]}]}


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

นี่คือพื้นฐานของรหัสของ beauSD โดยใช้ jQuery ได้รับการปรับปรุงเพื่อให้สามารถใช้งานซ้ำกับวัตถุได้

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

ฉันใช้ 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

ไม่มีการแก้ปัญหาข้างต้นที่จัดการ params ซ้อนกันลึกด้วย jQuery ดังนั้นนี่คือโซลูชันสองเซนต์ของฉัน

หากคุณใช้ 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/');

หวังว่านี่จะช่วยได้

Note2: รหัสถูกนำมาจากปลั๊กอินเปลี่ยนเส้นทาง ฉันแค่ทำให้มันง่ายขึ้นตามความต้องการของฉัน


-1

ปลั๊กอิน jQuery สำหรับเปลี่ยนเส้นทางด้วย POST หรือ GET:

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

ในการทดสอบให้รวมไฟล์. js ข้างต้นหรือคัดลอก / วางคลาสลงในรหัสของคุณจากนั้นใช้รหัสที่นี่แทนที่ "args" ด้วยชื่อตัวแปรของคุณและ "ค่า" ด้วยค่าของตัวแปรเหล่านั้น:

$.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.