window.location.href के साथ पोस्ट डेटा पास करें


113

जब मैं window.location.href का उपयोग कर रहा हूं, तो मैं उस नए पृष्ठ पर POST डेटा पास करना चाहूंगा जो मैं खोल रहा हूं। क्या यह जावास्क्रिप्ट और jQuery का उपयोग करना संभव है?


11
सेटिंग window.location.hrefनए URL के लिए GET अनुरोध करता है, POST के लिए नहीं।
चेतन एस

जवाबों:


85

window.location.hrefइसका उपयोग करके POST अनुरोध भेजना संभव नहीं है।

आपको क्या करना है form, इसमें डेटा फ़ील्ड के साथ एक टैग सेट actionकरना है, URL के लिए फ़ॉर्म की methodविशेषता और POST की विशेषता सेट करें, फिर टैग submitपर विधि को कॉल करें form


मेरे पास 3 अलग-अलग रूपों से आने वाले डेटा हैं और मैं सभी 3 रूपों को एक ही पृष्ठ पर भेजने की कोशिश कर रहा हूं, इसलिए मैं jQuery के साथ रूपों को क्रमबद्ध करने और उन्हें किसी अन्य तरीके से भेजने की कोशिश कर रहा हूं
ब्रायन

@ ब्रायन: क्या आप सब कुछ एक में नहीं डाल सकते form, इसलिए सब कुछ अपने आप एक साथ भेजा जाता है?
मार्सेल कोर्पल

एक रूप jQueryUI संवाद बॉक्स में है - इसलिए मैं उन सभी को शामिल नहीं कर सकता।
ब्रायन

12
उनके सभी मानों को खींचो, गतिशील रूप से सभी तीन रूपों में सभी फ़ील्ड्स के साथ एक फ़ॉर्म बनाएँ, और उस फ़ॉर्म को सबमिट करें। रूप अदृश्य हो सकता है। JQuery AJAX विधि का उपयोग न करें, उपयोग करें $("#myForm").submit()। प्रपत्र- जो अदृश्य होगा, और केवल आपके क्लाइंट साइड कोड से मान जमा करने के लिए उपयोग किया जाएगा, न कि उपयोगकर्ता इनपुट- को कभी भी दिखाया नहीं जाएगा या अन्यथा उपयोग नहीं किया जाएगा, और पृष्ठ ताज़ा हो जाएगा।
मैट लुओंगो

79

अपने HTML में एक फ़ॉर्म जोड़ें, कुछ इस तरह:

<form style="display: none" action="/the/url" method="POST" id="form">
  <input type="hidden" id="var1" name="var1" value=""/>
  <input type="hidden" id="var2" name="var2" value=""/>
</form>

और इन मूल्यों को भरने के लिए JQuery का उपयोग करें (निश्चित रूप से आप कुछ समान करने के लिए जावास्क्रिप्ट का उपयोग भी कर सकते हैं)

$("#var1").val(value1);
$("#var2").val(value2);

फिर अंत में फॉर्म सबमिट करें

$("#form").submit();

सर्वर की ओर से आपको आपके द्वारा भेजे गए डेटा को प्राप्त करने में सक्षम होना चाहिए var1और var2, यह कैसे करना है यह इस बात पर निर्भर करता है कि आप किस सर्वर-साइड भाषा का उपयोग कर रहे हैं।


जब मैं ऐसा करता हूं, तो मुझे अपना ब्राउज़र डोमेन / अपरिभाषित पर रीडायरेक्ट करने के लिए मिलता है। मैं क्या गलत कर रहा हूं?
vigamage


9

जैसा कि अन्य उत्तरों में कहा गया था कि window.location.href का उपयोग करके POST अनुरोध करने का कोई तरीका नहीं है, ऐसा करने के लिए आप एक फ़ॉर्म बना सकते हैं और तुरंत सबमिट कर सकते हैं।

आप इस फ़ंक्शन का उपयोग कर सकते हैं:

function postForm(path, params, method) {
    method = method || 'post';

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

    for (var key in params) {
        if (params.hasOwnProperty(key)) {
            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();
}

postForm('mysite.com/form', {arg1: 'value1', arg2: 'value2'});

https://stackoverflow.com/a/133997/2965158


8

संक्षिप्त उत्तर: नहीं। window.location.hrefPOST डेटा पास करने में सक्षम नहीं है।

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

var submitMe = document.createElement("form");
submitMe.action = "YOUR_URL_HERE"; // Remember to change me
submitMe.method = "post";
submitMe.enctype = "multipart/form-data";
var nameJoiner = "_";
// ^ The string used to join form name and input name
//   so that you can differentiate between forms when
//   processing the data server-side.
submitMe.importFields = function(form){
    for(k in form.elements){
        if(input = form.elements[k]){
            if(input.type!="submit"&&
                     (input.nodeName=="INPUT"
                    ||input.nodeName=="TEXTAREA"
                    ||input.nodeName=="BUTTON"
                    ||input.nodeName=="SELECT")
                     ){
                var output = input.cloneNode(true);
                output.name = form.name + nameJoiner + input.name;
                this.appendChild(output);
            }
        }
    }
}
  • क्या submitMe.importFields(form_element);तीन रूपों आप प्रस्तुत करना चाहते से प्रत्येक के लिए।
  • यह फ़ंक्शन प्रत्येक फॉर्म के नाम को उसके चाइल्ड इनपुट के नाम से जोड़ देगा (यदि आपके पास एक <input name="email">है <form name="login">, तो सबमिट किया गया नाम होगा login_name
  • आप nameJoinerचर को किसी अन्य चीज़ से बदल सकते हैं _ताकि यह आपके इनपुट नामकरण योजना के साथ संघर्ष न करे।
  • एक बार जब आप सभी आवश्यक फ़ॉर्म आयात कर लेते हैं, तो करें submitMe.submit();

4

यह इतना सरल है

$.post({url: "som_page.php", 
    data: { data1: value1, data2: value2 }
    ).done(function( data ) { 
        $( "body" ).html(data);
    });
});

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


1
या done()समारोह सेट मेंwindow.location.href
क्रिस एडवर्ड्स

हां @ChrisEdwards, मेरे उदाहरण में मैं jquery पोस्ट से ते रिटर्न डेटा का उपयोग करने का प्रयास करता हूं। मुझे उम्मीद है कि यह किसी के लिए उपयोगी होगा।
सर्जियो रोल्डन

3

क्या आपने केवल स्थानीय / सत्र भंडारण का उपयोग करने पर विचार किया है? -या- आप जो निर्माण कर रहे हैं उसकी जटिलता पर निर्भर करता है; तुम भी indexDB का उपयोग कर सकते हैं।

नोट :

Local storageऔर indexDBसुरक्षित नहीं हैं - इसलिए आप इन दोनों में से किसी भी संवेदनशील / व्यक्तिगत डेटा (जैसे नाम, पते, ईमेल पते, डीओबी आदि) के भंडारण से बचना चाहते हैं।

Session Storage कुछ भी संवेदनशील के लिए एक अधिक सुरक्षित विकल्प है, यह केवल उस मूल के लिए सुलभ है जो आइटम सेट करता है और जैसे ही ब्राउज़र / टैब बंद होता है, वह भी साफ हो जाता है।

IndexDBथोड़ा और अधिक [लेकिन बहुत अधिक नहीं] जटिल है और 30MB noSQL databaseहर ब्राउज़र में बनाया गया है (लेकिन यदि उपयोगकर्ता इसका विरोध करता है तो मूल रूप से असीमित हो सकता है) -> अगली बार जब आप Google डॉक्स का उपयोग कर रहे हैं, तो आप DevTools खोलें -> एप्लिकेशन -> IndexDB और एक चोटी ले लो। [स्पॉइलर अलर्ट: यह एन्क्रिप्टेड है]।

पर ध्यान केंद्रित करना Localऔर Session Storage; ये दोनों मृत सरल हैं:

// To Set 
sessionStorage.setItem( 'key' , 'value' );

// e.g.
sessionStorage.setItem( 'formData' , { name: "Mr Manager", company: "Bluth's Frozen Bananas", ...  } );    

// Get The Data 
const fromData = sessionStorage.getItem( 'key' );     

// e.g. (after navigating to next location)
const fromData = sessionStorage.getItem( 'formData' );

// Remove 
sessionStorage.removeItem( 'key' );

// Remove _all_ saved data sessionStorage
sessionStorage.clear( ); 

अगर सरल आपकी चीज नहीं है, तो-हो सकता है कि आप सड़क पर जाना चाहते हैं और सभी को एक अलग दृष्टिकोण की कोशिश करना चाहते हैं -> आप शायद एक का उपयोग कर सकते हैं shared web worker... y'know, सिर्फ kicks के लिए।


-4

आप पास के बजाय GET का उपयोग कर सकते हैं, लेकिन महत्वपूर्ण मानों के लिए इस पद्धति का उपयोग न करें,

function passIDto(IDval){    
window.location.href = "CustomerBasket.php?oridd=" +  IDval ;
}   

CustomerBasket.php में

<?php
  $value = $_GET["oridd"];
  echo  $value;
?>

3
इसकी GET विधि लेकिन सवाल POST विधि मित्र है
Thamaraiselvam

@thamaraiselvam किस्सा मिया जवाब अच्छी तरह से phrased है नहीं हो सकता है लेकिन सही मार्ग के बारे में यहाँ है। POST पद्धति का उपयोग करने के लिए सवाल का जवाब नहीं दिया गया है - उपयोगकर्ता ने केवल पूछा कि क्या POST डेटा लेने और window.location.href के माध्यम से भेजने का एक तरीका था । और अगर आप पहले पता होना चाहिए कि Window.location.href है GET अनुरोध। यह उत्तर गलत नहीं है - यह क्वारीस्ट्रिंग के रूप में एन्कोड किए गए फ़ॉर्म फ़ील्ड की एक बड़ी संख्या को स्केल करना आसान नहीं होगा। हालांकि, URL के माध्यम से डेटा भेजने का सबसे स्पष्ट तरीका है (जो कि आप window.location.href के साथ बदल सकते हैं) स्ट्रिंग स्ट्रिंग मापदंडों के माध्यम से है।
सिलोनजेरो

@SylonZero आप पोस्ट डेटा को GET अनुरोध में संलग्न नहीं कर सकते। वे विभिन्न प्रकार के अनुरोध हैं और डेटा एक POST में अलग दिखता है। HTTP कल्पना के महत्वपूर्ण भाग काफी कम हैं।
कॉलिन vH

@ColinvH आपको पढ़ने की ज़रूरत है कि मैंने क्या और अधिक ध्यान से लिखा है। TLDR संस्करण: आप उस डेटा को ले सकते हैं जिसका उपयोग POST उत्पन्न करने के लिए किया जाएगा और इसे क्वेरी स्ट्रिंग परम के रूप में एनकोड किया जाएगा।
सिलेन्जेरो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.