Как превратить тег div в ссылку

Как превратить тег div в ссылку. Я бы хотел, чтобы весь мой div был интерактивным.


person Alan    schedule 06.11.2009    source источник
comment
взгляните на stackoverflow.com/questions/796087/make-a-div-into- a-link, @thepeer пока что предоставил лучшее решение.   -  person Bongs    schedule 15.09.2011


Ответы (9)


JS:

<div onclick="location.href='url'">content</div>

jQuery:

$("div").click(function(){
   window.location=$(this).find("a").attr("href"); return false;
});

Обязательно используйте cursor:pointer для этих DIV

person eozzy    schedule 06.11.2009
comment
Если я неправильно понял образец jQuery, HTML должен быть структурирован следующим образом: ‹div› ‹a href=yourlinkhere› Текст вашей ссылки ‹/a› ‹/div› - person Seh Hui Leong; 06.11.2009
comment
Да, и это, вероятно, лучший способ сделать это. Я просто выложил как альтернативу. - person eozzy; 06.11.2009

Если вы используете HTML5, как указано в этот другой вопрос, вы можете поместить свой div внутрь a:

<a href="http://www.google.com"><div>Some content here</div></a>

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

person Rael Gugelmin Cunha    schedule 19.03.2014

Если вам нужно установить тег привязки внутри div, вы также можете использовать CSS, чтобы установить привязку для заполнения div через display: block.

Как таковой:

<div style="height: 80px"><a href="#" style="display: block">Text</a></div>

Теперь, когда пользователь помещает курсор в этот div, тег привязки заполняет этот div.

person Justin Yost    schedule 06.11.2009
comment
В Firefox 3.5 и IE8 мне нужно добавить высоту: 100%; к тегу привязки, чтобы он занимал всю высоту DIV. Отличная альтернатива решениям Javascript. - person Seh Hui Leong; 06.11.2009
comment
это самый простой и удобный ответ - person Atharva Johri; 24.10.2013

Итак, вы хотите, чтобы элемент был чем-то, чем он не является?

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

Тем не менее, иногда нужно просто нарушать правила. Теперь в вопросе нет javascript, поэтому Я собираюсь поместить здесь заявление об отказе от ответственности:

Вы не можете использовать <div> как ссылку без использования ссылки (или эквивалента, например <form>, который содержит только кнопку отправки) или использования JavaScript.

С этого момента в этом ответе предполагается, что JavaScript разрешен и, кроме того, используется jQuery (для краткости примера).

С учетом всего сказанного, давайте углубимся в то, что делает ссылку ссылкой.


Ссылки обычно представляют собой элементы, на которые вы нажимаете, чтобы перейти к новому документу.

Это кажется достаточно простым. Прослушайте событие щелчка и измените местоположение:

Don't do this

$('.link').on('click', function () {
  window.location = 'http://example.com';
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="link">Fake Link</div>

Вот и все, <div> теперь является ссылкой. Подожди ... что это? А как насчет доступности? Да ладно, программы чтения с экрана и пользователи вспомогательных технологий не смогут щелкнуть ссылку, особенно если они используют только клавиатуру.

Исправить это довольно просто: разрешим пользователям, использующим только клавиатуру, фокусировать <div> и запускать событие щелчка, когда они нажимают Enter:

Don't do this either

$('.link').on({
  'click': function () {
    window.location = 'http://example.com';
  },
  'keydown': function (e) {
    if (e.which === 13) {
      $(this).trigger('click');
    }
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="link" tabindex="0">Fake Link</div>

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

К счастью, есть атрибут, который можно использовать для переопределения роли элемента HTML по умолчанию, чтобы программы чтения с экрана и т.п. знали, как классифицировать настраиваемые элементы, как наш <div> здесь. Атрибутом, конечно же, является атрибут [role], и он прекрасно сообщает программам чтения с экрана, что наш <div> является ссылкой:

Ugh, this is getting worse every minute

$('[role="link"]').on({
  'click': function () {
    window.location = 'http://example.com';
  },
  'keydown': function (e) {
    if (e.which === 13) {
      $(this).trigger('click');
    }
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div role="link" tabindex="0">Fake Link</div>

Наконец, наш <div> - лин --- ох, теперь другие разработчики жалуются. Что теперь?

Итак, разработчикам код не нравится. Они пытались preventDefault на мероприятии, но оно продолжает работать. Это легко исправить:

I warned you this was bad

$(document).on({
  'click': function (e) {
    if (!e.isDefaultPrevented()) {
      window.location = 'http://example.com';
    }
  },
  'keydown': function (e) {
    if (e.which === 13 && !e.isDefaultPrevented()) {
      $(this).trigger('click');
    }
  }
}, '[role="link"]');

$('[aria-disabled="true"]').on('click', function (e) {
  e.preventDefault();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div role="link" tabindex="0">Fake Link</div>
<div role="link" aria-disabled="true" tabindex="0">Fake disabled link</div>

Вот и оно --- ЕСТЬ БОЛЬШЕ? Что еще я не знаю? Расскажите мне все СЕЙЧАС, чтобы я мог это исправить!

  • Хорошо, значит, нет возможности указать цель. Мы можем исправить это, обновив до window.open.
  • События щелчка и события клавиатуры игнорируют клавиши Ctrl, Alt и Shift. Это достаточно просто, просто нужно проверить эти значения в объекте события.
  • Невозможно указать контекстные данные. Давайте просто добавим несколько [data-*] атрибутов и закончим с этим.
  • Событие щелчка не подчиняется используемой кнопке мыши, средняя мышь должна открываться в новой вкладке, правая мышь не должна запускать событие. Достаточно просто, просто добавьте еще несколько проверок для прослушивателей событий.
  • Стили выглядят странно. КОНЕЧНО, СТИЛИ СТРАННЫЕ, ЭТО <DIV> НЕ ЯКОРЬ!

Что ж, я обращусь к первым четырем вопросам, и НИКОГДА. У меня было это с этим дурацким мусором кастомных элементов. Я должен был просто использовать элемент <a> с самого начала.

Told you so

$(document).on({
  'click': function (e) {
    var target,
        href;
    if (!e.isDefaultPrevented() && (e.which === 1 || e.which === 2)) {
      target = $(this).data('target') || '_self';
      href = $(this).data('href');
      if (e.ctrlKey || e.shiftKey || e.which === 2) {
        target = '_blank'; //close enough
      }
      open(href, target);
    }
  },
  'keydown': function (e) {
    if (e.which === 13 && !e.isDefaultPrevented()) {
      $(this).trigger({
        type: 'click',
        ctrlKey: e.ctrlKey,
        altKey: e.altKey,
        shiftKey: e.shiftKey
      });
    }
  }
}, '[role="link"]');

$('[aria-disabled="true"]').on('click', function (e) {
  e.preventDefault();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div role="link" tabindex="0" data-href="http://example.com/">Fake Link</div>
<div role="link" tabindex="0" data-href="http://example.com/" data-target="_blank">Fake Link With Target</div>
<div role="link" aria-disabled="true" tabindex="0" data-href="http://example.com/">Fake disabled link</div>

Обратите внимание, что фрагменты стека не открывают всплывающие окна из-за того, что они изолированы от песочницы.

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

<a href="http://example.com/">
    ...your markup here...
</a>

Код, который я разместил здесь, вероятно, имеет проблемы. Вероятно, в нем есть ошибки, о которых даже я пока не догадываюсь. Трудно повторить то, что браузеры предоставляют вам бесплатно. Существует так много нюансов, которые легко упустить из виду, что просто не стоит пытаться имитировать его в 99% случаев.

person zzzzBov    schedule 25.08.2015

НЕ ДЕЛАЙТЕ ЭТО.

  • Если вам нужна ссылка, оберните содержимое в правильный <A>NCHOR</a>.
  • Если вы хотите превратить <DIV> в ссылку, используйте «Javascript», чтобы заключить <DIV> в <A>NCHOR</A>
  • Если вы хотите выполнить какое-либо действие при нажатии <DIV>, используйте onclick обработчик событий ... и не называйте это «ссылкой».
person chakrit    schedule 06.11.2009

Вы можете сделать весь DIV функцией как ссылку, добавив onclick = "window.location = 'TARGET URL'" и установив его стиль на "cursor: pointer". Но часто это плохая идея, потому что поисковые системы не смогут перейти по полученной ссылке, читатели не смогут открывать вкладки или копировать расположение ссылки и т. Д. Вместо этого вы можете создать обычный тег привязки. а затем установите его стиль на display: block, а затем задайте стиль, как если бы вы использовали DIV.

person Ben Regenspan    schedule 06.11.2009

Вы можете использовать Javascript для достижения этого эффекта. Если вы используете фреймворк, все становится довольно просто. Вот пример в jQuery:

$('div#id').click(function (e) {
  // Do whatever you want
});

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

person plainprogrammer    schedule 06.11.2009

Имейте в виду, что поисковые пауки не индексируют JS-код. Итак, если вы поместите свой URL в код JS и обязательно включите его в традиционную ссылку HTML в другом месте страницы.

То есть, если вы хотите, чтобы связанные страницы индексировались Google и т. Д.

person sifr4    schedule 16.04.2017

person    schedule
comment
Подумайте о добавлении объяснения к своему ответу, чтобы SO оставалась ресурсом для обучения, а не только для ответов. - person Jon Egeland; 29.08.2012