1

間違っている場合は訂正してください。ただし、スクリプトタグの直後に変数を宣言して、そのスクリプト全体で使用できるようにすることはできませんか?私はこれを試しましたが、私の機能はそこにさえないかのように機能しています。私は何か間違ったことをしましたか、それともこれが起こるはずです。それらがまったく同じものである場合、各関数のすべての変数を再宣言する必要はありません。

申し訳ありません

<script>
  var na=document.getElementById('nr');
  var ea=document.getElementById('er');
  var em=document.subscribe.email;
  var fn=document.subscribe.fname;
  var ln=document.subscribe.lname;
  var eml=document.subscribe.email.value.length;
  var fnl=document.subscribe.fname.value.length;
  var lnl=document.subscribe.lname.value.length;
  var at=document.subscribe.email.value.indexOf("@");
  var per=document.subscribe.email.value.lastIndexOf("."); 

function validate_form() {
  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}

varsが関数内にある場合は完全に正常に機能しますが、このような場合は何も起こりません。

4

3 に答える 3

1

問題は、変数(特に、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;

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.

于 2010-12-05T09:42:36.443 に答える
1

私は実際にそれを行う方法を理解しました。グローバル変数と、関数内でそれらを宣言する方法について読みました。そこで、すべての変数を関数内に戻し、その上の「変数」を消去すると、完全に機能するようになりました。

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}
于 2010-12-05T09:49:00.607 に答える
0

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(".");
};
于 2010-12-05T09:42:16.207 に答える