ส่งผ่านข้อมูลด้วย window.location.href


113

เมื่อใช้ window.location.href ฉันต้องการส่งข้อมูล POST ไปยังเพจใหม่ที่ฉันเปิด เป็นไปได้ไหมโดยใช้ JavaScript และ jQuery


11
การตั้งค่าwindow.location.hrefเป็นการร้องขอ GET สำหรับ URL ใหม่ไม่ใช่ POST
Chetan S

คำตอบ:


85

การใช้window.location.hrefไม่สามารถส่งคำขอ POST ได้

สิ่งที่คุณต้องทำคือตั้งค่าformแท็กที่มีช่องข้อมูลตั้งค่าactionแอตทริบิวต์ของฟอร์มเป็น URL และmethodแอตทริบิวต์เป็น POST จากนั้นเรียกใช้submitเมธอดบนformแท็ก


ฉันมีข้อมูลที่มาจาก 3 รูปแบบที่แตกต่างกันและฉันกำลังพยายามส่งทั้ง 3 แบบฟอร์มไปยังหน้าเดียวกันดังนั้นฉันจึงพยายามทำให้แบบฟอร์มเป็นอนุกรมกับ jQuery และส่งด้วยวิธีอื่น
Brian

@ ไบรอัน: คุณไม่สามารถรวมทุกอย่างไว้ในที่เดียวformเพื่อให้ทุกอย่างถูกส่งเข้าด้วยกันโดยอัตโนมัติ?
Marcel Korpel

รูปแบบหนึ่งอยู่ในกล่องโต้ตอบ jQueryUI - ดังนั้นฉันจึงไม่สามารถรวมได้ทั้งหมด
Brian

12
ดึงค่าทั้งหมดออกมาสร้างแบบฟอร์มพร้อมฟิลด์ทั้งหมดในรูปแบบทั้งสามแบบไดนามิกและส่งแบบฟอร์มนั้น แบบฟอร์มสามารถมองไม่เห็น อย่าใช้ JQuery AJAX $("#myForm").submit()วิธีการใช้งาน แบบฟอร์มซึ่งจะมองไม่เห็นและใช้ในการส่งค่าจากโค้ดฝั่งไคลเอ็นต์ของคุณเท่านั้นไม่ใช่ข้อมูลที่ผู้ใช้ป้อนจะไม่ถูกแสดงหรือใช้เป็นอย่างอื่นและเพจจะรีเฟรช
Matt Luongo

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 เพื่อเติมเต็มค่าเหล่านี้ (แน่นอนคุณสามารถใช้ javascript เพื่อทำสิ่งที่คล้ายกันได้)

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

จากนั้นส่งแบบฟอร์มในที่สุด

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

ทางฝั่งเซิร์ฟเวอร์คุณควรจะได้รับข้อมูลที่คุณส่งโดยการตรวจสอบvar1และvar2วิธีการทำจะขึ้นอยู่กับภาษาฝั่งเซิร์ฟเวอร์ที่คุณใช้


เมื่อฉันทำสิ่งนี้ฉันจะทำให้เบราว์เซอร์เปลี่ยนเส้นทางไปยังโดเมน / ไม่ได้กำหนด ผมทำอะไรผิดหรือเปล่า?
vigamage


9

ตามที่ได้กล่าวไว้ในคำตอบอื่น ๆ ไม่มีวิธีใดในการส่งคำขอ POST โดยใช้ window.location.href คุณสามารถสร้างแบบฟอร์มและส่งได้ทันที

คุณสามารถใช้ฟังก์ชันนี้:

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.hrefไม่สามารถส่งผ่านข้อมูล POST ได้

คำตอบที่ค่อนข้างน่าพอใจกว่า: คุณสามารถใช้ฟังก์ชันนี้เพื่อโคลนข้อมูลแบบฟอร์มทั้งหมดของคุณและส่งได้

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

ฉันต้องแก้ปัญหานี้เพื่อทำการล็อกหน้าจอของแอปพลิเคชันของฉันซึ่งฉันต้องส่งผ่านข้อมูลที่ละเอียดอ่อนในฐานะผู้ใช้และ URL ที่เขาทำงานอยู่ จากนั้นสร้างฟังก์ชันที่รันโค้ดนี้


1
หรือในdone()ชุดฟังก์ชันwindow.location.href
Chris Edwards

ใช่ @ChrisEdwards ในตัวอย่างของฉันฉันพยายามใช้ te return data จาก jquery post หวังว่าคงจะเป็นประโยชน์กับใครบางคน
Sergio Roldan

3

คุณพิจารณาเพียงแค่ใช้ Local / Session Storage หรือไม่? - หรือ - ขึ้นอยู่กับความซับซ้อนของสิ่งที่คุณกำลังสร้าง คุณสามารถใช้ indexDB

หมายเหตุ :

Local storageและindexDBไม่ปลอดภัย - ดังนั้นคุณจึงต้องการหลีกเลี่ยงการจัดเก็บข้อมูลที่ละเอียดอ่อน / ข้อมูลส่วนบุคคล (เช่นชื่อที่อยู่อีเมล DOB ฯลฯ ) ในอย่างใดอย่างหนึ่ง

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... คุณรู้เพียงเพื่อเตะ


-4

คุณสามารถใช้ GET แทน pass แต่อย่าใช้วิธีนี้สำหรับค่าที่สำคัญ

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

ใน CustomerBasket.php

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

3
วิธี GET แต่คำถามคือ POST method buddy
Thamaraiselvam

@thamaraiselvam Kissa Mia อาจไม่ได้วลีคำตอบที่ดี แต่ถูกต้องเกี่ยวกับเส้นทาง GET ที่นี่ คำถามไม่ได้ใช้วิธีการ POST - ผู้ใช้ถามว่ามีวิธีดำเนินการหรือไม่ข้อมูล POST หรือไม่และส่งผ่าน window.location.href และก่อนอื่นคุณควรทราบว่า Window.location.href เป็นคำขอ GET คำตอบนี้ไม่ผิด - มันไม่ง่ายเลยที่จะปรับขนาดเป็นฟิลด์ฟอร์มจำนวนมากที่เข้ารหัสเป็น QueryString อย่างไรก็ตามวิธีที่ชัดเจนที่สุดในการส่งข้อมูลผ่าน URL (ซึ่งเป็นสิ่งที่คุณสามารถเปลี่ยนแปลงได้ด้วย window.location.href) คือผ่านพารามิเตอร์สตริงการสืบค้น
SylonZero

@SylonZero คุณไม่สามารถแนบข้อมูล POST กับคำขอ GET เป็นคำขอประเภทต่างๆและข้อมูลมีลักษณะแตกต่างกันใน POST ส่วนสำคัญของข้อมูลจำเพาะ HTTP ค่อนข้างสั้น
Colin vH

@ColinvH คุณต้องอ่านสิ่งที่ฉันเขียนอย่างละเอียดมากขึ้น เวอร์ชัน TLDR: คุณสามารถนำข้อมูลที่จะใช้ในการสร้าง POST และเข้ารหัสเป็นพารามิเตอร์สตริงการสืบค้น
SylonZero
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.