2010-12-05 16 views
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は、関数内にあるとき、それは完全に正常に動作しますが、彼らはこのようにしているとき、すべての何も起こりません。

+0

コードなしで推測しています。*常に*コードを投稿してください。 –

+0

コードしてください.... –

答えて

1

私は実際にそれを行う方法を考え出しました。私はグローバル変数と関数内でそれらを宣言する方法について読んだだけです。だから私はすべてのvarsを関数の中に戻し、その上に "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

このコードをすべてwindow.onloadイベント内にラップすると良いでしょう。 jqueryの場合は$(function(){ });の内部にあります。

ボタン/ハイパーリンクのクリックで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("."); 
}; 
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.

関連する問題