next.js 如何检测链接是否会将您带到另一个页面?

fnvucqvd  于 2022-11-05  发布在  其他
关注(0)|答案(2)|浏览(127)

假设我有一个名为linksToAnotherPage的函数,它接收到一个href。我如何检查该href是否将您带到另一个页面,或者它是否是tel:mailto:#anchor-link等,但不会将您带到另一个页面?

function linksToAnotherPage(href) {
 ....
}

linksToAnotherPage('tel:123-456-7890') -> // false
linksToAnotherPage('contact') -> // true

--

// does not link to another page

<a href="tel:123-456-7890">123-456-7890</a>
<a href="mailto:email@example.com">Send Email</a>
<a href="#start-now">Start Now</a>

// links to another page
<a href="contact">Send Email</a>

--
更新:以下是我根据收到的答案提出的当前解决方案

function isInteractiveHref (href) {
        return (
            href.startsWith("mailto:") || href.startsWith("tel:") || 
            href.startsWith("#")
        )        
    }

    isInteractiveHref(props.href) ? (
        <Link href={props.href}>
            <a>Does not link to another page</a>
        </Link>
    ) : <Link href={'/' + props.href}>
            <a> Links to another page</a>
        </Link>
ztmd8pv5

ztmd8pv51#

你可以只使用一个简单的if语句,有有限的类型的链接,将转到另一个页面:

  • 以“/”开头的链接
  • 以“http://"、“https://"或“wwww”开头的链接。

所以,我认为这个功能可以帮助:

function linksToAnotherPage(href) {
   if (href.startsWith("/") || href.startsWith("http://" || href.startsWith("https://" || href.startsWith("www."){
      ....
   }
}
5kgi1eie

5kgi1eie2#

function linksToAnotherPage(href) {
  if(['tel','mailto'].some(i=>href.startsWith(`${i}:`))) return false;
  let a = new URL(window.location.href);
  let b = new URL(href, window.location.href);
  return !['protocol', 'host', 'pathname', 'search']
    .every(i=>a[i]===b[i]);
}

您可以在此处找到可能需要额外匹配的URL前缀列表:https://en.wikipedia.org/wiki/List_of_URI_schemes

相关问题