Как объявить переменные для нескольких функций - PullRequest
1 голос
/ 05 декабря 2010

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

Ответы [ 3 ]

1 голос
/ 05 декабря 2010

Проблема в том, что переменные (в частности, eml, fnl, lnl) содержат значения, полученные при их объявлении. JS не пересчитывает длину строк или значений элементов каждый раз, когда вызывается ваша функция.

Когда вы перемещаете эти переменные внутри функции, они фактически «пересчитываются» каждый раз, когда вызывается функция.

Я бы оставил переменные, которым назначены элементы DOM, за пределами функций, но переместил переменные, которые получают значения / длины элементов DOM внутри функций. Затем вы можете ссылаться на переменные, содержащие элементы dom.

Например (частичный код):

var na=document.getElementById('nr'),
    ea=document.getElementById('er'),
    em=document.subscribe.email,
    fn=document.subscribe.fname,
    ln=document.subscribe.lname;</p>

<p>function validate_form() {
  var eml=em.value.length,
      fnl=fn.value.length,
      lnl=ln.lname.value.length,
      at=em.value.indexOf("@"),
      per=em.value.lastIndexOf(".");
  // Rest of code.
1 голос
/ 05 декабря 2010

Я действительно понял, как это сделать.Я только что прочитал о глобальных переменных и о том, как объявить их внутри функции.Таким образом, я поместил все переменные обратно в функцию, стер «Var», и теперь она отлично работает.

function validate_form() {
   na=document.getElementById('nr');
   ea=document.getElementById('er');
   em=document.subscribe.email;
   fn=document.subscribe.fname;
   ln=document.subscribe.lname;
   eml=document.subscribe.email.value.length;
   fnl=document.subscribe.fname.value.length;
   lnl=document.subscribe.lname.value.length;
   at=document.subscribe.email.value.indexOf("@");
   per=document.subscribe.email.value.lastIndexOf("."); 
  if((fnl<1 || lnl<1) && !eml<1){
      alert("Please enter your first and last name.")
      if(fnl<1){fn.focus()}else{ln.focus()}
      }
  else if((fnl<1 || lnl<1) && eml<1){
      alert("Please fill in all fields.")
      if(fnl<1){fn.focus()}else{ln.focus()}
      }  
  else if(eml<1 || at<1 || per-at<2 || eml-per<2){
      alert("Please enter a valid email address")
      em.focus()
      }    
  else if (at>1 && per-at>2 && eml-per>2 && fnl>1 && lnl>1){return true}
  vfn(); vln(); vem();
 return false}
0 голосов
/ 05 декабря 2010

Будет лучше, если вы закроете весь этот код внутри события window.onload.или внутри $(function(){ }); в случае jquery.

Я предполагаю, что функция validate_form() будет вызываться при нажатии любой кнопки / гиперссылки.

, например:

var na = null;
var ea = null;
var em = null;
var fn = null;
var ln = null;
var eml = null;
var fnl = null;
var lnl = null;
var at = null;
var per = null;

window.onload = function () {
    na = document.getElementById('nr');
    ea = document.getElementById('er');
    em = document.subscribe.email;
    fn = document.subscribe.fname;
    ln = document.subscribe.lname;
    eml = document.subscribe.email.value.length;
    fnl = document.subscribe.fname.value.length;
    lnl = document.subscribe.lname.value.length;
    at = document.subscribe.email.value.indexOf("@");
    per = document.subscribe.email.value.lastIndexOf(".");
};
...