2011-03-22 75 views
6

Tôi đang sử dụng một bản người dùng cho Chrome và Firefox và tôi đang kiểm tra các liên kết đã được người dùng truy cập. Tôi cóPhát hiện liên kết đã truy cập trong Chrome

a{ 
    color: blue; 
} 

a:visited{ 
    color: red !important; 
} 

trong css của tôi được nhập ngay khi tải trang. Các liên kết trên trang mà tôi đã truy cập có màu đỏ thay vì mặc định màu xanh lam. Sau đó, tôi sử dụng:

alert(window.getComputedStyle(document.getElementById("myLink"), null).getPropertyValue("color")) 

trên mỗi liên kết và tất cả đều trở lại màu đỏ cho các liên kết đã truy cập trong Firefox nhưng trong Chrome tất cả đều trở lại màu xanh lam.

Tôi đã tự hỏi cách triển khai việc tìm kiếm các liên kết đã truy cập bằng javascript bằng Chrome. Mã Jquery hoặc mã javascript bình thường là tốt. Cảm ơn trước.

+1

Tôi nghĩ rằng lỗi bảo mật này đã được sửa chữa lâu dài trong Firefox, vì vậy nó không hoạt động ở đó: http://blog.mozilla.com/security/2010/03/31/plugging-the-css-history-leak/ –

+0

Ok Tôi hiểu, tôi đã thử đặt layout.css.visited_links_enabled thành false trong Firefox và các liên kết không thay đổi màu. Vì vậy, điều này có nghĩa rằng hoàn toàn không có cách nào để kiểm tra xem người dùng đã truy cập trang trước đó chưa? – user654628

Trả lời

8

A_horse_with_no_name là đúng. Vấn đề bảo mật :visited đã được cố định vào năm 2010 bởi các nhà cung cấp trình duyệt, sau khi bản demo tiện lợi (Spyjax; không còn nữa) đã chứng minh rằng bất kỳ trang web nào cũng có thể khám phá xem bạn đã truy cập vào URL đã cho hay chưa. Bạn có thể xác minh rằng getComputedStyle vào một liên kết không còn trả về :visited màu - thậm chí trong cùng một miền:

// Test I used within the JS console. 
// :visited is no longer detectable by getComputedStyle. 
function getLinkColor(url) { 
    var a = document.createElement('a'); 
    a.href = a.textContent = url; 
    document.body.appendChild(a); 
    return document.defaultView.getComputedStyle(a, null).color; 
} 
getLinkColor('http://stackoverflow.com/questions/5394099/detect-visited-link-in-chrome'); 
getLinkColor('http://stackoverflow.com/some-fake-path'); 

Đối với phần mở rộng Chrome, nếu bạn muốn để phát hiện xem một dùng đã truy cập một URL, tôi nghĩ rằng bạn' sẽ phải yêu cầu sự cho phép "history" và gọi chrome.history.getVisits.

+0

Vì vậy, tôi đang sử dụng một bản ghi người dùng, tôi không thể chỉnh sửa tệp kê khai, vì vậy điều này có nghĩa là tôi không thể truy cập vào lịch sử? Tôi đang sử dụng một usercript để được crossbrowser cho kịch bản của tôi để chạy trên Firefox và Chrome. Một điều nữa là bạn có thể thấy thay đổi cho các liên kết đã truy cập (trên Chrome, một số liên kết có màu xanh dương và một số có màu đỏ) nhưng javascript phát hiện tất cả chúng là màu xanh lam. – user654628

+0

Đúng vậy. Mặc dù người dùng thấy một màu khác nhau cho: được truy cập, trình duyệt ẩn thông tin này khỏi Javascript vì lý do bảo mật. Bạn cần sử dụng các API lịch sử dành riêng cho trình duyệt. – yonran

+0

Cảm ơn, tôi đã quyết định thực hiện một cách tiếp cận khác cho vấn đề. Tôi đã quyết định lưu trữ hầu hết các liên kết đã truy cập (sau sự kiện nhấp chuột) trong localStorage (không phải toàn bộ url và chỉ cho một tên miền). – user654628

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