HTML ссылка не открывается в целевом фрейме - PullRequest
0 голосов
/ 11 апреля 2020

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

Проблема заключалась в том, что ссылки не открывались в желаемом целевом фрейме, а в другая вкладка.

После некоторого анализа я обнаружил, что такое поведение было вызвано наличием Javascript переменной "name", которая присутствовала на странице, которая изначально была загружена в целевой кадр. Если значение этой переменной не соответствует имени целевого фрейма, ссылка открывается на новой вкладке. В случае совпадения с именем целевого кадра, ссылка, открываемая в целевом кадре, как и ожидалось.

Это происходит последовательно в последних версиях как минимум трех браузеров (пробовал Firefox, Chrome и Edge) .

Я хотел бы знать, почему это работает таким образом.

Вот небольшое воспроизведение проблемы (также доступно здесь ), с набором кадров, три кадра с начальным содержанием и двумя ссылками. Первая ссылка с target="two" открывается во фрейме "два". Но вторая ссылка с target="three" не открывается в кадре «три», а открывается в новой вкладке. По-видимому, это зависит от значения Javascript переменной «name» в начальном содержимом этого кадра, равного трем. html. Но почему?

index. html:

<html>
  <frameset rows="33%,33%,*">
    <frame name="one"   src="one.html">
    <frame name="two"   src="two.html">
    <frame name="three" src="three.html">
  </frameset>
</html>

one. html:

<html>
  <body>
    frame "one"
    <br>
    <a target="two" href="content.html">show content (target="two")</a>
    <br>
    <a target="three" href="content.html">show content (target="three")</a>
  </body>
</html>

два. html:

<html>
  <body>
    frame "two"
    <script>
      <!--
      var name = "two";
      //-->
    </script>
  </body>
</html>

три. html:

<html>
  <body>
    frame "three"
    <script>
      <!--
      var name = "two";
      //-->
    </script>
  </body>
</html>

содержание. html:

<html>
  <body>
    content
  </body>
</html>

1 Ответ

1 голос
/ 11 апреля 2020

Причина этого в том, что, устанавливая переменную name на страницах, вы переопределяете переменную Window.name.

И эта переменная Window.name - это то, что система использует для определения имени фрейма. Если вы переопределите это значение и измените его, а затем попытаетесь достичь кадра со старым значением, то вы будете перенаправлены на новую вкладку.

...