JavaScript - функция, вызывающая себя, не может видеть функции из внешнего скрипта - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть концептуальная проблема с областями действия в следующем коде.

Код представляет собой простой сценарий проверки на стороне клиента для двух форм.

Я использовал функцию, вызывающую себя, чтобы попробоватькакой-то другой подход, избегая установки всех глобальных переменных, но его поведение мне кажется немного странным.

Я все еще учусь кодировать с помощью JavaScript, и я не эксперт, но эти расширенные функции немногосложный.

Я не хочу использовать jQuery, а только чистый JavaScript для изучения основы.

<!-- 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;

  }

})();

Веб-консоль постоянно говорит мне, что отдельные функции проверки не определены.

Почему?

Они должны быть загружены из внешнего скрипта .. кроме того, они должны иметь глобальную область видимости.

Заранее спасибо:)

1 Ответ

0 голосов
/ 19 сентября 2018

Проблема решена!

Путь к внешнему сценарию был неверным.

Извините за этот мусор!^^ "

...