You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 23:44:52