[RUBY] JavaScript (Vanille) reagiert in Rails nicht.

In Rails5 ist von Anfang an ein jQuery-Juwel installiert, das standardmäßig verfügbar ist, sofern Sie es nicht entfernen. Als ich anfing, Rails zu lernen, gewöhnte ich mich daran, jQuery anstelle von einfachem JavaScript (im Folgenden "Vanille") zu verwenden. Dieses Mal wagte ich es, einen Weg zu finden, jQuery nicht zu verwenden, um Vanille wieder zu lernen.

Umgebung

Ruby 2.5.7 Rails 5.2.4

Hintergrund

Als ich wieder anfing, Code in Vanille zu schreiben, war ich ziemlich süchtig danach. Wenn ich es in jQuery schreiben könnte, wäre es bis dahin in Ordnung, aber es war unangenehm, es so zu lassen, wie es war, also beschloss ich, es ein wenig anzugehen.

Sofortfunktion funktioniert nicht

Ich habe versucht, das Konsolenprotokoll mit einem Klickereignis als Ausgangspunkt zu überprüfen. In jQuery $ (function () {process}); wie unten gezeigt Es ist notwendig zu schreiben. (Der Grund wird später beschrieben.)

application.js


// jQuery
$(function() {
  $("Name des Selektors").on('klicken', function() {
    console.log('Es wurde angeklickt.');
  });
});

Vanillas unmittelbare Funktion ohne jQuery ist wie folgt geschrieben.

application.js


//Vanille
(function() {
  document.getElementById("Name des Selektors").addEventListener('click', function() {
    console.log('Es wurde angeklickt.');
  });
}());

Die beiden oben genannten Codes haben dieselbe Verarbeitung, aber aus irgendeinem Grund weist die Vanille einen Fehler auf und wird nicht im Konsolenprotokoll ausgegeben. .. ..

Früher habe ich hier zu jQuery gewechselt, aber ich wollte es unbedingt lösen, also habe ich mir diese Suche ausgedacht.

Warum funktioniert jQuery und Vanille nicht?

Es wurde in $ (function () {}); versteckt. (Nicht versteckt.) $ (function () {});` wird abgekürzt und die ursprüngliche Form lautet wie folgt.

application.js


$(document).ready(function {
 //wird bearbeitet
});

Die ready-Methode ist eine Methode, die die interne Verarbeitung ausführt, wenn der HTML-Code vollständig geladen ist. Mit anderen Worten, indem Sie die gesamte js-Verarbeitung in $ (function () {process}); schreiben, können Sie die Verarbeitung ausführen, ohne an irgendetwas zu denken.

In Vanille ist es notwendig, dieses "Warten auf das Laden von HTML" zu schreiben, ohne jQuery zu verwenden.

DOMContentLoaded In Vanilla können Sie durch Angabe von "DOMContentLoaded" im Fall der addEventListener-Methode dasselbe tun wie mit der ready-Methode von jQuery. Der Code lautet wie folgt.

application.js


window.addEventListener('DOMContentLoaded', function() {
  //wird bearbeitet
});

Wie mache ich ein Klick-Event in Vanille?

Schauen wir uns nun den Code an, der die erste jQuery mit Vanille verglichen hat.

application.js


// jQery
$(function() {
  $("Name des Selektors").on('click', function() {
    console.log('Es wurde angeklickt.');
  });
});

Wenn Sie diese jQuery schreiben, ohne sie wegzulassen

application.js


// jQery
$(document).ready(function() {
  $("Name des Selektors").on('klicken', function() {
    console.log('Es wurde angeklickt.');
  });
});

Es wird so sein.

Als nächstes schauen wir uns Vanille an.

application.js


//Vanille
(function() {
  document.getElementById("Name des Selektors").addEventListener('click', function() {
    console.log('Es wurde angeklickt.');
  });
}());

Dies ist eine unmittelbare Funktion, kann aber auch auf diese Weise funktionieren.

Methode 1. Schreiben Sie das Skript-Tag zum Lesen der externen js-Datei am unteren Rand des body-Elements.

Normalerweise wird in Rails das Lade-Tag einer externen JS-Datei häufig in das Head-Tag geschrieben. Wenn Sie jedoch die js-Datei im Kopf lesen, wird die js-Funktion aktiviert, bevor Sie das Element in den Body aufnehmen, sodass ein Fehler auftritt. Es ist also eine Methode, das Lese-Tag der externen js-Datei am Ende des Body-Tags zu schreiben.

erb:application.html.erb


<head>
...
<%#= javascript_include_tag 'application' %>
...
<head>
<body>
...
<%= javascript_include_tag 'application' %>
</body>

Auf diese Weise wird die js-Datei geladen, wenn der Body fertig geladen ist, sodass Sie auch Elemente laden können. Da jedoch alle anderen externen Dateien, Dienste, API-Ladeeinstellungen usw. im head-Tag geschrieben sind, möchte ich das Laden externer js-Dateien im head nach Möglichkeit vereinheitlichen.

Methode 2. Verwenden Sie DOMContentLoaded

Wie bereits erwähnt, wird auf diese Weise das Ereignis DOMContentLoaded der Methode addEventListener verwendet. Es ist erforderlich, nur die js-Datei neu zu schreiben, während das Lese-Tag für die externe js-Datei im Kopf verbleibt.

application.js


//Vanille
window.addEventListener('DOMContentLoaded', function() {
  document.getElementById("Name des Selektors").addEventListener('click', function() {
    console.log('Es wurde angeklickt.');
  });
});

Nachdem der HTML-Code geladen und die Funktion ausgeführt wurde, funktioniert er einwandfrei.

Hinweis

Das DOMContentLoaded-Ereignis wartet übrigens nur darauf, dass der HTML-Code vollständig geladen wird, sodass das Laden von CSS- oder Bilddateien nicht enthalten ist. Wenn Sie einen Image- oder CSS-Vorgang haben, können Sie das Ladeereignis der addEventListener-Methode verwenden, um die Funktion nach Abschluss des Ladevorgangs auszulösen.

Zusammenfassung

Bisher habe ich Ihnen gesagt, wie man in Vanille schreibt, aber ich persönlich denke, dass jQuery verwendet werden kann, solange es mit jQuery kompatibel ist. Ich habe tatsächlich Vanille geschrieben und herausgefunden, wie einfach es ist, mit jQuery zu schreiben ... lol Dies lässt sich aus der Tatsache ableiten, dass es auch standardmäßig in Rails installiert ist.

Wenn Sie Fragen haben, unterschiedliche Interpretationen haben oder wenn Sie der Meinung sind, dass etwas mit der Beschreibungsmethode nicht stimmt, würden wir uns freuen, wenn Sie in den Kommentaren darauf hinweisen könnten.

Vielen Dank für das Lesen bis zum Ende.

Referenzseite

Grund für die Verwendung von Sofortfunktionen in JavaScript [JQuery] $ (function () {...}) "Bedeutung und Zeitpunkt der Ausführung" Unterschied zwischen DOMContentLoaded-Ereignis und Ladeereignis [Timing]

Recommended Posts

JavaScript (Vanille) reagiert in Rails nicht.
Localhost3000 wird in der Docker / Rails-Entwicklung nicht gestartet.
Daten sind nicht in Rails registriert.
[Schienen] Was tun, wenn Schienen nicht reagieren oder nicht anhalten?
[Rails] Video wird nicht mit video_tag abgespielt
[JavaScript] Negative Rundungen stimmen nicht mit Excel überein
Der MySQL-Container startet nicht in Docker
Die SQL-Datei wird nicht in Docker-Compose ausgeführt
Group_by in Rails
[Schienen] In Gerät hinzugefügt: Benutzername nicht zur Datenbank hinzugefügt
@BeforeStep funktioniert nicht mit Spring-Batch-Tasklet
Abhilfe für Befehl nicht in Schienen s gefunden
Der Rails-Code reagiert in Atom Erb nicht gut
Umgang mit Fehlern in Rails s konnte keine JavaScript-Laufzeit finden.
Viele Fehlerzeilen ... Der Rails-Server startet nicht 2. "Autodetect ': JavaScript-Laufzeit konnte nicht gefunden werden."
[Rails] So laden Sie JavaScript in einer bestimmten Ansicht
Hivernate Validator funktioniert nicht in der WAS Liberty-Umgebung
Modellassoziation in Rails
Terminal startet nicht
Deaktivieren Sie Turbolinks in Schienen
^, $ im regulären Ausdruck von Rails
Verwenden Sie Bilder mit Schienen
Migration in Schienen verstehen
Teilen Sie route.rb in Rails6
Markdown in Rails implementiert
[Ruby on Rails] Wenn die ID-Erfassung des Parameters nicht gut lief
[Rails] Mit'id '=: id konnte nicht gefunden werden und die Aktualisierungsaktion wird nicht ausgeführt
[Rails] Das Problem, dass pry-byebug nicht durch den Haltepunkt stoppt
Was zu überprüfen ist, wenn Schienen db: Migration nicht bestanden
[Rails] Behebung des Problems, dass das Sitzungszeitlimit nicht funktioniert
[AWS S3] Die von Ihnen angegebene AWS-Zugriffsschlüssel-ID ist in unserem Datensatzfehler nicht vorhanden. [Rails AWS EC2]