如何用jQuery检测用户是否点击了“在新窗口打开链接”选项
实现方案
方案1:拦截新窗口打开触发操作(推荐)
针对所有可跳转元素(a标签、自定义标签),拦截快捷键点击(ctrl/cmd/shift+点击)和右键操作,手动控制新窗口打开登录页:
// 统一处理所有具备跳转能力的元素 const handleJumpElements = () => { // 选择目标元素:a标签、带data-href的自定义标签、标记为link角色的标签 const elements = document.querySelectorAll('a, [data-href], [role="link"]'); elements.forEach(el => { // 保存原跳转地址 const originalUrl = el.href || el.dataset.href || ''; // 处理ctrl/cmd/shift点击(触发新窗口的快捷操作) el.addEventListener('click', (e) => { if (e.ctrlKey || e.metaKey || e.shiftKey) { e.preventDefault(); window.open('/login'); } }); // 处理右键点击:临时替换跳转地址为登录页,右键菜单消失后恢复原地址 el.addEventListener('contextmenu', (e) => { if (el.tagName === 'A') { el.href = '/login'; setTimeout(() => { el.href = originalUrl; }, 100); } else if (el.dataset.href) { el.dataset.href = '/login'; setTimeout(() => { el.dataset.href = originalUrl; }, 100); } }); }); }; // 页面加载完成后执行 document.addEventListener('DOMContentLoaded', handleJumpElements); // 若页面存在动态加载的元素,需在元素加载完成后重新调用handleJumpElements
注意:此方案会导致右键菜单显示期间,复制链接地址会得到登录页地址;若需保留原链接复制功能,可改用自定义右键菜单方案。
方案2:自定义右键菜单(完全控制行为)
替换原生右键菜单,仅保留“在新窗口打开链接”选项,点击时直接打开登录页:
// 给所有可跳转元素绑定右键事件 document.querySelectorAll('a, [data-href], [role="link"]').forEach(el => { el.addEventListener('contextmenu', (e) => { e.preventDefault(); // 创建自定义右键菜单容器 const menu = document.createElement('div'); menu.style.cssText = ` position: fixed; top: ${e.pageY}px; left: ${e.pageX}px; background: #fff; border: 1px solid #e0e0e0; border-radius: 4px; padding: 8px 0; min-width: 160px; z-index: 99999; box-shadow: 0 2px 8px rgba(0,0,0,0.15); `; // 创建“在新窗口打开链接”选项 const openOption = document.createElement('div'); openOption.textContent = '在新窗口打开链接'; openOption.style.cssText = ` padding: 8px 16px; cursor: pointer; user-select: none; `; // 选项交互效果 openOption.addEventListener('mouseover', () => { openOption.style.background = '#f5f5f5'; }); openOption.addEventListener('mouseout', () => { openOption.style.background = 'transparent'; }); // 点击选项打开登录页 openOption.addEventListener('click', () => { window.open('/login'); menu.remove(); }); menu.appendChild(openOption); document.body.appendChild(menu); // 点击页面其他区域关闭菜单 const closeMenu = () => { menu.remove(); document.removeEventListener('click', closeMenu); }; setTimeout(() => { document.addEventListener('click', closeMenu); }, 0); }); });
优点:完全控制右键菜单行为,复制链接地址等操作不受影响;缺点:改变原生右键菜单样式,可能影响用户使用习惯。
方案3:重写window.open(覆盖JS触发的新窗口)
如果网站内的自定义标签(如span)是通过JS调用window.open实现跳转的,可重写该方法强制打开登录页:
const originalOpen = window.open; window.open = function(url, target, features) { // 仅当目标为新窗口时(target为_blank或未指定),跳转登录页 if (!target || target === '_blank') { return originalOpen('/login', target, features); } // 其他场景保持原行为 return originalOpen(url, target, features); };
注意:此方案仅对JS调用window.open的场景有效,原生a标签右键新窗口打开无法覆盖。
内容的提问来源于stack exchange,提问作者Neeraj Bhardwaj
相关产品推荐
相关产品推荐

