एक फॉर्म सबमिट की तरह जावास्क्रिप्ट पोस्ट अनुरोध


1529

मैं एक ब्राउज़र को एक अलग पृष्ठ पर निर्देशित करने की कोशिश कर रहा हूं। अगर मुझे GET अनुरोध चाहिए होता है, तो मैं कह सकता हूं

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

लेकिन मैं जिस संसाधन तक पहुंचने की कोशिश कर रहा हूं, वह तब तक ठीक से जवाब नहीं देगा जब तक कि मैं एक पोस्ट अनुरोध का उपयोग नहीं करता। यदि यह गतिशील रूप से उत्पन्न नहीं हुआ था, तो मैं HTML का उपयोग कर सकता हूं

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

फिर मैं सिर्फ DOM से फॉर्म सबमिट करूँगा।

लेकिन वास्तव में मैं जावास्क्रिप्ट कोड चाहूंगा जो मुझे कहने की अनुमति देता है

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

सबसे अच्छा क्रॉस ब्राउज़र कार्यान्वयन क्या है?

संपादित करें

मुझे खेद है कि मैं स्पष्ट नहीं था। मुझे एक समाधान की आवश्यकता है जो ब्राउज़र के स्थान को बदलता है, जैसे एक फॉर्म सबमिट करना। यदि यह XMLHttpRequest के साथ संभव है , तो यह स्पष्ट नहीं है। और यह एसिंक्रोनस नहीं होना चाहिए, न ही एक्सएमएल का उपयोग करना चाहिए, इसलिए अजाक्स जवाब नहीं है।


1
जैसा कि एक अन्य सूत्र में बताया गया है कि एक jquery ".redirect" प्लगइन है जो POST या GET विधि के साथ काम करता है। यह छिपे हुए इनपुट के साथ एक फॉर्म बनाता है और इसे आपके लिए प्रस्तुत करता है। Ex: $ .redirect ('Demo.php', {'arg1': 'value1', 'arg2': 'value2'}); github.com/mgalante/jquery.redirect/blob/master/…
OG Sean

जवाबों:


2143

डायनामिक रूप से <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'});

संपादित करें : क्योंकि यह बहुत बढ़ गया है, मुझे लगता है कि लोग इसे बहुत कॉपी-पेस्ट करेंगे। इसलिए मैंने hasOwnPropertyकिसी भी अनजाने कीड़े को ठीक करने के लिए चेक को जोड़ा ।


10
डेटा परमेस में सरणियों के बारे में क्या? Jquery पोस्ट () की व्याख्या करता है जैसे: "डेटा: {सरणी: [1, 2, 3]}" कुल; सरणी = 1 और सरणी = 2 और सरणी = 3। व्हिस कोड एक और परिणाम देता है।
स्किट

18
चेतावनी: कई उतार-चढ़ाव के बावजूद, यह समाधान सीमित है और किसी प्रपत्र के अंदर सरणियों या नेस्टेड वस्तुओं को संभालता नहीं है। अन्यथा यह एक महान जवाब है।
इमग्रिन्स

3
अद्भुत यह मूल रूप से HTML द्वारा समर्थित नहीं है और न ही जावास्क्रिप्ट को jquery नहीं है .. आपको इसे कोड करना होगा।
यूजीन

14
@mricci इस स्निपेट का बिंदु ब्राउज़र को कार्रवाई द्वारा निर्दिष्ट एक नए URL पर पुनर्निर्देशित करना है; यदि आप उसी पृष्ठ पर रह रहे हैं तो आप अपने डेटा को पोस्ट करने के लिए पारंपरिक AJAX का उपयोग कर सकते हैं। चूंकि ब्राउज़र को एक नए पृष्ठ पर नेविगेट करना चाहिए, इसलिए वर्तमान पृष्ठ की DOM की सामग्री कोई मायने नहीं
रखेगी

6
पायथन, Django और शायद फ्लास्क उपयोगकर्ताओं को यह त्रुटि दिखाई देगी: "निषिद्ध (403)। CSRF सत्यापन विफल रहा। अनुरोध निरस्त कर दिया गया है।", यदि शून्य से एक फॉर्म बनाते हैं। इस स्थिति में, आपको इस तरह से csrf टोकन पास करना होगा: पोस्ट ('/ contact /', {name: 'Johnny Bravo', csrfmiddlewaretoken: $ ("# csrf_token")। Val ()});
डेविडसन लीमा

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 के लिए
अपील कर रहा है

7
थोड़ी सी भी सरणियों और वस्तुओं का समर्थन करने के लिए इसे संशोधित किया। gist.github.com/hom3chuk/692bf12fe7dac2486212
НЛО

3
यदि मान में एक dangeours xml वर्ण है, तो यह ASP.NET में काम नहीं करेगा। EncodeUriComponent (मान) आवश्यक है। फिर, सर्वर-साइड पर UrlDecode भी आवश्यक है।
स्टीफन स्टीगर

यदि आपकी आवश्यकताएं सरल हैं, तो यह फ़ंक्शन अनावश्यक है। यह वन-लाइनर पर्याप्त है:$("<form method='POST' action='https://example.com'><input type='hidden' name='q' value='a'/></form>").appendTo("body").submit();
रिनोगो

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();

बेशक, आपको प्रोटोटाइप या 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
प्रस्तुत करने के बाद बच्चे को निकालने का कोई फायदा नहीं है, सिवाय इसके कि अगर एक सत्र का उपयोग किया जाता है और उन आंकड़ों को सहेजा जाता है।
मिलो जूल

6
@CantucciHQ प्रपत्र लक्ष्य निर्धारित नहीं होने पर भी पृष्ठ यथावत बना रह सकता है। है 204 कोई सामग्री नहीं उदाहरण के लिए,।
यूजीन रियात्सेव

38

राकेश पई का जवाब आश्चर्यजनक है, लेकिन एक मुद्दा है जो मेरे लिए ( सफारी में ) तब होता है जब मैं एक फील्ड के साथ एक फॉर्म पोस्ट करने की कोशिश करता हूं 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

नहीं, आपके पास एक फॉर्म सबमिट की तरह जावास्क्रिप्ट पोस्ट अनुरोध नहीं हो सकता है।

आपके पास HTML में एक फ़ॉर्म हो सकता है, फिर उसे जावास्क्रिप्ट के साथ सबमिट करें। (जैसा कि इस पृष्ठ पर कई बार समझाया गया है)।

आप स्वयं HTML बना सकते हैं, आपको 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

यदि आपके पास प्रोटोटाइप स्थापित है, तो आप इस तरह छिपे हुए फॉर्म को बनाने और सबमिट करने के लिए कोड को कस सकते हैं:

 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

यह राकेश का जवाब है, लेकिन सरणियों के लिए समर्थन के साथ (जो रूपों में काफी सामान्य है):

सादे जावास्क्रिप्ट:

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 मुझे अब उस फ़ंक्शन का उपयोग करने में आनंद मिलता है, लेकिन अंत में फ़ॉर्म सबमिट करने के बजाय मैं इसे वापस कॉलर को वापस कर देता हूं। इस तरह मैं आसानी से अतिरिक्त विशेषताओं को सेट कर सकता हूं या यदि आवश्यक हो तो इसके साथ अन्य सामान भी कर सकता हूं।
कृत्तिकरत्जी

3
महान! बहुत उपयोगी। इस फॉर्म के सर्वर साइड में PHP पर भरोसा करने वाले लोगों के लिए एक छोटा सा बदलाव, मैंने ऐडफिल्ड (की + परम] [i] को एडफ़िल्ड (की + +] []], परमेस [की] [i] ऐडफ़िल्ड (कुंजी) को बदल दिया। यह $ _POST [कुंजी] को सरणी के रूप में उपलब्ध कराता है।
थवा नोव

2
@ थावे आप अपने इनपुट फ़ील्ड पर नाम = "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

खैर, काश मैंने अन्य सभी पोस्ट पढ़ी होतीं, तो मैं राकेश पई के जवाब से इसे बनाने में समय नहीं गंवाता। यहाँ एक पुनरावर्ती समाधान है जो सरणियों और वस्तुओं के साथ काम करता है। 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
यह नेस्टेड ऑब्जेक्ट्स को ठीक से एन्कोड करने के लिए प्रतीत नहीं होता है।

1
@ आप एक बेला है?
एमरजिन्स

1
कोई खेद नहीं। खुद को लिखना काफी आसान था; डिबग करने का समय नहीं।
मपेन

12

यहां तीन विकल्प।

  1. मानक जावास्क्रिप्ट उत्तर: एक रूपरेखा का उपयोग करें! अधिकांश Ajax चौखटे आप एक XMLHTTPRequest POST बनाने के लिए एक आसान तरीका अमूर्त होगा ।

  2. XMLHTTPRequest स्वयं से अनुरोध करें, पोस्ट प्राप्त करने के बजाय खुली विधि में पास करें। ( XMLHTTPRequest (Ajax) में POST विधि का उपयोग करने में अधिक जानकारी ।)

  3. जावास्क्रिप्ट, डायनामिक रूप से एक फॉर्म बनाते हैं, एक क्रिया जोड़ते हैं, अपने इनपुट्स जोड़ते हैं, और उसे सबमिट करते हैं।


5
XMLHTTPRequest विंडो को अपडेट नहीं करता है। क्या आप यह कहने की कोशिश कर रहे हैं कि मुझे AJAX को एक डॉक्यूमेंट के साथ समाप्त करना चाहिए। राइट (http.responseText)?
जोसेफ होल्स्टेन

11
यदि वह ढाँचा के साथ कुछ और करता है तो उसे 30k + को क्यों जोड़ना चाहिए?
दमनक

12

मैं अजाक्स मार्ग से नीचे जाऊँगा क्योंकि अन्य लोगों ने कुछ इस तरह सुझाया है:

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
बिना संदर्भ संदर्भित: क्वेरीस्टाइनिंग परिभाषित नहीं है।
राबर्ट्स

11

सबसे आसान तरीका अजाक्स पोस्ट अनुरोध का उपयोग कर रहा है:

$.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 जावास्क्रिप्ट पुस्तकालय पर आधारित है ।
डेविड आरआर

8
आप प्रश्न के बिंदु से भी चूक गए हैं - वह 'ब्राउज़र को किसी भिन्न पृष्ठ पर निर्देशित' करना चाहता है, न कि अजाक्स का अनुरोध करें।
काला

आप उत्तर की प्रतीक्षा कर सकते हैं और फिर दस्तावेज। अधिशेष = {url}; केवल जगह जिसकी मैं कल्पना कर सकता हूं यह काम नहीं करेगा यदि आप एक फ़ाइल डाउनलोड पर पुनर्निर्देशित कर रहे हैं।
एपिरोक्स

11

यहाँ मैंने इसे jQuery का उपयोग करके कैसे लिखा है। फ़ायरफ़ॉक्स और इंटरनेट एक्सप्लोरर में परीक्षण किया गया।

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
मेरे लिए काम किया। धन्यवाद। (क्रोम में परीक्षण किया गया)
dannie.f

2
मुझे लगता है कि यहां समस्या यह हो सकती है कि फॉर्म जमा करने से पहले हटा दिया जाए। मैंने सुना है कि कुछ ब्राउज़रों में यदि आप सबमिट पूर्ण होने से पहले स्थानांतरित करते हैं या हटाते हैं, तो हैंडलर आग नहीं लगाएंगे। इसके बजाय, हैंडलर में दस्तावेज़ से फ़ॉर्म निकालें।
जेफ डीक्यू

एक जादू की तरह काम करता है। फ़ायरफ़ॉक्स + क्रोम + IE11 पर परीक्षण किया गया - इसके लिए बहुत बहुत धन्यवाद!
देउंज

6

प्रोटोटाइप पुस्तकालय एक Hashtable वस्तु, एक ".toQueryString ()" विधि है, जो आप आसानी से एक प्रश्न-स्ट्रिंग शैली स्ट्रिंग में JavaScript ऑब्जेक्ट / संरचना चालू करने के लिए अनुमति देता है के साथ शामिल हैं। चूंकि पोस्ट को क्वेरी-स्ट्रिंग स्वरूपित स्ट्रिंग होने के लिए अनुरोध के "निकाय" की आवश्यकता होती है, इसलिए यह आपके 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

अभी तक एक और पुनरावर्ती समाधान है, क्योंकि कुछ अन्य टूटे हुए लगते हैं (मैंने उन सभी का परीक्षण नहीं किया)। यह एक लैश 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 लाइब्रेरी और इसके स्ट्रिंग फंक्शन का उपयोग करता है।

यह कोड एक रेल बैक-एंड के साथ अच्छी तरह से काम करता है, हालांकि आपको इसे संशोधित करने के लिए जो भी बैकएंड की आवश्यकता है, उसे संशोधित करने के लिए दिए गए विकल्पों को संशोधित करके काम करने में सक्षम होना चाहिए। रेल की आवश्यकता है कि arrayFormat को "कोष्ठक" पर सेट किया जाए।

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"]
        }
      ]
    });

इन रेल मापदंडों का उत्पादन करता है:

{"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

यह एलन के विकल्प 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

मैं दस्तावेज़ का उपयोग करता हूं। जावा और लूप को फॉर्म के सभी तत्वों को प्राप्त करने के लिए उपयोग करता हूं, फिर xhttp के माध्यम से भेजता हूं। तो यह जावास्क्रिप्ट / अजाक्स जमा के लिए मेरा समाधान है (उदाहरण के रूप में शामिल सभी 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 के साथ गहरे नेस्टेड पार्म्स को संभाला नहीं है, इसलिए यहां मेरा दो सेंट समाधान है।

यदि आप 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({'q':'a'}, 'http://example.com/');

उम्मीद है की यह मदद करेगा।

नोट 2: कोड को रीडायरेक्ट प्लगइन से लिया गया था । मैंने मूल रूप से अपनी आवश्यकताओं के लिए इसे सरल बनाया।


-1

पोस्ट या GET के साथ रीडायरेक्ट के लिए jQuery प्लगइन:

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 सीन

यह समाधान अभी भी हमारे लिए ठीक चल रहा है, अगर आपने इसे डाउन-वोट किया है, तो कृपया एक टिप्पणी छोड़ दें कि क्यों।
ओग शॉन

-2

आप एक AJAX कॉल कर सकते हैं (संभवतः एक पुस्तकालय का उपयोग कर सकते हैं जैसे कि Prototyp.js या JQuery का उपयोग करके)। AJAX GET और POST दोनों विकल्पों को संभाल सकता है।


5
XMLHttpRequest का उपयोग करके ब्राउज़र को किसी अन्य पृष्ठ पर निर्देशित नहीं किया जाएगा।
जॉनी बुकानन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.