fix(desktop): Links mit target=_blank im Client ueber window.open oeffnen
Im Desktop-Client unter Windows tat ein Klick auf Favoriten und andere Links mit target=_blank nichts, waehrend window.open (Such-Widget) ueber on_new_window im System-Browser landete (VM 8233 nachgestellt). DesktopExternalLinks leitet im Client Links- und Mittelklicks auf solche http/https-Links auf window.open um; von der Seite verhinderte Klicks (Favoriten im Bearbeiten-Modus) bleiben verhindert. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
'use client';
|
||||
|
||||
import { useEffect } from 'react';
|
||||
import { useIsDesktopClient } from '@/lib/desktop-client';
|
||||
|
||||
/**
|
||||
* DesktopExternalLinks (quick-261001-cxo) — Links mit `target="_blank"`
|
||||
* (Favoriten, „In neuem Tab öffnen“ bei XFrame/eigenen Modulen, Quellen im
|
||||
* Ausschreibungs-Radar) taten im Desktop-Client unter Windows beim Klick
|
||||
* nichts, `window.open` (Such-Widget) dagegen landet ueber `on_new_window`
|
||||
* im System-Browser (VM 8233, 01.10.2026: Favorit ohne Wirkung, Suche oeffnet
|
||||
* Edge). Im Client leitet dieser Helfer solche Klicks deshalb auf
|
||||
* `window.open` um.
|
||||
*
|
||||
* Lauscht auf `window` in der Bubble-Phase, also NACH Reacts Handlern am
|
||||
* Dokument: ein Klick, den die Seite selbst verhindert (Favoriten im
|
||||
* Bearbeiten-Modus), bleibt verhindert. Nur http/https -- alles andere
|
||||
* verwirft der Client ohnehin.
|
||||
*/
|
||||
function externalTarget(event: MouseEvent): HTMLAnchorElement | null {
|
||||
if (event.defaultPrevented) return null;
|
||||
// Linksklick und Mittelklick oeffnen beide ein neues Fenster.
|
||||
if (event.button !== 0 && event.button !== 1) return null;
|
||||
const target = event.target;
|
||||
if (!(target instanceof Element)) return null;
|
||||
const anchor = target.closest('a[href]');
|
||||
if (!(anchor instanceof HTMLAnchorElement)) return null;
|
||||
if (anchor.target !== '_blank') return null;
|
||||
if (anchor.protocol !== 'http:' && anchor.protocol !== 'https:') return null;
|
||||
return anchor;
|
||||
}
|
||||
|
||||
export function DesktopExternalLinks() {
|
||||
const isDesktop = useIsDesktopClient();
|
||||
|
||||
useEffect(() => {
|
||||
if (!isDesktop) return;
|
||||
|
||||
const handler = (event: MouseEvent) => {
|
||||
if (event.type === 'auxclick' && event.button !== 1) return;
|
||||
if (event.type === 'click' && event.button !== 0) return;
|
||||
const anchor = externalTarget(event);
|
||||
if (!anchor) return;
|
||||
event.preventDefault();
|
||||
window.open(anchor.href, '_blank', 'noopener,noreferrer');
|
||||
};
|
||||
|
||||
window.addEventListener('click', handler);
|
||||
window.addEventListener('auxclick', handler);
|
||||
return () => {
|
||||
window.removeEventListener('click', handler);
|
||||
window.removeEventListener('auxclick', handler);
|
||||
};
|
||||
}, [isDesktop]);
|
||||
|
||||
return null;
|
||||
}
|
||||
Reference in New Issue
Block a user