[RUBY] JavaScript (vanilla) ne répond pas dans Rails.

Rails5 a un gem jQuery installé depuis le début, et il est disponible par défaut sauf si vous le supprimez. Quand j'ai commencé à apprendre Rails, je me suis habitué à utiliser jQuery plutôt que le simple JavaScript (ci-après «vanilla»), donc cette fois j'ai osé trouver un moyen de ne pas utiliser jQuery pour réapprendre la vanille.

environnement

Ruby 2.5.7 Rails 5.2.4

Contexte

Quand j'ai recommencé à écrire du code à la vanille, j'en étais assez accro. Si je pouvais l'écrire dans jQuery, ce serait bien, mais ce n'était pas agréable de le laisser tel quel, alors j'ai décidé de faire face un peu.

La fonction immédiate ne fonctionne pas

J'ai essayé de vérifier le journal de la console avec un événement de clic comme point de départ. Dans jQuery, $ (function () {processing}); comme indiqué ci-dessous Il faut écrire. (La raison sera décrite plus tard.)

application.js


// jQuery
$(function() {
  $("Nom du sélecteur").on('Cliquez sur', function() {
    console.log('Il a été cliqué.');
  });
});

La fonction immédiate de Vanilla sans jQuery s'écrit comme suit.

application.js


//vanille
(function() {
  document.getElementById("Nom du sélecteur").addEventListener('click', function() {
    console.log('Il a été cliqué.');
  });
}());

Les deux codes ci-dessus ont le même traitement, mais la vanille a une erreur pour une raison quelconque et n'est pas sortie dans le journal de la console. .. ..

J'avais l'habitude de passer à jQuery ici, mais je voulais vraiment le résoudre, alors j'ai proposé cette recherche.

Pourquoi jQuery fonctionne-t-il et non vanilla?

Il était caché dans $ (function () {});. (Pas caché.) $ (function () {}); est abrégé, et la forme originale est la suivante.

application.js


$(document).ready(function {
 //En traitement
});

La méthode prête est une méthode dans laquelle le traitement interne est effectué lorsque le chargement du code HTML est terminé. En d'autres termes, en écrivant tout le traitement js dans $ (function () {processing});, vous pouvez effectuer le traitement sans penser à rien.

En vanilla, il faut écrire ceci "en attente de chargement html" sans utiliser jQuery.

DOMContentLoaded Dans la vanille, en spécifiant DOMContentLoaded dans le cas de la méthode addEventListener, vous pouvez faire la même chose que la méthode ready de jQuery, et le code sera comme suit.

application.js


window.addEventListener('DOMContentLoaded', function() {
  //En traitement
});

Comment faire un événement clic à la vanille?

Revenons maintenant au code qui comparait le premier jQuery à vanilla.

application.js


// jQery
$(function() {
  $("Nom du sélecteur").on('click', function() {
    console.log('Il a été cliqué.');
  });
});

Si vous écrivez ce jQuery sans l'omettre

application.js


// jQery
$(document).ready(function() {
  $("Nom du sélecteur").on('Cliquez sur', function() {
    console.log('Il a été cliqué.');
  });
});

Ce sera comme ça.

Ensuite, regardons la vanille.

application.js


//vanille
(function() {
  document.getElementById("Nom du sélecteur").addEventListener('click', function() {
    console.log('Il a été cliqué.');
  });
}());

C'est une fonction immédiate, mais en fait, cela peut également fonctionner de cette manière.

Méthode 1. Écrivez la balise de script pour lire le fichier js externe au bas de l'élément body.

Normalement, dans Rails, la balise de chargement d'un fichier js externe est souvent écrite à l'intérieur de la balise head. Cependant, si vous lisez le fichier js dans la tête, la fonction js sera activée avant de prendre l'élément dans le corps, donc une erreur se produira. Il s'agit donc d'une méthode pour écrire la balise de lecture du fichier js externe à la fin de la balise body.

erb:application.html.erb


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

En faisant cela, le fichier js commencera à se charger lorsque le corps aura terminé le chargement, vous pouvez donc également charger des éléments. Cependant, comme tous les autres fichiers externes, services, paramètres de chargement d'API, etc. sont écrits dans la balise head, je voudrais unifier le chargement des fichiers js externes dans la tête si possible.

Méthode 2. Utilisez DOMContentLoaded

Comme je l'ai mentionné précédemment, voici comment utiliser l'événement DOMContentLoaded de la méthode addEventListener. Il est nécessaire de réécrire uniquement le fichier js en laissant la balise de lecture du fichier externe js dans la tête.

application.js


//vanille
window.addEventListener('DOMContentLoaded', function() {
  document.getElementById("Nom du sélecteur").addEventListener('click', function() {
    console.log('Il a été cliqué.');
  });
});

Maintenant que le HTML est chargé et que la fonction est exécutée, cela fonctionne correctement.

Mise en garde

À propos, l'événement DOMContentLoaded attend seulement que le HTML termine le chargement, il n'inclut donc pas le chargement de fichiers css ou image. Si vous avez une opération image ou css, vous pouvez utiliser l'événement load de la méthode addEventListener pour déclencher la fonction une fois le chargement terminé.

Résumé

Jusqu'à présent, je vous ai dit comment écrire à la vanille, mais je pense personnellement que jQuery peut être utilisé tant qu'il est compatible avec jQuery. En fait, j'ai écrit vanilla et j'ai découvert à quel point il est facile d'écrire avec jQuery ... lol Cela peut être déduit du fait qu'il est également installé en standard dans Rails.

Si vous avez des questions, des différences d'interprétation ou si vous pensez que quelque chose ne va pas avec la méthode de description, nous vous serions reconnaissants de bien vouloir le signaler dans les commentaires.

Merci d'avoir lu jusqu'au bout.

Site de référence

Raison de l'utilisation des fonctions immédiates en JavaScript [JQuery] $ (function () {...}) "signification et calendrier d'exécution" Différence entre l'événement DOMContentLoaded et l'événement de chargement [Timing]

Recommended Posts

JavaScript (vanilla) ne répond pas dans Rails.
Localhost3000 ne démarre pas dans le développement Docker / Rails.
Les données ne sont pas enregistrées dans Rails.
[Rails] Que faire lorsque les rails ne répondent pas ou ne s'arrêtent pas
[Rails] La vidéo n'est pas lue avec video_tag
[JavaScript] L'arrondi négatif ne correspond pas à Excel
Le conteneur MySQL ne démarre pas dans Docker
Le fichier .sql ne s'exécute pas dans docker-compose
Group_by dans Rails
[Rails] Ajouté dans le modèle: nom d'utilisateur non ajouté à la base de données
@BeforeStep ne fonctionne pas avec le Tasklet Spring-batch
Remède à la commande introuvable dans les rails s
le code des rails ne répond pas bien dans atom erb
Comment gérer les erreurs dans Rails? Impossible de trouver un runtime JavaScript.
Beaucoup de lignes d'erreur ... Le serveur Rails ne démarre pas 2. "Détection automatique ': impossible de trouver un moteur d'exécution JavaScript."
[Rails] Comment charger JavaScript dans une vue spécifique
Hivernate Validator ne fonctionne pas dans l'environnement WAS Liberty
Association de modèles dans Rails
Le terminal ne démarre pas
Désactiver les turbolinks dans les rails
^, $ dans l'expression régulière Rails
Utiliser des images avec des rails
Comprendre la migration dans les rails
Diviser routes.rb dans Rails6
Markdown implémenté dans Rails
[Ruby on Rails] Lorsque l'acquisition de l'identifiant du paramètre ne s'est pas bien déroulée
[Rails] Impossible de trouver avec'id '=: id et l'action de mise à jour n'est pas exécutée
[Rails] Le problème que pry-byebug ne s'arrête pas au point d'arrêt
Que vérifier lorsque rails db: la migration ne réussit pas
[Rails] Résolution du problème selon lequel le délai d'expiration de la session ne fonctionne pas
[AWS S3] L'ID de clé d'accès AWS que vous avez fourni n'existe pas dans nos enregistrements. Erreur [Rails AWS EC2]