2009-02-20 30 views
54

Tôi muốn tải lại một trang sử dụng:Làm cách nào để tải lại trang mà không có cảnh báo POSTDATA trong Javascript?

window.location.reload(true); 

Nhưng tôi nhận được cảnh báo POSTDATA vì chức năng làm mới muốn gửi lại dữ liệu hình thức POST trước. Làm cách nào để làm mới trang của tôi mà không có cảnh báo này?

CẬP NHẬT: Tôi không có quyền kiểm soát dự án! Tôi không thể giải quyết vấn đề POST!

+0

gửi lại POST (tải lại là gì) sẽ luôn hiển thị cảnh báo đó. Bạn có thể làm một POST thay vì tải lại, mặc dù điều đó sẽ lấp đầy lịch sử trình duyệt của người dùng nếu bạn làm điều đó quá thường xuyên và họ vẫn sẽ nhận được cảnh báo nếu họ nhấn nút quay lại. –

+1

Nhân bản: http://stackoverflow.com/questions/1073593/php-reload-page-without-posting-data/1073732#1073732 – Quentin

Trả lời

55

Chỉ cần thay đổi window.location trong JavaScript là nguy hiểm vì người sử dụng vẫn có thể nhấn nút lại và gửi lại bài viết, trong đó có thể có kết quả bất ngờ (chẳng hạn như một trùng lặp mua). PRG là một giải pháp tốt hơn nhiều

Use the Post/Redirect/Get (PRG) pattern

Để tránh vấn đề này, nhiều ứng dụng web sử dụng mô hình PRG - thay vì trả lại một trang HTML trực tiếp, hoạt động POST trả về một lệnh chuyển hướng (bằng cách sử dụng HTTP 303 mã phản hồi (đôi khi 302) cùng với tiêu đề phản hồi "Vị trí" HTTP, hướng dẫn trình duyệt tải một trang khác bằng cách sử dụng yêu cầu HTTP GET. Trang kết quả sau đó có thể được đánh dấu trang hoặc tải lại một cách an toàn mà không có các tác dụng phụ không mong muốn.

+0

Tôi không kiểm soát được dự án. Tôi không thể giải quyết vấn đề POST! – Ricibald

+0

PRG được thực hiện sau POST, âm thầm chuyển hướng máy khách đến trang GET để họ không có POST trong lịch sử của họ. (Đó là giá trị đưa lên với bất cứ ai không có quyền kiểm soát.) Nếu đó là một cái gì đó bạn không thể làm sau đó bạn có thể điều hướng đến một trang GET thay vì tải lại POST? –

+3

Có, nhưng chuyển hướng một POST yêu cầu một số hình thức kiểm soát – Ricibald

101

Bạn không thể làm mới mà không có cảnh báo; làm mới hướng dẫn trình duyệt lặp lại hành động cuối cùng. Tùy thuộc vào trình duyệt để chọn có cảnh báo người dùng nếu lặp lại hành động cuối cùng liên quan đến việc gửi lại dữ liệu hay không.

Bạn có thể tái điều hướng đến cùng một trang với một phiên tươi bằng cách làm:

window.location = window.location.href; 
+0

người dùng vẫn có thể nhấn nút quay lại và gửi lại bài đăng, có thể có kết quả không mong muốn (chẳng hạn như mua hàng trùng lặp). PRG là một giải pháp tốt hơn nhiều. –

+0

Có thể, nhưng nếu người dùng nhấp chuột trở lại vì lý do nào đó họ vẫn sẽ nhận được cảnh báo, vì vậy có lẽ việc sử dụng PRG phụ thuộc vào hậu quả của việc gửi lại là gì. – AJM

+0

đúng, nếu máy chủ nhận ra các bài đăng trùng lặp thì đó không phải là vấn đề, nhưng người dùng vẫn được trình bày với một hộp thoại để lo lắng. Với PRG, người dùng sẽ không bao giờ thấy hộp thoại đó. –

2

Nếu bạn đang ở giai đoạn mà bạn đã kết thúc với bài dữ liệu và chỉ đơn giản là muốn xem trang một lần nữa lại lần nữa , bạn có thể chỉ cần sử dụng một window.location và thậm chí có thể nối thêm một chuỗi ngẫu nhiên như một paramater truy vấn để đảm bảo một phiên bản mới của trang.

-1

Nếu bạn sử dụng phương pháp GET thay vì POST thì chúng tôi không thể gửi biểu mẫu giá trị. Nếu bạn sử dụng window.opener.location.href = window.opener.location.href; thì chúng ta có thể kích hoạt db và chúng ta có thể nhận được giá trị nhưng điều duy nhất là JSP không làm mới eventhough scriplet có các giá trị biểu mẫu.

5

cách window.location.replace (window.location.href);

+0

Không hoạt động với '# hash' – mpen

12

Để bỏ qua cảnh báo POST, bạn phải tải lại trang có URL đầy đủ. Hoạt động tốt.

window.location.href = window.location.protocol +'//'+ window.location.host + window.location.pathname; 
+0

Điều này không hoạt động. Mặc dù nó bỏ qua cảnh báo POST, nó cũng bỏ qua việc gửi bất kỳ biến bài đăng nào có thể được yêu cầu. – iankit

+0

Thêm window.location.hash vào cuối. –

+0

Để biết URL đầy đủ có giao thức (nếu không phải 80) và tham số, hãy xem http://bl.ocks.org/abernier/3070589. –

2
<html:form name="Form" type="abc" action="abc.do" method="get" onsubmit="return false;"> 

method="get" - giải quyết vấn đề.

if method="post" thì cảnh báo chỉ xuất hiện.

16

tôi đã có một số vấn đề với neo/băm-url (bao gồm #) không tải lại bằng cách sử dụng giải pháp từ Rex ...

Vì vậy, cuối cùng tôi đã kết thúc bằng cách xóa phần băm:

window.location = window.location.href.split("#")[0]; 
+0

có cùng vấn đề với url băm của tôi, giờ nó hoạt động tốt - cảm ơn! :) – Bohne

2

phiên bản Nikl của không vượt qua được các thông số truy vấn, tôi đã sử dụng phiên bản sửa đổi như sau:

window.location.href = window.location.protocol +'//'+ window.location.host + window.location.pathname + window.location.search; 

hoặc trong trường hợp của tôi, tôi cần để nạp lại các trang \ khung trên cùng, vì vậy tôi sử dụng phiên bản sau

window.top.location.href = window.top.location.protocol +'//'+ window.top.location.host + window.top.location.pathname + window.top.location.search; 
+0

Phương pháp này hoạt động cho bài đăng của tôi và nhận phương thức. – soniality

0

Tôi đã viết một chức năng sẽ tải lại trang mà không cần gửi bài và cũng sẽ hoạt động với băm.

Tôi làm điều này bằng cách thêm/sửa đổi tham số GET trong URL được gọi là reload bằng cách cập nhật giá trị của nó bằng dấu thời gian hiện tại bằng ms.

var reload = function() { 
    var regex = new RegExp("([?;&])reload[^&;]*[;&]?"); 
    var query = window.location.href.split('#')[0].replace(regex, "$1").replace(/&$/, ''); 
    window.location.href = 
     (window.location.href.indexOf('?') < 0 ? "?" : query + (query.slice(-1) != "?" ? "&" : "")) 
     + "reload=" + new Date().getTime() + window.location.hash; 
}; 

Hãy nhớ, nếu bạn muốn kích hoạt chức năng này trong một thuộc tính href, thực hiện nó theo cách này: href="javascript:reload();void 0;" để làm cho nó hoạt động, thành công.

Nhược điểm của giải pháp của tôi là nó sẽ thay đổi URL, do đó, "tải lại" không phải là tải lại thực, thay vào đó là tải với truy vấn khác. Tuy nhiên, nó có thể phù hợp với nhu cầu của bạn như nó cho tôi.

0

này đã làm việc

<button onclick="window.location.href=window.location.href; return false;">Continue</button> 

Lý do nó đã không làm việc mà không có sự

return false;
là trước đây điều trị đó như là một hình thức nút gửi. Với một trả về rõ ràng sai trên nó, nó không làm việc gửi biểu mẫu và chỉ tải lại cùng một trang là kết quả của một POST trước đó đến trang đó.

Các vấn đề liên quan