javascriptjquerythisprototype-programming

How to change from document to "this" in javascript


I am trying to wrap my head around prototype in javascript as well as getting used to the value of this. Currently I have this set to .cf--modal but when I use this to set a variable it does not seem to work. As this is my first of many functions I really don't want to hit the document and would rather target "this" within the Modal Toggle function.

How can I change the modal_toggle function so that document.getElementById and document.getElementsByClassname can be replaced with this.find or something along those lines.

$(function(){
   $('.cf--modal').each(function(){
      let cf = new ContactForm($(this));
   });
});

var ContactForm = function(this$obj){
   this.$obj = this$obj;
   this.init();
}

ContactForm.prototype.init = function init(){
    this.modal_toggle();
};

ContactForm.prototype.modal_toggle = function modal_toggle(){
   let cfCTA = document.getElementsByClassName("modal-trigger")[0];
   let cfModal = document.getElementsByClassName("cf--modal")[0];
   let cfModalClose = document.getElementsByClassName("close-cf-modal")[0];
   cfCTA.onclick = function () {
      cfModal.style.display = "block";
   }
   cfModalClose.onclick = function(){
      cfModal.style.display = "none";
   }
}
.cf{
  width:1000px;
  margin:40px auto;
}
.inner-container{
  padding:12px 24px;
  border:1px solid grey;
  border-radius:5px;
  display:flex;
  align-items:center;
  justify-content:center;
}
.cf-block{
  flex:1
}

/* Modal Styling */
.cf--modal{
  width:375px;
  height:200px;
  position:absolute;
  right:36px;
  bottom:0;
  border:1px solid grey;
  display:none;
}
  .close-cf-modal{
    cursor:pointer;
  }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<a href="javascript:void(0)" class="modal-trigger">Contact Us</a>
<section class="cf">
  <div class="cf-container">
      <form>
    <div class="inner-container">
        <div class="cf-block">
          <div class="cf-label">First Name</div>
          
        </div>
        <div class="cf-block">
          <div class="cf-label">Last Name</div>
        </div>
        <div class="cf-block">
          <div class="cf-label">Email</div>
        </div>
        <div class="cf-block">
          <div class="cf-label">Message</div>
        </div>
        <div class="cf-block">
          <div class="cf-label">Submit</div>
        </div>
    </div>
      </form>
  </div>
</section>
<section class="cf--modal">
  <span class="close-cf-modal">close</span> 

</section>


Solution

  • You should use this.$obj to refer to the modal element for the current ContactForm

    ContactForm.prototype.modal_toggle = function modal_toggle() {
      let cfModal = this.$obj;
      let cfCTA = $(".modal-trigger");
      let cfModalClose = cfModal.find(".close-cf-modal");
    
      cfCTA.on("click", function() {
        cfModal.show();
      })
      cfModalClose.on("click", function() {
        cfModal.hide();
      });
    }