Javascript select-Event – Text in Eingabefeld markiert

Das select-Event feuert, wenn der Benutzer einen Text in einem Eingabefeld eines Formulars markiert. select ist ein Ereignis für INPUT- und TEXTAREA-Elemente, nicht aber für select-Elemente, auch wenn es so klingt.

Javascript on select Event: Beim Markieren von Text

Text in input- oder textarea markieren

select klingt, als wäre es ein Event für ein select-Element in einem Formular, reagiert aber tatsächlich auf das Markieren eines Textes in einem Eingabefeld (beim Ändern von input, textarea und select feuert ein onchange-Event).

<input type="text">
<input type="search">
<input type="url">
<input type="tel">
<input type="password"> (eingeschränkt)
<textarea>

Hingegen löst das select-Event nicht auf auf <div contenteditable>, nicht auf normalen Text in p- oder span-Elementen, nicht auf Checkboxen, Radio-Buttons und nicht auf button-Elementen.

Das select-Event wird z.B. für Editoren eingesetzt – etwa in den Editoren von Content Management Systemen, wo der Editor erkennen muss, dass ein Text markiert wurde, um über einen Button fett gesetzt zu werden.

Das Markieren von Text erkennen
Text im Editor markieren, um ihn Fett zu setzen

Markierten Text erkennen

Wenn der Benutzer Text in einem input- oder textarea-Feld markiert (gleich, ob durch Klicken und Ziehen der Maus oder durch Tastatur-Befehle wie Shift + Rechtspfeil), meldet sich das select-Event.

Ein Event Handler für textarea könnte z.B. einen markierten Text in strong-Tags setzen, um ein Textfeld mit zusätzlichen Funktionen auszustatten.

const formdemo = document.querySelector("#formdemo");
const resp = document.querySelector("#resp");

formdemo.addEventListener("select", (event) => {
	const el = event.target;

	if (el.matches("input.formdemo, textarea.formdemo")) {
		const start = el.selectionStart;
		const end = el.selectionEnd;

		const selectedText =
			start !== end ? el.value.slice(start, end) : "(nichts markiert)";

		resp.textContent = `Markiert in ${el.tagName.toLowerCase()}: "${selectedText}"`;
	}
});

input- und textarea-Felder kapseln ihren Text und der Browser behandelt sie nicht als DOM-Text. Darum haben sie ein eigenes Selection-API.

el.selectionStart
el.selectionEnd
el.value.slice(start, end)

Markierten Text auf einem Touchscreen erkennen

Früher galt – besonders auf iOS: das select-Event feuert unzuverlässig und die Touch-Selektion war nicht standardisiert, selectionchange inkonsistent.

Um ein Selektieren auf dem Touchscreen zu überwachen, wurde ein EventListener für touchstart, touchmove, touchend und selectionchange herangezogen.

Heute reicht element.addEventListener("select", handler)

const touchArea = document.querySelector("#touchArea");
const result = document.querySelector("#result");

function handleTextSelection(event) {
  const el = event.target;

  // Nur relevante Elemente
  if (!(el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement)) {
    return;
  }

  const { selectionStart, selectionEnd, value } = el;

  // Keine echte Markierung
  if (selectionStart === selectionEnd) {
    return;
  }

  const selectedText = value.slice(selectionStart, selectionEnd);

  console.log("Markierter Text:", selectedText);
  result.innerHTML = selectedText;

  return selectedText;
}

touchArea.addEventListener("select", handleTextSelection);

onselect Attribute

target
Objekt zu dem das Ereignis ursprünglich gesendet wurde
eventPhase
Phase, in der das Ereignis bearbeitet wird: AT_TARGET, BUBBLING_PHASE, CAPTURING_PHASE
bubbles
true, wenn das Ereignis nach oben steigen kann
cancelable
Nein
timeStamp
Zeit in Millisekunden, zu der das Ereignis eingetreten ist
Suchen auf mediaevent.de