2009-07-15 36 views
9

Chỉnh sửa: Điều tôi thực sự cần biết là nếu có bất kỳ sự kiện javascript nào đáng tin cậy sẽ cháy khi người dùng đến trang thông qua nút quay lại. Tôi đã thử sự kiện onload cho phần tử body nhưng không kích hoạt trên Firefox hoặc Safari.Tôi có thể phát hiện khi người dùng truy cập trang bằng nút quay lại không?


Tôi đang làm việc với một số mã cũ mà cố gắng để ngăn chặn đúp nộp dữ liệu mẫu bằng cách tắt tất cả các nút hình thức trình ngay sau khi người dùng nhấp một (bằng cách lắng nghe sự kiện onsubmit của mẫu). Mã này được áp dụng cho mọi biểu mẫu trong ứng dụng, bất kể việc gửi hai lần có còn là vấn đề hay không.

Vấn đề là nếu người dùng nhấn nút quay lại trong Firefox hoặc Safari, tất cả các nút gửi vẫn bị tắt khi anh truy cập trang. Trên Firefox, chúng thậm chí bị vô hiệu hóa sau khi làm mới (chỉ một lần làm mới Ctrl + F5 sẽ làm điều đó)!

Tôi đã thử nghe sự kiện onLoad của , nhưng FF và Safari không kích hoạt khi bạn truy cập trang qua nút quay lại. (Điều thú vị là, nó được bắn vào một refresh mềm trên FF, mặc dù các nút vẫn được vô hiệu hóa.)


Dưới đây là một doc HTML rất đơn giản mà sẽ hiển thị những gì tôi muốn nói:

<html><body> 
<form name="theForm" id="theForm" action="test2.html" 
     onSubmit="document.theForm.theButton.disabled = true;"> 
    <input id="theButton" type="submit" name="theButton" value="Click me!" /> 
</form> 
</body></html> 

Lưu ý: Tôi đã thử nghiệm trên WinXP với IE8, FF3.5, Safari 4, Opera 9 và Chrome 2.0. Chỉ Safari và FF để nút bị tắt khi bạn sử dụng lại để truy cập chúng.

+0

bạn đã thử câu trả lời của mình chưa ?? – Eric

+0

vâng, tôi đã thêm nhận xét bên dưới (xin lỗi, tôi đã làm việc này tại nơi làm việc và đã đến lúc về nhà) – Kip

+0

Bản sao của http://stackoverflow.com/questions/54539/prevent-use-of-the-back- nút-in-ie và nhiều, nhiều người khác. Tìm kiếm http://stackoverflow.com/search?q=back+button –

Trả lời

1

Tôi không nghĩ bạn có thể kiểm tra nút quay lại một cách cụ thể, nhưng tôi tin rằng bạn có thể kiểm tra vị trí lịch sử của trình duyệt bằng Javascript.

+0

Bạn có thể so sánh history.current với history.length, nhưng chỉ khi kịch bản của bạn được tin cậy. – Kev

+0

Dường như các trình duyệt hiện đại (2012) không hỗ trợ history.current, vì vậy tôi đã thêm câu trả lời mới. – TecBrat

2

Đó không phải là hành vi mà bạn muốn, vì vậy họ không gửi hai lần bằng nút quay lại?

Dù sao, bạn có thể đặt cookie trên trang sau và phát hiện điều đó khi tải trên trang có biểu mẫu.

+0

trong một số trường hợp, có. vấn đề là nó được áp dụng đơn phương cho tất cả các biểu mẫu trong ứng dụng của chúng tôi và trong một số ứng dụng thực sự có ý nghĩa cho người dùng quay lại và sử dụng nút gửi khác để chuyển sang chế độ xem khác. (Tôi đã không thiết kế nó, tôi chỉ cố gắng để làm việc với nó) – Kip

2

Có. Trong javascript, bạn có thể sử dụng visited.value

function checkrefresh() 
var visited = getCookie("visited"); 
{ 
     if((form.visited.value == '' || form.visited.value == null) && (visited != '1')) 
     { 
      document.form.visited.value = "1"; 
        document.cookie = "visited=1"; 
        //here you set it to something so that next time they go to the page it will no longer be nothing and you can 'disable the button' see below. 

     } 
     else 
     { 
      document.form.submitbutton.disabled=true; 
     } 
    } 

function getCookie(name) 
{ 
var re = new RegExp(name + "=([^;]+)"); 
var value = re.exec(document.cookie); 
return (value != null) ? unescape(value[1]) : null; 
} 

bạn sẽ gọi điều này trong thẻ onload FYI.

+0

Điều này chắc chắn làm việc cho tôi! – Eric

+0

điều này làm cho nó để làm mới sau khi nhấn trở lại sẽ kích hoạt lại nút, nhưng nút vẫn bị vô hiệu hóa sau khi nhấn trở lại. nếu không có giải pháp thay thế tốt hơn, tôi có thể phải sử dụng giải pháp này như một giải pháp thay thế. – Kip

+0

có. Làm mới thiết lập giá trị của truy cập trở lại 0. – Eric

0

Câu trả lời của @tkotitan có thể đúng khi anh ấy viết. Câu trả lời của ông đã dẫn tôi đến giải pháp của tôi. Nó không phải là dễ dàng, nhưng nó có thể là "đủ tốt" để giúp đỡ trong một số tình huống.

Tôi đã cải thiện tập lệnh của mình và thay thế nó bằng các bước sau. Phiên bản này dành cho trang trung gian hiện hoạt động như trung gian theo cả hai hướng.

<?php 
if($_SERVER['QUERY_STRING']=='') 
{ 
    echo '<a href="go_back_test.php?page=1">Go forward</a>'; 
} 
elseif($_GET['page']!=2) 
{ 
    echo 'You cannot stay here.'; 
    echo ' 
    <script type="text/javascript"> 
    function test() 
    { 
     if (document.getElementById("detectback").value=="goneback") 
     { 
      document.getElementById("detectback").value=history.length; 
     } 
     if (document.getElementById("detectback").value==history.length) 
     { 
      document.getElementById("detectback").value="goneforward"; 
      window.location = "go_back_test.php?page=2" 
     } 
     else 
     { 
      document.getElementById("detectback").value="goneback"; 
      window.history.back(); 
     } 
    } 
    function updateform() 
    { 
     if(document.getElementById("detectback").value=="") 
     { 
      document.getElementById("detectback").value=history.length; 
     } 
    } 
    </script> 
    <img src="spacer.gif" onload="updateform(); test();"><br> 
    <form> 
     <input id="detectback" type="text" value="" style="display: none;"> 
    </form> 
    '; 
} 
else 
{ 
    echo 'Welcome to page 2'; 
} 
?> 
Các vấn đề liên quan