我正在写一个网站,所有内容都存储在JavaScript环境中,因此应该可以在“页面”之间导航而无需其他HTTP请求。
不过,我想保留用户关于链接打开方式的意图。例如,如果Mac用户apple +单击链接,则应在新选项卡中将其打开。但是,如果用户要在当前窗口中打开链接,则我想避免发出新的HTTP请求,而仅使用DOM操作来显示新内容。
这是我尝试过的方法(JSFiddle):
<a href="http://yahoo.com" id="mylink">Yahoo!</a>
document.getElementById("mylink").onclick = function() {
alert("clicked");
return false;
}
对于正常的左键单击和上下文菜单操作,它的行为符合预期,但对于使用修饰键的单击,则不起作用。我可以检查是否保留了某些修饰键,但这似乎很脆弱。
Twitter的网站具有与我想要的行为类似的行为-单击用户名时,通常是AJAX请求,但是如果单击并按住meta键,则会得到一个新标签。
我宁愿没有库的普通JavaScript解决方案,除非这需要一堆特定于平台的逻辑。
我看了一下GitHub的代码,该代码也具有我所追求的行为,并且它确实检查了所持有的某些键。因此,我接受Chris的回答,因为似乎没有更好的选择。
$(document).on("click", ".js-directory-link", function (t) {
return 2 === t.which || t.metaKey || t.ctrlKey ? void 0 : ($(this).closest("tr").addClass("is-loading"), $(document.body).addClass("disables-context-loader"))
}
您可以检查ctrlKey
,shiftKey
以及metaKey
事件对象的属性。如果为真,则按住键控制,Shift或meta(Apple的命令)键,并且您应允许继续执行默认的链接操作。否则,您preventDefault
可以停止链接操作并改用javascript处理它。
添加target="_blank"
到锚标记中,因此默认链接行为是打开一个新选项卡。否则,它将在当前页面顶部打开(可能需要)。
这是两种方式的javascript:
document.getElementById("mylink").onclick = function(evnt) {
if (
evnt.ctrlKey ||
evnt.shiftKey ||
evnt.metaKey || // apple
(evnt.button && evnt.button == 1) // middle click, >IE9 + everyone else
){
return;
}
evnt.preventDefault();
alert("clicked");
return false;
}
小提琴:http : //jsfiddle.net/6byrt0wu/
文献资料
Event.ctrlKey
- https://developer.mozilla.org/en-US/docs/Web/API/event.ctrlKeyEvent.shiftKey
- https://developer.mozilla.org/en-US/docs/Web/API/event.shiftKeyEvent.metaKey
- https://developer.mozilla.org/en-US/docs/Web/API/event.metaKeya
标签-https: //developer.mozilla.org/zh-CN/docs/Web/HTML/Element/a本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句