PDA

View Full Version : validation plus New Window in onSubmit?


EllenM1
05-13-2003, 11:28 PM
I am trying to get two scripts to function in order inside an onSubmit tag, and am having problems:

I need the form field "NAME" to be validated onSubmit. It is a required field, must be a number and should be exactly 9 digits long. (The script I have below only checks that it is no LONGER than 9 digits, and I would like to change that - but that's another issue.)

If the validation script returns false, everything should stop, and an alert should come up. If it returns true, the new URL denoted by %SESSION.URL% comes up in a new browser window with no menu bar, no button bar, no location bar, but with scrollbars and resize handles.

I suspect this would all work better if the two functions were combined into one script, then called in one fell swoop, but I am not sure how to do this.

In the code shown below, when the validation returns false - the form data submits and the action gets performed, but the second script, the new window does not open. Can anyone tell me what I am doing wrong with this?

Thanks,

Ellen

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script language="JavaScript" type="text/JavaScript">
<!--
function MM_findObj(n, d) { //v4.01
var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_validateForm() { //v4.0
var i,p,q,nm,test,num,min,max,errors='',args=MM_validateForm.arguments;
for (i=0; i<(args.length-2); i+=3) { test=args[i+2]; val=MM_findObj(args[i]);
if (val) { nm=val.name; if ((val=val.value)!="") {
if (test.indexOf('isEmail')!=-1) { p=val.indexOf('@');
if (p<1 || p==(val.length-1)) errors+='- '+nm+' must contain an e-mail address.\n';
} else if (test!='R') { num = parseFloat(val);
if (isNaN(val)) errors+='- '+nm+' must contain a number.\n';
if (test.indexOf('inRange') != -1) { p=test.indexOf(':');
min=test.substring(8,p); max=test.substring(p+1);
if (num<min || max<num) errors+='- '+nm+' must contain a number between '+min+' and '+max+'.\n';
} } } else if (test.charAt(0) == 'R') errors += '- '+nm+' is required.\n'; }
} if (errors) alert('The following error(s) occurred:\n'+errors);
document.MM_returnValue = (errors == '');
}

function MM_openBrWindow(theURL,winName,features) { //v2.0
window.open(theURL,winName,features);
}
//-->
</script>
</head>

<body>
<form action="%SESSION.URL%" method="post" name="login" id="login" onSubmit="MM_validateForm('NAME','','RinRange0:999999999');return document.MM_returnValue;var new_window = window.open('','new_window','toolbar=0,location=0,directories=0,menubar=0,resizable=1,status=1,scrol lbars=1'); if (JS_11) {if (new_window != null) new_window.focus();} TARGET="new_window" _ELSE %TARGET%">
<input name="NAME" type="text" id="NAME" value="">
<input type="submit" name="Submit" value="Submit">
</form>
</body>
</html>

cheesebagpipe
05-14-2003, 02:11 AM
I usually avoid MindMuddling_functions, but, I'll take a whack at it:

var new_window = null;

function openFormWin() {
new_window = window. open('','new_window','resizable,status,scrollbars');
if (new_window && !new_window.closed) new_window.focus();
return true;
}

<form.......target="new_window" onsubmit="MM_validateForm('NAME','','RinRange0:999999999');if(document.MM_returnValue)return openFormWin();else return false;">

This:

....return document.MM_returnValue;....

...will terminate the onsubmit handler, whether the value is true or false (it's unconditional). Nothing you put after it will ever be executed.

EllenM1
05-14-2003, 05:42 PM
Thank you - it works great!

I had thought that "return document.MM_returnValue" was a sort of true-false thing which would stop execution or not stop it depending on the value returned. My knowledge of javascript is pretty basic - just what I pick up haphazardly!

I have one more question for anyone that cares to answer: could the "MindMuddling" validation script shown in my first post below be modified to require exactly 9 digits?

cheesebagpipe
05-14-2003, 06:39 PM
Boy, hadn't noticed all that code was for one field. :p

<script language="JavaScript" type="text/JavaScript">
<!--

function checkfield(oInput) {
var v = oInput.value;
if (!/^\s*\d{9}\s*$/.test(v)) { //9 digits, LH/RH whitespace allowed
alert('Please enter your nine-digit login name.');
oInput.focus();
oInput.select();
return false;
}
return true;
}

//-->
</script>
</head>
<body>
<form..... onSubmit="return(checkfield(NAME)&&openFormWin())">
<input name="NAME" type="text" id="NAME" value="">
<input type="submit" name="Submit" value="Submit">
</form>
</body>
</html>

EllenM1
05-14-2003, 08:10 PM
:o
your code sure is shorter than my code, and it works a whole lot better. I'm not even going to tell you how much work I already did just to narrow it down to what it was in the first post. This code is for a login page for an .asp application - and the authors simply told us that it could not be modified without breaking it. However, the fact that it did not validate was causing us endless toil in correcting entries!

Thank you ever so much for saving me a whole lot of further time and effort! I really appreciate it.

Ellen




http://thedesignspace.net:)