используя JavaScript, чтобы пометить ссылку как посещенную - PullRequest
12 голосов
/ 28 апреля 2009

FF2 (по крайней мере) не помечается как ссылка как: посещенный, если он запускает обработчик onclick без следования href Я использую onclick для извлечения данных с сервера и изменения страницы, и стилизация ссылок здесь уместна. Но ссылка не помечена как посещенная.

Существует ли кросс-браузерный способ пометить ссылку как посещенную? Если это не удастся, есть ли способ определить стиль браузера a :ited и применить его к ссылке?

Спасибо всем, кто ответил.

Похоже, что ответы :

  • Существует ли кросс-браузерный способ пометить ссылку как посещенную?
    Нет, это невозможно сделать. Ссылки идентифицируются как посещенные, если href находится в истории браузера.
  • Есть ли способ определить в браузере стиль: посещено?
    Нет, не только через JavaScript.

Ответы [ 5 ]

18 голосов
/ 02 апреля 2012

Вот как я это сделал. Работает только в браузерах , которые поддерживают API истории HTML5.

# store the current URL
current_url = window.location.href

# use replaceState to push a new entry into the browser's history
history.replaceState({},"",desired_url)

# use replaceState again to reset the URL
history.replaceState({},"",current_url)

Использование replaceState означает, что кнопка возврата не будет затронута.

3 голосов
/ 28 апреля 2009

Единственный обходной путь , о котором я знаю, будет выглядеть примерно так:

Скажем, ваши посещенные ссылки красные:

<a href="#" onclick="someEvent();this.style.color='#ff0000'">link</a>

Но это не значит, что при перезагрузке страницы ссылки по-прежнему отмечены , которые были посещены.

Для достижения этой цели я бы рекомендовал указывать все идентификаторы ссылок, которые, разумеется, уникальны для всего вашего приложения или имеют пространство имен на странице. В вашем onclick вы вызовете другой метод, который сохраняет идентификатор ссылки в cookie.

Самым простым будет список через запятую, который вы можете split() перед прочтением. Что вы делаете, когда страница перезагружается. Когда он разделен, вы перебираете все идентификаторы и устанавливаете цвет ссылок.

Например, используя jQuery:

// onclick
function saveID(id) {
  if ($.cookie('idCookie')) {
    $.cookie('idCookie', $.cookie('idCookie') + "," + id);
  } else {
    $.cookie('idCookie', id);
  }
}

// make all links colored
function setVisted() {
  var idArray = $.cookie('idCookie').split(',');
  for (var x=0; x<idArray.length; x++) {
    $('#' + idArray[x]).css('color', '#ff0000');
  }
}

// assign saveID()
$(document).ready(function(){
  $('a').click(function(){
    saveId($(this).attr('id'));
  });
  setVisited();
});

Я не тестировал этот код, но он должен помочь вам начать и дать вам идею. Если вам повезет, вы вставите и выиграете . ;-) Я также не исследовал, сколько вы можете хранить в cookie-файлах и как это влияет на производительность, или какие другие ограничения применяются, также смотрите мои комментарии.

1 голос
/ 28 апреля 2009

Строго говоря, не существует такого понятия, как «посещенное» состояние для отдельных ссылок. Сами URL-адреса интерпретируются браузером как «посещенные». Любые ссылки, которые указывают на URL в истории браузера, получат стилизацию, определенную псевдостилем: visit в вашем CSS.

Вы можете попытаться подделать его, установив местоположение скрытого iframe по желаемому URL, но это не заставит текущую страницу перерисовываться, поэтому я сомневаюсь, что вы увидите обновления с посещениями: обновить.

Что касается второй части вашего вопроса, я бы, вероятно, согласился с ответом Джордана Джонса.

1 голос
/ 28 апреля 2009

Примените класс, который имеет такое же определение, как и в гостях.

0 голосов
/ 09 июня 2009

Есть ли способ определить стиль браузера: посещенные?

Я бы сказал да, так как текущий документ посещен, и вы можете найти его цвет ссылки следующим образом: -

alert(mys_getLinkColor(top.location))


function mys_getLinkColor(href) {
var x, body, res=''
x = document.createElement('a')
x.href = href
body = document.getElementsByTagName('body')[0]
body.appendChild(x)
if(x.currentStyle) {
   res = x.currentStyle.color
}
else if(window.getComputedStyle) {
   res = window.getComputedStyle(x,null).color
}
return mys_rgbToHexColor(res) }


function mys_rgbToHexColor(v) { 
// E.g. 'rgb(5,2,11)' converts to "#05020b". All other formats returned unchanged.
var i
v = v.split('(')
if(!v[1]) return v[0]
v = v[1].replace(/ /g, '').replace(/\)/, '')
v = v.split(',')
for(i=0; i<v.length; i++) {
   v[i] = Number(v[i]).toString(16)
   if(v[i].length==1) v[i] = '0' + v[i]
}
return '#'+v.join('')}
...