Сделать весь блок div ссылкой, строку tr таблицы ссылкой
Можно бы сделать вот так:
$('tr').bind('click', function(){ window.location = 'http://somelocation.com'; // Or, we can grab the HREF from the first anchor: // window.location = $('a:first', this).attr('href'); });
Но это не реальная ссылка! Браузеры же дают большие возможности ссылка:
- Middle-click: открыть в новой вкладке.
- CTRL/SHIFT: в новом окне.
- Right-click options: “открыть в новом окне”, “копировать ссылку” и др.
- В статусной строке видим путь ссылки.
- и др…
Невозможно всё это искусственно симулировать. Пользователям не понравится, если ссылка ведёт себя не так, как от неё ждут…
Нет правил, что строки таблиц или div не могут быть кликабельными, но если вы собираетесь их такими сделать, то нужно добиться того, чтобы они вели себя как обычные ссылки. Конечно, большинство пользователей не думают, что это ссылки; это просто переходы на другие страницы, но сложено представление, что они ведут себя как ссылки, и это представление не стоит обманывать.
Другими словами, если хотите сделать элемент ссылкой, сделайте точнейшую эмуляцию ссылки.
Вот jQuery plugin, обеспечивающий это дело (superlink.jquery.js):(function($){ /* ---- superLink jQuery plugin (c) James Padolsey ---- Contributors: Brian Fisher */ $.fn.superLink = function(link) { link = link || 'a:first'; return this.each(function(){ var $container = $(this), $targetLink = $(link, $container).clone(true); /* Take all current mouseout handlers of $container and transfer them to the mouseout handler of $targetLink */ var mouseouts = $(this).data('events') && $(this).data('events').mouseout; if (mouseouts) { $.each(mouseouts, function(i, fn){ $targetLink.mouseout(function(e){ fn.call($container, e); }); }); delete $(this).data('events').mouseout; } /* Take all current mouseover handlers of $container and transfer them to the mouseover handler of $targetLink */ var mouseovers = $(this).data('events') && $(this).data('events').mouseover; if (mouseovers) { $.each(mouseovers, function(i, fn){ $targetLink.mouseover(function(e){ fn.call($container, e); }); }); delete $(this).data('events').mouseover; } $container.mouseover(function(){ $targetLink.show(); }); $targetLink .click(function(){ $targetLink.blur(); }) .mouseout(function(e){ $targetLink.hide(); }) .css({ position: 'absolute', top: $container.offset().top, left: $container.offset().left, /* IE requires background to be set */ backgroundColor: '#FFF', display: 'none', opacity: 0, width: $container.outerWidth(), height: $container.outerHeight(), padding: 0 }) .appendTo('body'); }); }; })(jQuery);
вот как можно его подключить:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>"superLink" DEMO</title> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.js"></script> <script type="text/javascript" src="superlink.jquery.js"></script> <style type="text/css"> body {background:#EEE;color:#222;font:0.8em Arial,Verdana,Sans-Serif;margin:0;padding:20px;} div#contain {width: 946px; margin: 0 auto;} div.block {width:250px; background:white; display:inline;border: 2px solid #222; padding: 20px; float: left; margin: 10px;} h1 { margin: 0 10px; padding: 10px 0 0 0 ; } p { margin: 20px 10px; clear:both; } div.block p {margin: 0;} table,tr { border-collapse: collapse; } #table {width: 100%; float: left;} table { clear:both; margin: 20px 10px; } td { padding: 6px 18px; background: #DDD; border: 1px solid #222; } #contain div.active {background: #F39429; } tr.active td {background: #FFFE9F; } </style> </head> <body> <div id="contain"> <div class="block"> <a href="http://google.com">Google link</a> <p>Aliquam pulvinar tortor sed arcu vulputate pulvinar. Curabitur vestibulum, diam sit amet sollicitudin gravida, velit sapien euismod tortor, ut rhoncus dolor libero id dui. Mauris ac leo erat. Duis ac accumsan ante. Etiam sapien nunc, tincidunt sed consequat eget, imperdiet at nulla. Nullam rutrum bibendum viverra.</p> </div> <div id="table"> <table> <tr> <td><a href="http://google.com">Google</a></td> <td>Normal text</td> <td>Normal text</td> <td>Normal text</td> <td>Normal text</td> <td>Normal text</td> </tr> <tr> <td><a href="http://yahoo.com">Yahoo</a></td> <td>Normal text</td> <td>Normal text</td> <td>Normal text</td> <td>Normal text</td> <td>Normal text</td> </tr> </table> </div> </div> <script type="text/javascript"> $('div.block') .mouseover(function(){ $(this).addClass('active'); }) .mouseout(function(){ $(this).removeClass('active'); }) .superLink(); $('tr') .mouseover(function(){ $(this).addClass('active'); }) .mouseout(function(){ $(this).removeClass('active'); }) .superLink(); </script> </body> </html>
Он работает для любого элемента, содержащего ссылку.
Использовать плагин очень просто; например, у вас есть таблица с несколькими строками; в каждой строке есть ссылка в последнем столбце <td>
:
$('table#mytable tr').superLink('a:last');
Так каждая строка будет казаться пользователю одним гигантским якорем!
То есть:
- подключить в head или в конце страницы - superlink.jquery.js
- в футер вставить <script>
- добавить класс .block к блоку, который надо сделать ссылкой
almix
Разработчик Loco, автор статей по веб-разработке на Yii, CodeIgniter, MODx и прочих инструментах. Создатель Team Sense.
Вы можете почитать все статьи от almix'а.
- 0 Yii: Bootstrap tabs, делаем активной вкладку на которую выполняется переход по ссылке (20.03.2014)
- 0 CodeIgniter: Всплывающая форма обратной связи на Ajax в Bootstrap Modal и проверкой Captcha (18.02.2014)
- 0 Opencart: Модуль Filter Product OpenCart_v1.5.x: Как скрывать недоступные опции в фильтре (23.10.2013)
- 0 WordPress: Добавить ссылку "Сохранить фото" для галереи на NextGen с эффектом Lightbox (12.04.2013)
- Выдвигающаяся из значка форма поиска на сайте (27.11.2017)
- Как убрать placeholder при клике по input (04.11.2017)
- Свой дизайн кнопок социальных сетей для сайта. Кнопки "Поделиться" (19.06.2017)
- Загрузка файлов (картинок) по ajax через форму для Opencart (04.09.2016)
- Замена текста при наведении на него мышью. События onmouseover и onmouseout (25.03.2016)
- Прилипание блока к верху сайта при его прокручивании (17.02.2016)
- Разделитель тысяч в эффекте наматываемого счётчика jquery countTo (05.04.2015)
- Сделать слайдер на Owl Carousel c текстом справа (03.02.2015)
- Скролл-эффекты CSS3 и JQuery при прокрутке страницы (13.01.2015)
- Модальное окно Bootstrap 3 с формой, отправляющей email по Ajax (JQuery/PHP/HTML5/JqBootstrapValidation) (20.08.2015)
- Несколько функций в body onload (08.03.2013)
- Как в iframe показывать только определённую область страницы (04.03.2013)
- jQuery Tooltips от Jörn Zaefferer. Всплывающие подсказки с помощью jQuery (08.12.2012)
- Team Sense: Многопользовательский календарь, заменяем радиокнопки на чекбоксы в выборе преподавателей. Массивы в Javascript. (06.12.2012)
- Team Sense: В календарь-расписание уроков добавлено разделение по преподавателям, которым присвоены свои цвета. (04.12.2012)
- CodeIgniter не передаёт $this->uri->segment(3) в функцию контроллера (передача переменной PHP->JavaScript->PHP) (28.11.2012)
- Случаи возникновения ошибки в IE: "Предполагается наличие идентификатора, строки или числа" (Expected identifier, string...) (23.11.2012)
- Воюем с форматом даты в JavaScript. Приведение формата даты в поле input в календаре системы TeamSense к более красивому виду. (18.11.2012)
- Хороший тон: Если у пользователя отключен Javascript в браузере или устаревшая версия браузера (09.08.2012)
- Русификация FullCalendar (13.01.2012)
- Yii: Красивенький и чистенький JavaScript плавно прокручивает страницу до якоря и делает лёгкий откат (22.04.2012)
1 комментарий