JavaScript - Self-invoking function can't see functions from external script

131 views Asked by At

I have a conceptual issue about scopes on the following code.

The code is a simple client-side validation script for two forms.

I used a self-invoking function to try a something different approach by avoiding to set all global variables but its behavior seems a bit weird to me.

I am still learning to code with JavaScript and I'm not an expert, but these advanced features are a bit complicated.

I don't want to use jQuery but only pure JavaScript in order to learn the basis.

<!-- Forms handling -->

<script src="validate_functions.js"></script>

<script>

(function main() {

  var frmPrev = document.getElementById('frmPrev');
  var frmCont = document.getElementById('frmCont');

  var btnPrev = frmPrev['btnPrev'];
  var btnCont = frmCont['btnCont'];

  var caller = '';

  var forename = '';
  var surname = '';
  var phone = '';
  var email = '';
  var privacy = '';
  var message = '';

  var infoBox = document.getElementById('info-box');
  var infoBoxClose = infoBox.getElementsByTagName('div')['btnClose'];

  btnPrev.onclick = function(e) {

    submit(e);

  };

  btnCont.onclick = function(e) {

    submit(e);

  };

  function submit(which) {

    caller = which.target.name;

    var errors = '';

    if(caller == 'btnPrev') {

      forename = frmPrev['name'].value.trim();
      surname = frmPrev['surname'].value.trim();
      phone = frmPrev['phone'].value.trim();
      email = frmPrev['email'].value.trim();
      message = frmPrev['message'].value.trim();
      privacy = frmPrev['privacy'].checked;

    }

    if(caller == 'btnCont') {

      phone = frmCont['phone'].value.trim();
      email = frmCont['email'].value.trim();
      message = frmCont['message'].value.trim();

    }

    errors = validateFields(caller, forename, surname, phone, email, privacy, message);

    if(errors == '') {

      var params = 'which=' + caller;
      params += '&fname=' + forename;
      params += '&sname=' + surname;
      params += '&tel=' + phone;
      params += '&email=' + email;
      params += '&priv=' + privacy;
      params += '&mess=' + message;

      var request = asyncRequest();

      request.open('POST', "send-mail.php", true);
      request.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
      request.setRequestHeader('Content-length', params.length);
      request.setRequestHeader('Connection', 'close');

      request.onreadystatechange = function() {

        if(this.readyState == 4) {

          if(this.status == 200) {

            if(this.responseText != null) {

              infoBox.innerHTML = this.responseText;

            } else {

              infoBox.innerHTML = '<p>No data from server!</p>';

            }

          } else {

            infoBox.innerHTML = '<p>Could not connect to server! (error: ' + this.statusText + ' )</p>';

          }

        }

      }

      request.send(params);

    } else {

      infoBox.innerHTML = errors;

    }

    infoBox.style.display = 'block';

  }

  infoBoxClose.onclick = function() {

    infoBox.style.display = 'none';
    infoBox.innerHTML = '';

  };

  function validateFields(_caller, _forename, _surname, _phone, _email, _privacy, _message) {

    var errs = '';

    if(_caller == 'btnPrev') {

      errs += validateForename(_forename);
      errs += validateSurname(_surname);
      errs += validatePhone(_phone);
      errs += validateEmail(_email);
      errs += validateMessage(_message);
      errs += validatePrivacy(_privacy);

    }

    if(_caller == "btnCont") {

      errs += validatePhone(_phone);
      errs += validateEmail(_email);
      errs += validateMessage(_message);

    }

    return errs;

  }

  function asyncRequest() {

    var request;

    try {

      request = new XMLHttpRequest();

    }

    catch(e1) {

      try {

        request = new ActiveXObject('Msxml2.XMLHTTP');

      }

      catch(e2) {

        try {

          request = new ActiveXObject('Microsoft.XMLHTTP');

        }

        catch(e3) {

          request = null;

        }

      }

    }

    return request;

  }

})();

Web console keeps telling me that single validate functions are not defined.

Why?

They should be loaded from the external script.. furthermore they should have a global scope.

Thank you in advance :)

1

There are 1 answers

0
Etraz On BEST ANSWER

Problem solved!

The path to the external script was incorrect.

Sorry for this rubbish! ^^"