chuyển dữ liệu bài đăng với window.location.href


113

Khi sử dụng window.location.href, tôi muốn chuyển dữ liệu POST sang trang mới mà tôi đang mở. điều này có thể sử dụng JavaScript và jQuery không?


11
Cài đặt window.location.hrefthực hiện yêu cầu GET cho URL mới, không phải ĐĂNG.
Chetan S

Câu trả lời:


85

Sử dụng window.location.href, không thể gửi yêu cầu ĐĂNG.

Những gì bạn phải làm là thiết lập một formthẻ với các trường dữ liệu trong đó, đặt actionthuộc tính của biểu mẫu thành URL và methodthuộc tính thành POST, sau đó gọi submitphương thức trên formthẻ.


Tôi có dữ liệu đến từ 3 hình thức khác nhau và tôi đang cố gắng để gửi tất cả 3 hình thức đến cùng một trang vì vậy tôi đã cố gắng để serialize các hình thức với jQuery và gửi cho họ một số cách khác
Brian

@Brian: Bạn không thể chỉ đặt mọi thứ trong một formđể mọi thứ được gửi cùng nhau một cách tự động?
Marcel Korpel

Một biểu mẫu nằm trong hộp thoại jQueryUI - vì vậy tôi không thể chỉ bao gồm tất cả chúng.
Brian

12
Rút ra tất cả các giá trị của chúng, tạo động một biểu mẫu với tất cả các trường ở cả ba biểu mẫu và gửi biểu mẫu đó. Biểu mẫu có thể vô hình. Không sử dụng phương thức JQuery AJAX, hãy sử dụng $("#myForm").submit(). Biểu mẫu - sẽ ẩn và chỉ được sử dụng để gửi các giá trị từ mã phía máy khách của bạn, không phải do người dùng nhập - sẽ không bao giờ được hiển thị cũng như không được sử dụng theo cách khác và trang sẽ được làm mới.
Matt Luongo

79

Thêm biểu mẫu vào HTML của bạn, giống như sau:

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

và sử dụng JQuery để điền các giá trị này (tất nhiên bạn cũng có thể sử dụng javascript để làm điều gì đó tương tự)

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

Sau đó cuối cùng gửi biểu mẫu

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

ở phía máy chủ, bạn sẽ có thể lấy dữ liệu bạn đã gửi bằng cách kiểm tra var1var2cách thực hiện việc này tùy thuộc vào ngôn ngữ phía máy chủ bạn đang sử dụng.


khi tôi làm điều này, tôi khiến trình duyệt của mình chuyển hướng đến miền / không xác định. Tôi đang làm gì sai?
cảnh giác


9

Như đã nói trong các câu trả lời khác, không có cách nào để thực hiện yêu cầu ĐĂNG bằng window.location.href, để làm điều đó, bạn có thể tạo một biểu mẫu và gửi nó ngay lập tức.

Bạn có thể sử dụng chức năng này:

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

Câu trả lời ngắn gọn: không. window.location.hrefkhông có khả năng chuyển dữ liệu POST.

Câu trả lời hơi hài lòng hơn: Bạn có thể sử dụng chức năng này để sao chép tất cả dữ liệu biểu mẫu của mình và gửi nó.

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);
            }
        }
    }
}
  • Thực hiện submitMe.importFields(form_element);cho từng trong ba biểu mẫu bạn muốn gửi.
  • Hàm này sẽ thêm tên của mỗi biểu mẫu vào tên của các đầu vào con của nó (Nếu bạn có <input name="email">trong <form name="login">, tên đã gửi sẽ là login_name.
  • Bạn có thể thay đổi nameJoinerbiến thành một cái gì đó khác _để nó không xung đột với sơ đồ đặt tên đầu vào của bạn.
  • Khi bạn đã nhập tất cả các biểu mẫu cần thiết, hãy submitMe.submit();

4

nó đơn giản như thế này

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

Tôi phải giải quyết vấn đề này để tạo khóa màn hình cho ứng dụng của mình, nơi tôi phải chuyển dữ liệu nhạy cảm với tư cách người dùng và url nơi anh ta đang làm việc. Sau đó, tạo một hàm thực thi mã này


1
Hoặc trong done()bộ chức năngwindow.location.href
Chris Edwards

Có @ChrisEdwards, trong ví dụ của tôi, tôi cố gắng sử dụng dữ liệu trả về te từ bài đăng jquery. Tôi hy vọng rằng nó sẽ hữu ích cho ai đó.
Sergio Roldan

3

Bạn đã xem xét việc sử dụng Local / Session Storage một cách đơn giản chưa? -hoặc- Tùy thuộc vào độ phức tạp của những gì bạn đang xây dựng; bạn thậm chí có thể sử dụng indexDB.

lưu ý :

Local storageindexDBkhông an toàn - vì vậy bạn muốn tránh lưu trữ bất kỳ dữ liệu nhạy cảm / cá nhân nào (ví dụ như tên, địa chỉ, địa chỉ email, DOB, v.v.) trong một trong hai dữ liệu này.

Session Storage là một tùy chọn an toàn hơn cho bất kỳ thứ gì nhạy cảm, nó chỉ có thể truy cập vào nguồn gốc đặt các mục và cũng sẽ xóa ngay sau khi trình duyệt / tab được đóng.

IndexDBphức tạp hơn một chút [nhưng không nhiều] và được tích 30MB noSQL databasehợp vào mọi trình duyệt (nhưng về cơ bản có thể không giới hạn nếu người dùng chọn tham gia) -> lần tới khi bạn sử dụng tài liệu của Google, hãy mở DevTools -> ứng dụng -> IndexDB và có một đỉnh cao. [cảnh báo spoiler: nó được mã hóa].

Tập trung vào LocalSession Storage; cả hai đều rất đơn giản để sử dụng:

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

Nếu đơn giản không phải là điều của bạn - hoặc- có thể bạn muốn đi tắt đón đầu và thử một cách tiếp cận khác cùng nhau -> bạn có thể sử dụng shared web worker... bạn biết đấy, chỉ dành cho những cú đá.


-4

Bạn có thể sử dụng GET thay vì vượt qua, nhưng không sử dụng phương pháp này cho các giá trị quan trọng,

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

Trong CustomerBasket.php

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

3
phương thức GET của nó nhưng câu hỏi là POST phương pháp bạn thân
Thamaraiselvam

@thamaraiselvam Kissa Mia có thể chưa hiểu rõ câu trả lời nhưng nói đúng về lộ trình GET ở đây. Câu hỏi không khó sử dụng phương pháp POST - người dùng chỉ hỏi liệu có cách nào để lấy dữ liệu POST và gửi nó qua window.location.href hay không. Và trước tiên bạn nên biết rằng Window.location.href một yêu cầu GET. Câu trả lời này không sai - đơn giản là sẽ không dễ dàng mở rộng thành một số lượng lớn các trường biểu mẫu, được mã hóa dưới dạng QueryString. Tuy nhiên, cách rõ ràng nhất để gửi dữ liệu qua URL (đó là những gì bạn có thể thay đổi với window.location.href) là thông qua các tham số chuỗi truy vấn.
SylonZero

@SylonZero Bạn không thể đính kèm dữ liệu POST vào một yêu cầu GET. Chúng là các loại yêu cầu khác nhau và dữ liệu trông khác nhau trong BÀI ĐĂNG. Các phần quan trọng của thông số HTTP khá ngắn.
Colin vH

@ColinvH Bạn cần đọc kỹ hơn những gì tôi đã viết. Phiên bản TLDR: bạn có thể lấy dữ liệu sẽ được sử dụng để tạo POST và mã hóa nó dưới dạng tham số chuỗi truy vấn.
SylonZero
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.