Ответ 1
Вы можете добавить обработчик события onclick JavaScript в таблицу, чтобы сделать то же самое, что и ссылка.
Изменить: Удалено начальное предложение, так как оно плохо себя ведет в других браузерах.
Проблема: при окружении таблицы с привязным тегом таблица и все внутри не могут быть интерактивными в IE 6, 7 и 8. Как решить эту проблему при условии, что я не могу заменить таблицу на div?
Пример кода:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
<head>
<title>Test</title>
</head>
<body>
<a href="#" onclick="location.href='http://www.google.com'; return false;">
<table height="35">
<tr>
<td>I'm a link in a table, bet you can'tclick me!</td>
</tr>
</table>
</a>
</body>
</html>
Вы можете добавить обработчик события onclick JavaScript в таблицу, чтобы сделать то же самое, что и ссылка.
Изменить: Удалено начальное предложение, так как оно плохо себя ведет в других браузерах.
У вас не может быть таблицы внутри тега привязки, поскольку таблица является блочным тегом, а привязка - встроенным тегом. Теги блока не входят в встроенные теги, поэтому код недействителен. Замена таблицы на элементы div также не работает, так как они также являются элементами блока.
Стандарты определяют, как должен работать действительный код, но не как недействительный код должен работать. У разных браузеров есть разные способы сделать лучшее из ситуации. В этом случае одной из альтернатив для браузера является перемещение якоря внутри таблицы, другой альтернативой является перемещение таблицы из привязки. Любой метод даст желаемый результат в некоторых ситуациях, но не в других.
Единственный способ надежно разместить элемент блока внутри привязки - использовать элемент, который является элементом inlinde по умолчанию, и использовать CSS для превращения обоих элементов в элементы блока:
<a href="http://www.guffa.com" style="display:block;">
<span style="display:block;">Eat me</span>
</a>
Код действителен, поскольку по умолчанию оба элемента являются встроенными элементами, и он работает после того, как стиль применяется, поскольку элемент блока может находиться внутри другого элемента блока.
Почему бы не сделать это?
<table height="35">
<tr>
<td><a href="http://www.google.com">I'm a link in a table, bet you can click me!</a></td>
</tr>
</table>
Вот альтернативное решение:
<a href='#' onclick="location='http://www.google.com'" >
<table height="35">
<tr>
<td>I'm a link in a table, bet you can'tclick me!</td>
</tr>
</table>
</a>
У меня тоже появилась эта проблема сегодня и искал исправление, но не смог найти для нее рабочего решения. Поэтому я просто придумал это маленькое решение для jQuery. Вы можете изменить его, как хотите. Надеюсь, это даст идею тем, кто борется с этой проблемой IE7.
<!--[if lt IE 10]>
<script type="text/javascript">
$(document).ready(function(){
$('a').each(function(){
if($(this).children().length != 0){
$(this).click(function(){
var url = $(this).attr('href');
window.location = url;
});
}
});
});
</script>
<![endif]-->
Мне удалось найти решение для этого, оно не идеально, но оно работает:
a{ display:inline-block; position:relative; }
a:after{ content:''; position:absolute; top:0; left:0; width:100%; height:100%; background:url('x'); }
<a href='http://dropthebit.com' target='_blank'>
<table>
<tr>
<td>cell 1</td>
<td>cell 2</td>
<td>cell 3</td>
</tr>
</table>
</a>
Другим способом является использование делегирования событий JavaScript во всех ссылках на IE9, как показано ниже:
if( !('placeholder' in document.createElement('input')) ) // IE9 and below
$(document).on('click.ie', 'a', function(){ // bind a delegated event
window.location = $(this).prop('href');
});
Если вы достаточно сумасшедшие, чтобы поддерживать IE 7, 8 и 9 вообще, вы должны знать, что у вас не может быть ТАБЛИЦА внутри тега A в этих фиктивных браузерах.
Это справедливо даже в том случае, если вы делаете привязку как элемент блока. Однако вы можете поместить div внутри метки привязки, которая для меня еще более странная.
НЕТ других решений этой проблемы.
Вы можете добавить атрибут href непосредственно в таблицу insted of wrapping table в теге привязки.
<table height="35" href="http://www.google.com" id="link">
<tr>
<td>I'm a link in a table, bet you can'tclick me!</td>
</tr>
</table>
использовать при щелчке по таблице для перехода на URL-адрес, вызывающий коррозию.
$('#link').click(function () {
window.location = $(this).attr('href');
return false;
});
Если вы хотите сделать это:
<a href="domain.com/page.htm">
<table><tr><td>Hello World!</td><td><img src="image.jpg"></td></tr></table>
</a>
Во-первых, вы должны сделать универсальный код, который работает во всех браузерах без JavaScript:
<table class="fixlink">
<tr><td>
<a href="domain.com/page.htm">Hello World!</a>
</td><td>
<a href="domain.com/page.htm"><img src="image.jpg"></a>
</td></tr>
</table>
Теперь он работает, когда вы нажимаете элементы внутри таблицы, но не всю таблицу (но немного работает!). Затем вы должны применить окончательный код JavaScript для исправления, если браузер разрешил JS, используя jQuery следующим образом:
$('.fixlink').each(function() {
var a = $(this);
var b = a.find('a').eq(0)
var c = b.attr('href');
var d = b.attr('target');
if(typeof d === 'undefined'){d='_self'};
a.click(function(){
window.open(c, d);
});
a.css({'cursor':'pointer'});
a.find('a').contents().unwrap();
});// fixlink
И теперь он полностью работает, если браузер не имеет разрешения JS, работает нажатие внутри