Когда я обновляю ссылки с помощью JavaScript
$('#link_id').attr('href', some_new_url)
цветная тема для посещенных /non- посещенных ссылок сохраняется, независимо от статуса нового URL-адреса.
Есть ли способ изменить адрес ссылки, заставляя браузер повторно проверять его статус посещения?
Дальнейшие примечания:
Я (в OSX 10.8) испытываю эту проблему в Chrome (32) и Safari (6.1). В Firefox (26) статус ссылок обновляется автоматически, если требуется.
Пример выше в jQuery, но проблема аналогична с ванильным JavaScript, то есть document.getElementById
и setAttribute
.
(Я бы предпочел избегать удаления и добавления <a></a>
, если это возможно.)
РЕДАКТИРОВАТЬ:
Минимальный (non-) рабочий пример (Joeytje50): http://jsfiddle.net/3pdVW/
Что вы можете сделать, чтобы исправить это, просто заставляет браузер пересчитывать стили, полностью удаляя атрибут href
, а затем снова добавляя его обратно сразу же после этого. Это заставит браузер сначала вычислить стили, так как <a>
больше не является ссылкой без href
, а затем вы добавляете href
вы хотите дать. Тогда код будет выглядеть следующим образом:
$('#link_id').removeAttr('href').prop('href', some_new_url);
PS: в этом случае, используя .attr('href', some_new_url);
вероятно, будет работать одинаково хорошо.
Я думаю, что это сбой рендеринга. Он не пересчитывает стили, когда состояние :visited
изменяется из-за сценария. Этот минимальный пример вашей проблемы показывает это хорошо. Что вы можете попробовать, либо одно из следующих:
Проблема может заключаться в том, что вы меняете атрибут, который, в свою очередь, изменяет свойство href. Если вы напрямую измените свойство href, оно может работать. Вы можете сделать это через jQuery.prop, который использовал бы следующий код для изменения ссылки:
$('#link_id').prop('href', some_new_url);
Демо. На самом деле я не очень надеюсь на это, но стоит попробовать. То, что я подозреваю, будет работать намного лучше:
Если вы хотите принудительно пересчитать стили, вы можете просто изменить класс на самый высокий элемент, который хотите обновить. Поскольку вы обновляете только элемент <a>
, вам нужно что-то вроде этого:
$('#link_id').prop('href', some_new_url).toggleClass('webkit-force-recalculate');
Я думаю, что это, скорее всего, сделает трюк.
Если ни один из этих подходов не работает для вас, вы, конечно, можете использовать решение максигладкова.
Часто возникают аналогичные проблемы, например, при настройке размера элементов с границей, есть блуждающие границы слева и т.д.
Хотя это не то же самое, я обнаружил, что скрытие элемента делает трюк. У нее не было никаких проблем.
$("#change_link").on("click", function(e) {
$("#anchor1").hide();
$("#anchor1").attr('href', $("#url").val());
$("#anchor1").show();
});
Это должно привести к переделке элемента.
Вы можете изменить его следующим образом:
$('#link_id').replaceWith($('<a href="' + some_new_url +'">' + $('#link_id').text() + '</a>'));
Это должно сделать трюк. Протестировано: http://jsfiddle.net/maximgladkov/L3LMd/
Я думаю, что вы можете найти следующий код CSS:
a:link {
text-decoration: none;
color: #00F;
}
a:visited {
color: #00F;
}