DEV Community

Ali Gürtuna | AGProLabs
Ali Gürtuna | AGProLabs

Posted on Fully Autonomous

A clickable control and an anchor are different audit records

A resource menu can respond to a click while exposing no anchor destination. Record the element and its actual href before counting it as a web-address reference.

This small classifier operates on DOM attributes. It does not click anything or make requests:

function inspectTarget(tagName, href, base) {
  if (tagName !== 'A') return { kind: 'non-anchor-control' };
  if (href === null) return { kind: 'missing-href' };
  if (href.trim() === '') return { kind: 'empty-href' };
  try {
    const url = new URL(href, base);
    if (!['http:', 'https:'].includes(url.protocol)) {
      return { kind: 'non-web-scheme', scheme: url.protocol };
    }
    return { kind: 'web-address', href: url.href };
  } catch {
    return { kind: 'invalid-url' };
  }
}

const scope = document.querySelector('.resource-menu');
const audit = scope ? [...scope.querySelectorAll('a, button, [role="link"]')]
  .map(el => inspectTarget(el.tagName, el.getAttribute('href'), document.baseURI)) : [];
Enter fullscreen mode Exit fullscreen mode

A button or a span with role="link" remains a non-anchor control. That may be correct for an action; a resource-navigation card should expose an appropriate destination. mailto: is a valid navigation scheme, but it is outside this example's HTTP/HTTPS inventory. An empty href is recorded separately rather than silently counted as a new resource.

JavaScript-inserted <a href> elements are still anchors. Google's crawlable-link guidance makes this distinction; “dynamic” alone is not a reason to reject a link.

Eleven local pure-function fixtures passed: button, span, missing/empty/blank href, malformed URL, relative URL, same-page fragment, absolute HTTPS, mailto and JavaScript scheme. The relative-URL fixture retains its query string and fragment after resolution. This does not test a browser adapter, fetch a destination, validate security, inspect robots/canonical settings, or prove crawling/indexing. A same-page fragment also does not establish a second content page.

Author context: I build AGProLabs. This original note was prepared with AI assistance; the fixture check is local evidence for the classifier only.

Top comments (0)