<a> dynamicznie, javascript
<a>
w JavaScripcie użyj metod DOM (document.createElement
, setAttribute
, appendChild
/ prepend
lub insertAdjacentHTML
) albo zarządzaj istniejącymi linkami poprzez querySelector[All]
, classList
i addEventListener
.href
, textContent
, target
, rel
) → dodaj do wybranego węzła DOM → (opcjonalnie) podłącz zdarzenia oraz klasy CSS.const a = document.createElement('a');
a.href = 'https://example.com';
a.textContent = 'Odwiedź Example';
a.target = '_blank';
a.rel = 'noopener noreferrer'; // zabezpieczenie przed tabnabbingiem
document.getElementById('kontener').appendChild(a);
Alternatywy:
insertAdjacentHTML('beforeend', '<a …>…</a>')
(prościej, ale ryzyko XSS, brak referencji JS).innerHTML += …
(szybkie, lecz przebudowuje węzeł i kasuje istniejące nasłuchy).const link = document.querySelector('#myLink');
link.href = 'https://nowy-adres.pl';
link.textContent = 'Nowy tekst';
link.classList.add('is-active');
document.addEventListener('click', e => {
if (e.target.matches('a.dynamic')) {
e.preventDefault();
// własna logika…
}
});
Delegacja zmniejsza liczbę nasłuchów i działa również dla później dodanych linków.
link.style.color = 'red';
(prototyp, niski SLA). link.classList.toggle('highlight');
(zalecane – separacja logiki i prezentacji). document.documentElement.style.setProperty('--link-color', '#fa0');
(globalne motywy).function renderLinks(data) {
const frag = document.createDocumentFragment();
data.forEach(({url, txt}) => {
const a = document.createElement('a');
a.href = url; a.textContent = txt;
frag.appendChild(a);
});
document.getElementById('list').appendChild(frag);
}
DocumentFragment
minimalizuje reflow/repaint.
function makeDownload(name, data) {
const blob = new Blob([data], {type: 'text/plain'});
const url = URL.createObjectURL(blob);
const a = Object.assign(document.createElement('a'), {
href: url, download: name, textContent: `Pobierz ${name}`
});
a.addEventListener('click', () => setTimeout(() => URL.revokeObjectURL(url), 5000));
return a;
}
URLPattern
(Chromium ≥ 105) ułatwia mapowanie dynamicznych ścieżek. rel="preload"
/rel="prefetch"
poprawiają wydajność nawigacji. <a>
poprzez warstwę wirtualnego DOM-u; dobre praktyki są takie same: klucze (key
/:key
) i zabezpieczenia rel
.target="_blank"
zawsze łącz z rel="noopener noreferrer"
– izoluje kontekst window.opener
. textContent
vs. innerHTML
: pierwsze koduje HTML, drugie wstrzykuje raw HTML (ryzyko XSS). data-*
) wymaga zgodności z RODO/GDPR. :focus-visible
), informacja tekstowa ≠ sama ikona/kolor.DocumentFragment
. href
(np. URL.canParse
) przed wstawieniem. <template>
w HTML) dla elementów powtarzalnych. innerHTML
bywa szybsze, ale niszczy nasłuchy i łatwo wprowadzić XSS. URLPattern
(fallback!).Navigation Preload
). <a>
. Dynamiczne operacje na <a>
w JavaScripcie sprowadzają się do:
rel
, walidacja URL, XSS).