Создание якорного тега внутри тега привязки


во время моего случайного тестирования я видел поведение, когда я помещал якорный тег внутри другого якорного тега. Я сделал jsfiddle.

<a class="groupPopper">
     <a class="name"> content</a>
</a>​

но в инструменте разработчика выглядит иначе:

Я считаю, что мы не можем поместить якорный тег внутри другого якорного тега, так как щелчок по внутреннему якорю приведет к появлению события click к родительскому тегу якоря, который не должен быть разрешен.

правильно ли мое предположение?

11 53

11 ответов:

как описывает @j08691, вложенный a элементы запрещены в синтаксисе HTML. Спецификации HTML не говорят, почему; они просто подчеркивают правило.

на практике браузеры эффективно применяют это ограничение в своих правилах синтаксического анализа, поэтому, в отличие от многих других проблем, нарушение спецификаций просто не будет работать. Парсеры эффективно лечат <a> тег внутри открытой a элемент как неявно завершающий открытый элемент перед запуском нового один.

так что если вы пишите <a href=foo>foo <a href=bar>bar</a> zap</a>, вы не получите вложенные элементы. Браузеры будут разбирать его как <a href=foo>foo</a> <a href=bar>bar</a> zap, т. е. как две последовательные ссылки, за которыми следует некоторый простой текст.

нет ничего изначально нелогичного с вложенными a элементы: они могут быть реализованы так, что нажатие на "foo" или "zap" активирует внешнюю ссылку, нажатие на " bar " активирует внутреннюю ссылку. Но я не вижу причин использовать такую структуру, и дизайнеры HTML, вероятно, тоже ее не видели, поэтому они решили запретить его и тем самым упростить вещи.

(если вы действительно хотите имитировать вложенные ссылки, вы можете использовать обычную ссылку в качестве внешней ссылки и span элемент с подходящим обработчиком событий в качестве внутренней "ссылки". Кроме того, вы можете дублировать ссылки: <a href=foo>foo</a> <a href=bar>bar</a> <a href=foo>zap</a>.)

вложенные ссылки являются незаконными.

ссылки и якоря, определенные элементом A, не должны быть вложенными; a элемент не должен содержать никаких других элементов.

я наткнулся на эту проблему при попытке сделать панель div кликабельной также есть кнопки. Обходной путь, который я рекомендую, заключается в использовании событий javascript.

вот пример codepen, который я создал.... http://codepen.io/thinkbonobo/pen/gPxJGV

вот его html-часть:

пример ссылки, встроенной в ссылку....

<div class=panel onclick="alert('We\'ll hi-ii-ii-ide')">
  If you say run<br>
  <button onclick="app.hitMe(event)">more</button><br>
  <br>
  And if you say hide...<br>
</div>

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

это недопустимый HTML.

вы не можете гнездо a элементы.

таким образом, по определению, поведение не определено.

не делай так. Я столкнулся с той же проблемой в моем приложении. Вы можете просто добавить <div> тег в верхней части и <a> теги на уровне ребенка. что-то вроде:

<div id="myDiv"><a href="#"></a>
     <a href="#"></a>
</div>

убедитесь, что вы также добавили событие click для myDiv в свой файл сценария.

window.location.href = "#dashboardDetails";

вы не можете вложить теги 'a'. Вместо этого установите внешний контейнер как ' position: relative 'и второй' a 'как' position:absolute ' и увеличьте его значение z-индекса. Вы получите тот же эффект.

<div style="position:relative">
<a href="page2.php"><img src="image-1.png"></a>
<a style="position:absolute;top:0;z-index:99" href="page1.php"></a>
</div>

вы можете использовать тег объекта для решения этой проблемы. например,

<a><object><a></a></object></a>

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

OnClick внутреннего события, используйте e. stopPropagation ();

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

    <style>
    * {
      padding: 0;
      margin: 0 border:0;
      outline: 0;
    }

    .outer_anchor {
      display: inline-block;
      padding: 5px 8px;
      margin: 2px;
      border: 1px solid #252632;
      border-radius: 3px;
      background: #1c1d26;
      color: #fff;
      text-shadow: 0 1px 0 #616161;
      box-shadow: 1px 1px 3px #000;
      transform: translateY(0);
      transition: background 250ms;
    }
    .inner_anchor {
      display: inline-block;
      padding: 5px 8px;
      margin: 2px;
      border: 1px solid #252632;
      border-radius: 3px;
      background: #1c1d26;
      color: #fff;
      transform: translate(0px);
    }
    .inner_anchor:hover {
      background: #647915;
    }
    </style>


<a href="#">ItemX<object><a class="elim_btn" href="#" title='Eliminate'>&times;</a></object></a>

Я тот же вопрос как @thinkbonobo и нашел способ сделать это без JavaScript:

.outer {
  position: relative;
  background-color: red;
}
 
.outer > a {
  position: absolute;
  top: 0; left: 0; bottom: 0; right: 0;
}
 
.inner {
  position: relative;
  pointer-events: none;
  z-index: 1;
}
 
.inner a {
  pointer-events: all;
}
<div class="outer">
  <a href="#overlay-link"></a>
  <div class="inner">
    You can click on the text of this red box. It also contains a
    <a href="#inner-link">W3C compliant hyperlink.</a>
  </div>
</div>

фокус в том, чтобы сделать якорь, охватывающий весь .outer div, затем давая всем другим якорям во внутреннем div положительный z-index значение. Полный кредит идет на https://bdwm.be/html5-alternative-nested-anchor-tags/

Это плохой способ кодирования, но вы можете попробовать это -

aaaa

bbbb