2011-01-17 18 views
18

trong trang web của tôi thiết lập các địa chỉ url sử dụngwindow.location.hash = ""; ngăn cuộn lên đầu?

window.location.hash = 'project_name'; 

nhưng nếu tôi muốn để làm sạch các url địa chỉ từ bất kỳ băm (khi tôi đóng một dự án) và tôi đặt

window.location.hash = ''; 

nó xảy ra sự trang cuộn lên đến đầu trang

có cách nào để dọn sạch url mà không có bất kỳ tác dụng phụ nào không?

nhờ

+0

Bạn có thể gán một neo không tồn tại, nhưng điều đó không thực sự "làm sạch" URL lên: D – polarblau

Trả lời

28

Có trường hợp onhashchange, nhưng nó không thể bị hủy bỏ cách đáng tin cậy trên các trình duyệt để ngăn chặn di chuyển. Giải pháp tốt nhất là ghi vị trí cuộn trước khi thay đổi vị trí băm và đặt lại vị trí sau đó. Ví dụ, đoạn mã sau sẽ bắt một nhấp chuột vào bất kỳ liên kết - đó không chỉ dừng lại tuyên truyền - với một giá trị href của # và ngăn chặn trang từ di chuyển theo chiều dọc:

document.onclick = function (evt) { 
    var tgt = (evt && evt.target) || event.srcElement, 
     scr = document.body.scrollTop; 

    if (tgt.tagName == "A" && tgt.href.slice(-1) == "#") { 
     window.location.href = "#"; 
     document.body.scrollTop = scr;   
     return false; 
    } 
} 

Nếu bạn đang thay đổi băm qua tập lệnh, bạn có thể sử dụng mã sau:

var scr = document.body.scrollTop; 
window.location.href = '#'; 
document.body.scrollTop = scr; 

Có thể điều chỉnh một trong hai phương pháp này để tránh cuộn từng phần hoặc cuộn trang theo chiều ngang. Lưu ý rằng bạn có thểremove the entire hash (bao gồm #) mà không gây điều hướng hoặc di chuyển trong trình duyệt hiện đại bằng cách gọi hàm pushState hoặc replaceState.

+1

thú vị ... mỗi ngày tôi học điều gì đó! thanks – Francesco

+0

Bạn cũng có thể tạm thời tạo một phần tử khác bằng 'id' đó tại' scrollTop'. – alex

+0

fyi, nó không hoạt động trong Firefox và hầu hết thời gian trong Chrome.Nó nhận được trong chức năng ohhashchange nhưng trình duyệt vẫn cuộn (cố gắng ngăn chặn mặc định quá). – JCarter

12

Tôi đã gặp sự cố tương tự và đến đây để có câu trả lời. Chỉ cần phát hiện ra có một cách rất dễ dàng:

window.location.hash = ' '; 

Về cơ bản bạn đặt nó thành '#', vì không gian không tồn tại, nó không di chuyển. Khi bạn truy cập lại trang, nó cũng không xử lý bất kỳ trang nào khác với chỉ #

+0

Đây phải là câu hỏi được chấp nhận, theo ý kiến ​​của tôi, theo ý kiến ​​của tôi – Nico

+1

s/question/answer/ – nicolallias

+0

giải pháp tốt, nhưng không hoạt động trong chrome 46 – meteor

8

Trước hết, cảm ơn các giải pháp của bạn - @ Andy-E và @JustMaier.

Tuy nhiên, tôi gặp sự cố khi làm việc dựa trên khối mã thứ hai của Andy E trong Firefox và mã của JustMaier trong chrome.

Vì vậy, tôi đã làm một mash up của hai khối mã và nó hoạt động giống như dự định trên cả hai trình duyệt

var scr = document.body.scrollTop; 

window.location.hash = ' '; 

document.body.scrollTop = scr; 


hai của tôi cent, lấy gì ra khỏi ninja JS thực, đề cập ở trên. :)

0

document.body.scrollTop is deprecated, các phiên bản Chrome mới nhất có vẻ không ổn định ở đây. Sau đây sẽ hoạt động:

var topPos = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0; 
    window.location.href = '#'; 
    document.documentElement.scrollTop = topPos;