2013-07-21 35 views
12

Tôi đang cố gắng để làm cho ajax làm việc với nút quay lại và thiếu một cái gì đó trung tâm. Trạng thái trang trước đó được lưu trữ ở đâu?Ajax và nút quay lại. Thay đổi băm, nhưng trạng thái trang trước đó được lưu trữ ở đâu?

TRƯỜNG HỢP 1:

Bấm "làm cho tôi đỏ". sự kiện ajax xảy ra và trang chuyển sang màu đỏ. Hash = #red

Nhấp "làm cho tôi màu vàng". sự kiện ajax xảy ra và trang chuyển sang màu vàng. Hash = #yellow

Nhấp vào nút quay lại. Hash bây giờ trở lại #red. Nhưng tôi cũng muốn trang màu đỏ. Nó vẫn còn màu vàng.

TRƯỜNG HỢP 2:

Bấm "làm cho tôi đỏ". sự kiện ajax xảy ra và trang chuyển sang màu đỏ. Hash = #red

Nhấp "Chuyển đến trang web khác". Nó đi vào Google.

Nhấp vào nút quay lại. Chúng tôi quay trở lại trang web, hash = #red, nhưng tôi cũng muốn trang có màu đỏ!

<!DOCTYPE html> 
<html> 
<style> 
    .red{background:red} 
    .yellow{background:yellow} 
</style> 
<head> 
    <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 
    <script type="text/javascript"> 
    $(function(){ 
     $('.ajax_thing').click(function(){ 
      location.hash=$(this).attr('action_type'); 
      return false 
     }) 
     var originalTitle=document.title 
     function hashChange(){ 
      var page=location.hash.slice(1) 
      if (page!=""){ 
       $('#content').load(page+".html #sub-content") 
       document.title=originalTitle+' – '+page 
      } 
     } 
     if ("onhashchange" in window){ // cool browser 
      $(window).on('hashchange',hashChange).trigger('hashchange') 
     }else{ // lame browser 
      var lastHash='' 
      setInterval(function(){ 
       if (lastHash!=location.hash) 
        hashChange() 
       lastHash=location.hash 
      },100) 
     } 
    }) 

    </script> 
</head> 
<body> 
<menu> 
     <li><a class="ajax_thing" id = "red_action" action_type="red">Make me red</a></li> 
     <li><a class="ajax_thing" id = "yellow_action" action_type="yellow">Make me yellow</a></li> 
</menu> 
     <li><a href = "http://www.google.com">Go to other site</a></li> 
</body> 
</html> 
<script> 

$("#red_action").click(function(e) { 
    // ajax here. on success: 
    $("body").removeClass("yellow"); 
    $("body").addClass("red"); 
}) 

$("#yellow_action").click(function(e) { 
    // ajax here. on success: 
    $("body").removeClass("red"); 
    $("body").addClass("yellow"); 
}) 

</script> 
+1

Bạn nên xem https://github.com/browserstate/history.js/ – gmaliar

+0

Tôi không thấy bất kỳ yêu cầu 'ajax' nào và bạn cũng quên rất nhiều" dấu chấm phẩy " –

+1

Nó hoạt động nên dấu chấm phẩy bị thiếu phải là được. Tôi nắm lấy hầu hết mã từ nơi khác. Tôi không thực hiện yêu cầu ajax thực sự vì tôi muốn điều này làm việc cho mọi người ở đây chính xác như vậy. Nhưng tôi thay đổi dom, đó là những gì yêu cầu ajax sẽ làm. Bạn có nghĩ rằng một yêu cầu ajax thực sự là những gì kỳ diệu sẽ làm cho nó hoạt động? – user984003

Trả lời

5

Khi sử dụng AJAX điều quan trọng là để cập nhật lịch sử bằng tay sử dụng history.pushState

Sau đó tạo một thử nghiệm chức năng cho một sự kiện onpopstate và cập nhật các nội dung theo yêu cầu.

https://developer.mozilla.org/en-US/docs/Web/Guide/DOM/Manipulating_the_browser_history

+2

Chào mừng bạn đến Stack Overflow. Vui lòng tóm tắt các liên kết trong câu trả lời của bạn; theo cách đó, nếu các liên kết bị lỗi thời thì câu trả lời sẽ không hoàn toàn vô dụng. – michaelb958

+1

Điều này có vẻ là những gì mọi người đang đề xuất hoặc cho tất cả các trình duyệt, history.js. (Tôi thực sự đã kết thúc làm một cái gì đó đơn giản hơn, nơi tôi chỉ cần tải lại trang nếu một thay đổi đã xảy ra, theo dõi các thay đổi với một băm) – user984003

12

Thay vì sử dụng JavaScript để thúc đẩy URL, hãy để URL của bạn hướng JavaScript. Hãy để trình xử lý sự kiện window.onhashchange thực hiện tất cả công việc. Mọi thứ khác chỉ nên thay đổi băm.

Bạn thậm chí không cần nhấp vào xử lý cho các liên kết, chỉ cần đặt url để băm phải:

<a href="#red">Red</a> 

Sau đó, xử lý hashchange của bạn sẽ chăm sóc phần còn lại:

function hashChange() { 
    var page = location.hash.slice(1); 
    if (page) { 
     $('#content').load(page+".html #sub-content"); 
     document.title = originalTitle + ' – ' + page; 
     switch (page) { 
      // page specific functionality goes here 
      case "red": 
      case "yellow": 
       $("body").removeClass("red yellow").addClass(page); 
       break; 
     } 
    } 
} 

Các chỉ có lý do để thay đổi giá trị băm là nếu bạn muốn có thể quay lại trang và tải nó cùng một trạng thái dựa trên URL. Vì vậy, bạn đã có yêu cầu để cho URL lái xe JavaScript, phải không? Khác tại sao bạn thay đổi băm? Di chuyển chức năng ra khỏi trình xử lý nhấp chuột và vào sự kiện hashchange chỉ đơn giản hóa mọi thứ.

+0

Nhưng điều đó vẫn không tải nội dung. Ngoài ra, ajax không phải là href. Trong mã thực tế của tôi đó là một nút gọi là ajax và thêm một thẻ. – user984003

+0

@ user984003 - Tôi không hiểu. Tại sao nội dung không được tải? Tại sao bạn sử dụng nút thay vì liên kết? – gilly3

+0

Cách tôi hiểu câu trả lời của bạn, tôi cần phải viết mã để thay đổi cụ thể trạng thái trở lại theo cách của nó, ví dụ: thiết lập nền màu đỏ. Nhưng người dùng có thể đã thêm thẻ, thay đổi xếp hạng và thêm mục vào giỏ hàng, tất cả thông qua ajax. Tôi cần một cách để có được trạng thái này trong một lần. pushState hoặc history.js có vẻ là những gì mọi người đang đề xuất. – user984003

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