如果我错了,请纠正我,但是不可能在脚本标记之后声明一个变量,以便可以在整个脚本中使用它吗?我尝试了这个,我的功能就好像它甚至不存在一样。我做错了什么,或者这应该发生。如果它们是完全相同的话,我不想为每个函数重新声明我的所有变量。
对此感到抱歉
<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 :(得分: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.
答案 1 :(得分:1)
我实际上已经想出了如何做到这一点。我刚刚读到了全局变量,以及如何在函数内声明它们。所以我把所有变量都放回到函数中,擦掉了它上面的“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}
答案 2 :(得分: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(".");
};