Недавно меня попросили помочь с набором 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>