La fenĂȘtre modale que vous attendiez. Ou comment appeler une fenĂȘtre contextuelle Ă  partir de diffĂ©rents boutons sur JS pur

Bon aprĂšs-midi Mon nom est Boris Cherepanov, je dĂ©veloppe des sites Web sur wordpress et bitrix. J'ai travaillĂ© sur le projet ici. L'une des limitations Ă©tait de ne pas utiliser jquery, mais j'ai dĂ» appeler la mĂȘme fenĂȘtre modale Ă  partir de diffĂ©rents boutons. En fait, c'est une tĂąche assez simple, mais j'ai dĂ©cidĂ© d'aller de l'avant et de crĂ©er une fenĂȘtre modale qui serait crĂ©Ă©e au premier clic, enregistrer son Ă©tat, avoir un constructeur Ă  appeler, etc. Et au final, je ne l'ai pas regrettĂ©. J'expliquerai pourquoi plus tard. J'ai «enveloppé» cette fenĂȘtre modale dans une solution clĂ© en main qui peut ĂȘtre utilisĂ©e en permanence.

L'installation


L'installation d'un tel "modal" est simple. TĂ©lĂ©chargez le fichier js et connectez-vous. Il ne dĂ©pend d'aucun Ă©vĂ©nement ou bibliothĂšque, vous pouvez donc vous connecter lĂ  oĂč vous en avez besoin. Voici le lien sur github

Initialisation


Sur la page sur laquelle vous devez appeler, Ă©crivez en js:

new XMC({ bodyID: 'body', backgroundLayerID: 'wrapper', selector: 'data-type', selectorValue: 'openModalForm', btnId: 'mfClose', content: '', classListBg: ['zuzu', 'zaza'], classListBody: ['zuzu', 'zaza2'], classListBtn: ['zuzu', 'zaza3'], styleBg: { top: '0', left:'0', right: '0', bottom: '0', position: 'fixed', background: '#00000090', justifyContent: 'center', alignItems: 'center', zIndex: '6' }, styleBody: { minWidth: '200px', minHeight: '200px', background: '#ffffff', justifyContent: 'center', alignItems: 'center', }, btnStyle: { width: '40px', height: "40px", background: '#ffffff', display: 'flex', justifyContent: 'center', alignItems: 'center', position: 'absolute', top: '5%', right: '5%', cursor: 'pointer' } }); 

En savoir plus sur les éléments d'un objet


Il y a 6 points requis:

  • bodyID est l'identifiant du bloc qui contiendra le contenu de la fenĂȘtre modale
  • backgroundLayerID - identifiant de la couche de gradation
  • selector - attribut html qui sera sur tous les boutons qui provoquera une fenĂȘtre modale
  • selectorValue - valeur du sĂ©lecteur
  • bntID - id du bouton pour fermer la fenĂȘtre modale
  • contenu - texte ou html dans une fenĂȘtre modale

Points facultatifs mais trĂšs importants:

  • classListBg, classListBody, classListBtn - tableaux de classes pour la couche de gradation, la fenĂȘtre principale et le bouton de fermeture, respectivement
  • styleBg, styleBody, btnStyle - objets avec les styles du calque de gradation, de la fenĂȘtre principale et du bouton de fermeture, respectivement

Un peu sur la fenĂȘtre modale elle-mĂȘme


J'ai dĂ©jĂ  dit que la tĂąche principale que rĂ©sout cette fenĂȘtre modale est un appel Ă  partir de plusieurs boutons. Cliquer sur plusieurs boutons pour appeler js est un exemple typique de dĂ©lĂ©gation et dans XMC (comme j'ai appelĂ© ma fenĂȘtre modale), il est implĂ©mentĂ© comme ceci:

 XMC.prototype.delegateClick = function () { var mf = this; window.addEventListener('click', function () { //     ,          if(event.target.hasAttribute(mf.selector) && event.target.getAttribute(mf.selector) === mf.selectorValue ){ mf.show(); //    mf.delegateClose(); //     } }, mf, false); }; 

En conséquence, dans le constructeur, vous devez vous inscrire:

 var XMC = function (object) { /*   */ this.delegateClick(); } 

Soit dit en passant, à un moment donné, un article avec learn javascript m'a aidé à y faire face. Il vous sera utile de vous familiariser avec celui-ci.

AJAX pour la forme


Dans mon «cas», il était nécessaire de charger le formulaire en utilisant ajax (cette tùche est apparue dans le processus). Grùce à mon approche initiale, j'ai réussi à gagner un peu de temps. J'ai développé le prototype.

 XMC.prototype.ajax = function () { var mf = this; var data = new Object(); //  ,    ,    data = JSON.stringify(data); var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if(this.readyState == 4 && this.status == 200){ mf.body.innerHTML = this.responseText; mf.sendClickDelegate(mf.form); mf.i18n(); } }; xhttp.open('POST', localizationPreloader.adminUrl + "?action=my_action", true); xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xhttp.send("data="+data); return this; } 

J'avais un tel code de demande pour CMS Wordpress.

Résumé


En conséquence, grùce à l'approche objet, j'ai réussi à faire non seulement des pop-ups, mais presque une application web dans laquelle j'ai 2 ajax pour recevoir le formulaire et soumettre, traduction spécifique au navigateur, lecture des cookies, chargement de l'animation. Grùce à cela, je n'ai pas eu à chercher de nouveaux éléments par divers sélecteurs pour traduire ou travailler avec les données du formulaire qui sont «arrivées» par ajax.

J'espĂšre que vous trouverez mon article utile. Bonne chance

Source: https://habr.com/ru/post/fr430432/


All Articles