2009-03-14 59 views
25

Sử dụng JavaScript, có cách nào để cập nhật window.location.hash mà không cần cuộn trang web không?Tôi có thể cập nhật window.location.hash mà không cần phải cuộn trang web không?

Tôi có các thành phần tiêu đề có thể nhấp để chuyển đổi chế độ hiển thị của div ngay bên dưới chúng. Tôi muốn thanh/foo # trong lịch sử khi nhấp vào tiêu đề nhưng không muốn cuộn trang. Vì vậy, khi điều hướng khỏi/foo # bar, tôi sẽ có thể sử dụng nút quay lại và có div có ID trong window.location.hash hiển thị khi trả về.

Hành vi này có thể xảy ra không?

+0

Xem [câu hỏi stackoverflow này] (http:// stackoverf low.com/questions/568719/is-monitoring-location-hash-a-solution-for-history-in-xhr-apps) và/hoặc [trang này] (http://www.nicon.nl/hash2history/) nơi tôi trình bày một kịch bản cơ bản để giải quyết vấn đề. – KooiInc

+0

Cảm ơn. Tôi đã kiểm tra câu hỏi đó và tập lệnh tùy chỉnh của bạn. –

Trả lời

1

Hành vi này rất có thể xảy ra. Bạn nên xem xét một số thư viện đã được phát triển để cung cấp cho bạn chức năng này.

Lịch sử Really Simple: http://code.google.com/p/reallysimplehistory/ SWFAddress: http://www.asual.com/swfaddress/

+0

Tuyệt vời. Những cái nhìn đó tốt ngoại trừ tài liệu tồn tại cho RSH. Tôi nghĩ SWFAddress trông giống như lựa chọn tốt nhất hiện nay. –

+0

Thật vậy. Tôi cảm thấy rằng thiếu tài liệu của RSH. Tôi sử dụng SWFAddress và cho đến nay nó đã làm việc tốt. – Willem

+1

Điều này là rất quá mức cho một nhiệm vụ đơn giản như vậy. Một vài dòng mã là MUCH thích hợp hơn việc thêm các thư viện và phụ thuộc mới. – Kehlan

22

Một điều bạn có thể thử thay đổi id của phần tử điểm băm để tạm thời. Đã làm cho tôi!

function changeHashWithoutScrolling(hash) { 
    var id = hash.replace(/^.*#/, ''), 
     elem = document.getElementById(id) 
    elem.id = id+'-tmp' 
    window.location.hash = hash 
    elem.id = id 
} 
+0

Điều này thật tuyệt vời. Hoạt động tuyệt vời. – samg

+0

Tôi nghĩ bạn có nghĩa là 'document.getElementById (id);' – AlienWebguy

+0

Cảm ơn bạn @AlienWebguy, đã sửa chức năng trong nhận xét. – Sunny

30

Dễ dàng như nó có được

var scrollmem = $('html,body').scrollTop(); 
window.location.hash = hash; 
$('html,body').scrollTop(scrollmem); 
+0

Điều này hoạt động tuyệt vời, cảm ơn! – Sam

+0

Rất bóng bẩy, cảm ơn! – VictorKilo

+2

Tôi nghĩ rằng dòng đầu tiên nên là "var scrollmem = $ ('html, body'). ScrollTop();" để khớp với cái thứ ba. Nếu không nó không hoạt động cho tôi trong firefox. – Anthony

26

Để thay đổi băm mà không cần phải tải lại trang/cuộn, bạn bây giờ có thể chỉ cần sử dụng html5 history.pushState.

history.pushState(null,null,'#hashexample'); 

Nó được hỗ trợ bởi tất cả các trình duyệt chính:

http://caniuse.com/history

MDN:

https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Manipulating_the_browser_history#The_pushState().C2.A0method

Cũng lưu ý rằng tham số url cuối cùng chúng ta đang sử dụng ở đây, nó có thể là bất kỳ url nào, do đó, nó không bị giới hạn trong băm.

+3

Ồ, tôi ước tôi có thể ôm bạn. – Magicode

+4

'replaceState' có lẽ là cách tốt hơn để đến đây. Sự khác biệt là 'pushState' thêm một mục vào lịch sử của bạn trong khi' replaceState' thì không. –

2

Wanted để thêm một bình luận cho câu trả lời Catherines nhưng tôi không có đại diện được nêu ra -.

vĩ đại giải pháp tuy nhiên nó không được làm việc cho tôi trong Chrome như $ ('html') scrollTop() luôn trả về 0 - sửa đổi nhỏ giải quyết vấn đề này:

scrollmem = $('html').scrollTop() || $('body').scrollTop(); 
window.location.hash = hash; 
$('html,body').scrollTop(scrollmem); 
1

Bas trên câu trả lời từ Nắng tôi đã thực hiện chức năng này mà cũng tránh undefined và null:

function changeHashWithoutScrolling(hash) { 
     var id; 
     var elem; 

     id = hash.replace(/^.*#/, ''); 

     if (id) { 
      elem = document.getElementById(id); 

      if (elem) { 
       elem.id = id + '-tmp'; 
       window.location.hash = hash; 
       elem.id = id; 
      } 
     } 
    } 
Các vấn đề liên quan