如何将一个div标签转换为链接?我想让整个div可点击。
JS:
<div onclick="location.href='url'">content</div>
jQuery:
$("div").click(function(){
window.location=$(this).find("a").attr("href"); return false;
});
确保这些DIV使用cursor:pointer
div
放置在a
内部:<a href="http://www.google.com"><div>Some content here</div></a>
建议使用这种方法,因为它可以清楚地表明您的结构中所有内容都是可点击的,并且指向何处。
像这样:
<div style="height: 80px"><a href="#" style="display: block">Text</a></div>
现在,当用户将光标悬停在该div中时,锚点标记将填充该div。
所以你想让一个元素变成它本来不是的样子?
一般来说这不是一个好主意。如果你需要一个链接,就使用一个链接。大多数情况下,最好只是在适当的地方使用相应的标记。
所有这些都说了,有时候你必须打破规则。现在,问题中没有javascript,因此我将在这里放置免责声明:
如果没有使用链接(或等效物,如仅包含提交按钮的<form>
),或使用JavaScript,则无法使<div>
作为链接起作用。
从现在开始,本答案将假设允许使用JavaScript,并且正在使用jQuery(为了简洁起见)。
有了这些,让我们深入探讨何为链接。
链接通常是你点击的元素,以便将你导航到一个新文档。
看起来很简单。监听点击事件并更改位置:
不要这样做$('.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时触发点击事件:
也不要这样做
$('.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>
是一个链接,所以即使你可以通过键盘到达那里,用户也不知道该怎么做。<div>
。当然,该属性是[role]
属性,它很好地告诉屏幕阅读器我们的<div>
是一个链接:
呃,每分钟都在变得更糟
$('[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
,但它仍然可以工作。这很容易解决:
$(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
来解决。[data-*]
属性,然后就可以完成了。<DIV>
而不是锚点!好吧,我会解决前四个问题,不再解决更多问题。我已经受够了这个愚蠢的自定义元素垃圾。我一开始就应该使用<a>
元素。
$(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>
不要这样做。
<A>NCHOR</a>
标签包装内容。<DIV>
转换为链接,请使用"JavaScript"将<DIV>
包装在<A>NCHOR</A>
中。<DIV>
时执行某些操作,请使用onclick
事件处理程序...并不要称其为“链接”。<div style="cursor:pointer" onclick="document.location='http://www.google.com'">Content Goes Here</div>
<div style="cursor:pointer;" onclick="document.location='http://www.google.com'">Foo</div>
$('div#id').click(function (e) {
// Do whatever you want
});
URL
放在JS代码中,请确保还将其包含在页面的其他传统HTML链接中。