Как я могу заставить работать ссылки на фрагменты на странице с <base href = "">?

Это кажется очень простым вопросом HTML, но я не могу найти ответ здесь или где-либо еще, который действительно работает.

Что я хочу сделать, так это перейти по ссылке id в том же документе без перезагрузки документа.

Вот моя установка. Документ - http://www.example.com/mydocument.htm/.

<head>
    .
    <base href = "http://www.example.com">
    .
    .
</head>

<body>
    <!-- Jump from ... -->
    <div>
        Jump to <a href = "#myid">here</a>.
    </div>


    <!-- Jump to ... -->
    <div id = "myid">
        <Do stuff>
        <Do more stuff>
    </div>

</body>

Этот синтаксис, согласно всему, что я прочитал на этом сайте и в других местах, должен приводить к переходу в текущем документе без перезагрузки страницы.

Не работает. Мои браузеры (Firefox, Chrome) автоматически вставляют базовый href перед закладкой, а именно: http://www.example.com/#myid, что открывает мою домашнюю страницу.

Не то, что я хочу.

Если я изменю href с "#myid" на /mydocument.htm#myid, то переход завершится, но страница перезагрузится. То же самое, если я использую абсолютный адрес: http://www.example.com/mydocument.htm/#myid.

Я застрял. Любое руководство?

но именно для этого и предназначен <base href = "#">. Зачем оно тебе?

Dai 27.04.2018 19:56

Бывает ли, если у вас нет элемента <base> в разделе заголовка?

Anthony 27.04.2018 19:56

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

BoltClock 27.04.2018 20:06

@Dal - он был добавлен несколько лет назад кем-то другим. Я работаю над устаревшим кодом. Наверное, сегодня не стал бы этого делать, но у меня есть более 200 устаревших документов, которые нужно отредактировать, если я их изменю.

JimE 27.04.2018 23:06

@Anthony - если базовый URL-адрес удален, локальные переходы на той же странице работают правильно, и страница не перезагружается. Это предлагает исправление с использованием прослушивателя событий для удаления базового URL-адреса для локальных ссылок. «Сделать ссылку привязки ссылками на текущую страницу при использовании <base>» не решает проблему перезагрузки, но предлагает подход. Спасибо за чаевые.

JimE 27.04.2018 23:07

@BoltClock - Да, страница перезагружается каждый раз. Но не в том случае, если базовый URL-адрес удален из заголовка документа. Так что проблема в этом определенно.

JimE 27.04.2018 23:08

Или добавьте прослушиватель событий onload, который полностью удаляет базовый элемент.

Anthony 27.04.2018 23:09
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
1
8
228
2

Ответы 2

Элемент <base> указывает браузеру добавить URL-адрес в href ко всем относительным URL-адресам на странице. Итак, имея:

<base href = "http://www.example.com" />

Означает, что для:

<a href = "#myid">here</a>.

href обрабатывается как:

http://www.example.com/#myid

Вместо

<current_page>/#myid

Вам почти наверняка не нужен этот элемент <base> в разделе заголовка, особенно на основании вашего дальнейшего замечания, что использование полного URL-адреса (в котором также есть http://www.example.com) работает, то есть ваша страница уже находится на http://www.example.com и, следовательно, не нуждается в сделайте это явным с помощью <base>.

В качестве альтернативы (и я на самом деле не рекомендую это, потому что ваше использование base кажется неправильным), вы можете изменить href вашей ссылки на текущую страницу плюс хеш id, например:

<a href = "mydocument.htm/#myid">here</a>.

Поскольку браузер отобразит URL-адрес (при применении basehref) для:

http://www.example.com/mydocument.htm/#myid

и, таким образом, не пытайтесь покинуть текущую страницу, поскольку она будет относиться к ней так же, как если бы база не была установлена. (Обратите внимание, что это будет работать только тогда, когда у вас есть базовый href, установленный на URL-адрес фактической базы страницы, и, как я упоминал ранее, это сделает базовый элемент ненужным).

https://jsfiddle.net/ouLmvd3g/

Если вы рассматриваете решение javascript, поскольку <base>, по-видимому, никогда не понадобится, я бы порекомендовал прослушиватель событий, который удаляет базовый элемент из DOM, а не предложенный вами:

a fix using an event listener to remove the base URL for local links

Простое решение:

window.onload=function(){
    var baseElement = document.getElementsByTagName("base")[0];
    baseElement.parentNode.removeChild(baseElement);
}

https://jsfiddle.net/vLa0zgmc/

Вы даже можете добавить немного логики, чтобы проверить, соответствует ли href базового элемента фактической базе URL-адресов текущей страницы, и удалить только тогда, когда это произойдет. Что-то вроде:

var baseElements = document.getElementsByTagName("base");

    if (baseElements.length > 0) {
      var baseElement = baseElements[0];
      var current_url = window.location.toString();
      var base_url = baseElement.getAttribute("href");
      // If the base url and current url overlap, remove base:
      if (current_url.indexOf(base_url) === 0) {
        baseElement.parentNode.removeChild(baseElement);
      }
    }

Пример здесь: https://jsfiddle.net/gLeper25/2/

Энтони - Спасибо за быстрый ответ. «Сделать якорные ссылки ссылками на текущую страницу при использовании <base>» не решает проблемы. Он говорит мне, как заменить текущую страницу на <base>, но не как предотвратить повторную загрузку документа после локального перехода. Хотя интересно.

JimE 27.04.2018 22:51

Нет, он использует как базовую, так и текущую страницу и не должен перезагружаться после локального перехода. По крайней мере, в моих тестах.

Anthony 27.04.2018 23:10

К сожалению, полное удаление <base> с большинства страниц вызывает множество проблем. Целые плоты javascript предполагают <base>. Хммммм. Думаю, я могу попробовать удалить его выборочно на страницах, где мне нужны быстрые локальные переходы. Вы очень помогли, большое спасибо.

JimE 28.04.2018 03:19

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

В конце концов, оказывается, я задавал неправильные вопросы. Что мне нужно, так это средство перехода к привязке к тому же документу без перезагрузки документа. К сожалению, я зациклился на проблеме с <base>, мешающей нормальному процессу <a href....>.

Фактический ответ заключался в использовании вместо этого onClick, а код был предоставлен @Davide Bubz в разделе «Сделать ссылки привязки ссылаться на текущую страницу при использовании <base>», и это просто и элегантно, используя document.location.hash вместо <a href...>:

<a href = "javascript:;" onclick = "document.location.hash='test';">Anchor</a>

где «test» - это идентификатор, идентифицирующий элемент, к которому нужно перейти.

Несколько респондентов указали на эту ветку как на ответ на мои вопросы, но я был недостаточно умен, чтобы понять ее смысл, пока не прочитал ее в третий раз. Если бы я был умнее, я бы сэкономил 6-1 / 2 часа, тратя свое время на попытки исправить проблему <base>.

В любом случае проблема решена. Спасибо всем и особенно господину Бубзу.

Другие вопросы по теме