Inhaltsverzeichnis
Legen Sie den Wert eines benutzerdefinierten Elements fest
Fügen Sie die Beschränkungsüberprüfung hinzu
Erstellen Sie ein Mikroformular
Heim Web-Frontend CSS-Tutorial Erstellen von benutzerdefinierten Formularsteuerungen mit ElementInternalen

Erstellen von benutzerdefinierten Formularsteuerungen mit ElementInternalen

Mar 26, 2025 am 09:44 AM

Erstellen von benutzerdefinierten Formularsteuerungen mit ElementInternalen

Entwickler sind seit langem bestrebt, mehr Kontrolle über Formelemente zu haben. Obwohl dies etwas übertrieben ist, ist das Erstellen oder Anpassung von Formkomponenten seit Jahren der heilige Gral der Front-End-Webentwicklung.

Benutzerdefinierte Elemente (z.<my-custom-element></my-custom-element> ) Eines der leistungsstärksten Funktionen wurde seit der Google Chrome 77 -Version leise veröffentlicht und schrittweise auf andere Browser angewendet. Der ElementInternals Standard ist ein leistungsstarker Satz von Funktionen mit einem sehr zurückhaltenden Namen. Zu den Funktionen gehören teilnehmende Formulare und APIs, die Barrierefreiheitskontrollen umgeben.

In diesem Artikel wird untersucht, wie benutzerdefinierte Formularsteuerung erstellt, die Beschränkungsüberprüfung integriert, die Grundlagen der internen Barrierefreiheit eingeführt und angezeigt werden, wie diese Funktionen kombiniert werden, um hoch tragbare Makroform -Steuerelemente zu erstellen.

Beginnen wir zunächst ein einfaches benutzerdefiniertes Element, das unserem Designsystem entspricht. Unsere Elemente speichern alle Stile in Shadow DOM und gewährleisten eine grundlegende Zugänglichkeit. Wir werden die exzellente Litelement -Bibliothek vom Google Polymer -Team als Codebeispiel verwenden, und obwohl Sie sie unbedingt nicht benötigen, bietet sie eine gute Abstraktion für das Schreiben von benutzerdefinierten Elementen.

In diesem Beispiel erstellen wir a<rad-input></rad-input> Es hat einige grundlegende Designs. Wir haben auch eine zweite Eingabe in das Formular hinzugefügt, bei dem es sich um eine normale HTML -Eingabe handelt, und den Standardwert hinzugefügt (so können Sie einfach Senden -Senden drücken und sehen, wie es funktioniert).

Wenn wir auf die Schaltfläche Senden klicken, passieren mehrere Dinge. Zunächst wird die preventDefault -Methode des Commit -Ereignisses in diesem Fall aufgerufen, um sicherzustellen, dass unsere Seite nicht neu lädt. Danach erstellen wir ein FormData -Objekt, mit dem wir auf Informationen über das Formular zugreifen können, mit dem wir eine JSON -Zeichenfolge erstellen und an anhängen<output></output> Element. Beachten Sie jedoch, dass der zu unserer Ausgabe hinzugefügte eindeutige Wert von einem Element "Basic" stammt.

Dies liegt daran, dass unsere Elemente noch nicht wissen, wie sie mit dem Formular interagieren sollen<rad-input></rad-input> , um es zu helfen, seinen Namen zu verdienen. Zunächst müssen wir die attachInternals -Methode unserer Methode im Konstruktor des Elements aufrufen und die ElementInternals Polyfill in unsere Seite importieren, um die Spezifikation noch nicht zu verwenden.

Die attachInternals -Methode gibt eine neue interne Element -Instanz zurück, die einige neue APIs enthält, die wir in unseren Methoden verwenden können. Damit unsere Elemente diese APIs ausnutzen können, müssen wir einen statischen formAssociated Getter hinzufügen, der true zurückgibt.

 Class Radinput erweitert Litelement {
  static get formassociated () {
    zurückkehren;
  }

  constructor () {
    super();
    this.internals = this.attachinternals ();
  }
}
Nach dem Login kopieren

Werfen wir einen Blick auf einige APIs im internals -Attribut eines Elements:

  • setFormValue(value: string|FormData|File, state?: any): void - Diese Methode legt den Wert eines Elements in seinem übergeordneten Formular fest, wenn die übergeordnete Form vorhanden ist. Wenn der Wert null ist, beteiligt sich das Element nicht am Formulareinreichungsprozess.
  • form - Wenn vorhanden, ist es ein Verweis auf die übergeordnete Form des Elements.
  • setValidity(flags: Partial<validitystate> , message?: string, anchor?: HTMLElement): void</validitystate> , Nachricht ? setValidity setValidity(flags: Partial<validitystate> , message?: string, anchor?: HTMLElement): void</validitystate> Wenn das Formular ungültig ist, muss eine Verifizierungsnachricht vorhanden sein.
  • willValidate - wahr, wenn das Element bewertet wird, wenn das Formular eingereicht wird.
  • validity - Ein Validitätsobjekt, das der API und der Semantik entspricht, die an HTMLInputElement.prototype.validity beigefügt ist.
  • validationMessage - Wenn Sie die Kontrolle zur Ungültigkeit der Steuerung setValidity , ist dies die Nachricht, die den Fehler beschreibt.
  • checkValidity - Gibt true zurück, wenn das Element gültig ist, ansonsten false zurückgibt und ein ungültiges Ereignis für das Element auslöst.
  • reportValidity - Wie checkValidity , wenn das Ereignis nicht storniert wird, wird dem Benutzer ein Problem gemeldet.
  • labels - Verwenden Sie label[for] Attribut, um die Liste der Elemente für dieses Element zu markieren.
  • Einige andere Steuerelemente zum Festlegen von Aria -Informationen zu Elementen.

Legen Sie den Wert eines benutzerdefinierten Elements fest

Lassen Sie uns unsere ändern<rad-input></rad-input> Einige dieser APIs auszunutzen:

Hier ändern wir die _onInput -Methode des Elements, um einen Aufruf auf this.internals.setFormValue zu enthalten. Dies gibt das Formular an, dass unser Element einen Wert im Formular unter Verwendung seines angegebenen Namens registrieren möchte (als Eigenschaft in unserem HTML festgelegt). Wir haben auch eine firstUpdated -Methode hinzugefügt (ähnlich wie bei connectedCallback , wenn Sie Litelement nicht verwenden), das den Wert des Elements auf eine leere Zeichenfolge festlegt, wenn das Element das Rendering abgeschlossen ist. Dies soll sicherstellen, dass unsere Elemente immer den Wert des Formulars haben (obwohl nicht erforderlich, können Sie die Elemente aus dem Formular ausschließen, indem Sie einen Nullwert übergeben).

Wenn wir nun den Eingang Mehrwert verleihen und das Formular einreichen, werden wir in unserer sein<output></output> Im Element wird ein radInput angezeigt. Wir können auch sehen, dass unser Element der radInput -Eigenschaft von HTMLFormElement hinzugefügt wurde. Eine Sache, die Sie jedoch vielleicht bemerkt haben, ist, dass es trotz unseres Elements immer noch die Einreichung von Formularen ermöglicht. Als nächstes fügen wir unser Element eine Validierung hinzu.

Fügen Sie die Beschränkungsüberprüfung hinzu

Um die Validierung des Feldes festzulegen, müssen wir das Element ein wenig ändern, um die setValidity -Methode auf dem Objekt im Element zu verwenden. Diese Methode akzeptiert drei Parameter (wenn das Element ungültig ist, ist nur der zweite Parameter erforderlich und der dritte Parameter ist immer optional). Der erste Parameter ist Teil ValidityState -Objekts. Wenn ein Flag auf TRUE eingestellt ist, wird die Steuerung als ungültig markiert. Wenn einer der integrierten Gültigkeitsschlüsseln Ihren Anforderungen nicht entspricht, können Sie den gemeinsamen customError -Schlüssel verwenden. Wenn die Steuerung gültig ist, werden wir schließlich ein Objektliteral ({}) übergeben, um die Gültigkeit der Steuerung zurückzusetzen.

Der zweite Parameter ist die Gültigkeitsmeldung der Steuerung. Dieser Parameter ist erforderlich, wenn die Steuerung ungültig ist und dieser Parameter nicht zulässig ist, wenn das Steuerelement gültig ist. Der dritte Parameter ist ein optionales Überprüfungsziel, das den Schwerpunkt des Benutzers steuert, wenn die Formulareingabe ungültig ist oder wenn reportValidity aufgerufen wird.

Wir werden unsere geben<rad-input></rad-input> Stellen Sie eine neue Methode ein, um diese Logik zu bewältigen:

 _ManageRequired () {
  const {value} = this;
  const input = this.shadowroot.querySelector ('Eingabe');
  if (value === '' && this.Required) {
    this.internals.setvalidity ({{
      Valuemissing: Richtig
    }, 'Dieses Feld ist erforderlich', Eingabe);
  } anders {
    this.internals.setValidity ({});
  }
}
Nach dem Login kopieren

Diese Funktion erhält den Wert und die Eingabe der Steuerung. Wenn der Wert gleich einer leeren Zeichenfolge ist und das Element nach Bedarf markiert ist, rufen wir internals.setValidity an. Jetzt müssen wir nur diese Methode in unseren firstUpdated und _onInput -Methoden nennen, und wir können unseren Elementen eine grundlegende Validierung hinzufügen.

In Abwesenheit von unserem<rad-input></rad-input> Klicken Sie vor dem Eingeben des Wertes auf die Schaltfläche Senden und die Fehlermeldung werden nun in Browsern angezeigt, die die ElementInternals -Spezifikation unterstützen. Leider unterstützt Polyfill immer noch nicht das Anzeigen von Überprüfungsfehlern , da es keinen zuverlässigen Weg gibt, das integrierte Verifizierungspopup in nicht unterstützten Browsern auszulösen.

Wir haben unser Beispiel auch einige grundlegende Informationen zur Zugänglichkeit hinzugefügt, indem wir unser internals -Objekt verwenden. Wir fügen dem Element eine zusätzliche Eigenschaft _required , die als Proxy this.required fungiert required

 Erfordernst () {
  return this._Required;
}

Setzen Sie erforderlich (isRequired) {
  this._required = isRequired;
  this.internals.arioRequired = isRequired;
}
Nach dem Login kopieren

Indem wir die required Eigenschaft an internals.ariaRequired weitergeben, erinnern wir den Bildschirmleser daran, dass unser Element derzeit einen Wert benötigt. In der Polyfill erfolgt dies durch Hinzufügen des aria-required Attributs; In unterstützten Browsern wird das Attribut jedoch nicht dem Element hinzugefügt, da das Attribut dem Element inhärent ist.

Erstellen Sie ein Mikroformular

Nachdem wir nun eine gültige Eingabe haben, die zu unserem Designsystem passt, möchten wir unsere Elemente möglicherweise in Mustern kombinieren, die über mehrere Anwendungen hinweg wiederverwendet werden können. Eines der auffälligsten Merkmale von ElementInternals ist, dass die setFormValue Methode nicht nur Zeichenfolge und Dateidaten, sondern auch FormData-Objekte annehmen kann. Nehmen wir also an, wir möchten ein gemeinsames Adressformular erstellen, das in mehreren Organisationen verwendet werden kann. Dies können wir dies einfach mit unseren neu erstellten Elementen tun.

In diesem Beispiel erstellen wir eine Form innerhalb der Schattenwurzel des Elements, in der wir vier kombinieren<rad-input></rad-input> Element zum Erstellen eines Adressformulars. Anstatt diesmal mit einer Zeichenfolge setFormValue aufzurufen, bestehen wir dafür, den gesamten Wert des Formulars zu übergeben. Infolgedessen übergibt unser Element den Wert jedes einzelnen Elements in seiner untergeordneten Form an die externe Form.

Das Hinzufügen von Einschränkungsvalidierung zu diesem Formular wäre ein ziemlich einfacher Prozess, ebenso wie zusätzliche Styling-, Verhaltens- und Inhalts -Slots. Durch die Verwendung dieser neueren APIs können Entwickler letztendlich viel Potenzial für benutzerdefinierte Elemente freischalten und uns letztendlich die Freiheit haben, die Benutzererfahrung zu kontrollieren.

Das obige ist der detaillierte Inhalt vonErstellen von benutzerdefinierten Formularsteuerungen mit ElementInternalen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Vue 3 Vue 3 Apr 02, 2025 pm 06:32 PM

Es ist aus! Herzlichen Glückwunsch an das Vue -Team, dass es eine massive Anstrengung war und lange kommt. Alle neuen Dokumente auch.

Können Sie gültige CSS -Eigenschaftswerte aus dem Browser erhalten? Können Sie gültige CSS -Eigenschaftswerte aus dem Browser erhalten? Apr 02, 2025 pm 06:17 PM

Ich ließ jemanden mit dieser sehr legitimen Frage einschreiben. Lea hat gerade darüber gebloggt, wie Sie gültige CSS -Eigenschaften selbst aus dem Browser erhalten können. Das ist so.

Ein bisschen auf CI/CD Ein bisschen auf CI/CD Apr 02, 2025 pm 06:21 PM

Ich sage "Website" passt besser als "Mobile App", aber ich mag dieses Rahmen von Max Lynch:

Verwenden von Markdown und Lokalisierung im WordPress -Block -Editor Verwenden von Markdown und Lokalisierung im WordPress -Block -Editor Apr 02, 2025 am 04:27 AM

Wenn wir dem Benutzer direkt im WordPress -Editor Dokumentation anzeigen müssen, wie können Sie dies am besten tun?

Gestapelte Karten mit klebriger Positionierung und einem Schuss Sass Gestapelte Karten mit klebriger Positionierung und einem Schuss Sass Apr 03, 2025 am 10:30 AM

Neulich habe ich dieses besonders schöne Stück von der Website von Corey Ginnivan entdeckt, auf der eine Sammlung von Karten aufeinander stapelt.

Vergleich von Browsern für reaktionsschnelles Design Vergleich von Browsern für reaktionsschnelles Design Apr 02, 2025 pm 06:25 PM

Es gibt eine Reihe dieser Desktop -Apps, in denen das Ziel Ihre Website gleichzeitig in verschiedenen Dimensionen angezeigt wird. So können Sie zum Beispiel schreiben

So verwenden Sie CSS -Gitter für klebrige Header und Fußzeilen So verwenden Sie CSS -Gitter für klebrige Header und Fußzeilen Apr 02, 2025 pm 06:29 PM

CSS Grid ist eine Sammlung von Eigenschaften, die das Layout einfacher machen als jemals zuvor. Wie alles andere ist es eine kleine Lernkurve, aber das Gitter ist

Google -Schriftarten variable Schriftarten Google -Schriftarten variable Schriftarten Apr 09, 2025 am 10:42 AM

Ich sehe, dass Google -Schriftarten ein neues Design (Tweet) ausgelöst haben. Im Vergleich zur letzten großen Neugestaltung fühlt sich dies viel iterativer an. Ich kann den Unterschied kaum erkennen

See all articles